In tutti i corsi per apprendere a programmare, il primo argomento svolto è:

Come far lampeggiare dei led collegati ad una porta di uscita

Faremo questo in tanti modi diversi, più o meno complicati.

  • Ogni programma in Basic inizia con alcune istruzioni da inserire sempre:

    Device 16F84 ‘ scelta del tipo di PIC

    Xtal= 4 ‘ scelta di un quarzo da 4MHz

Ogni istruzione può essere commentata. Il commento è separato dal programma col carattere . Si possono inserire righe intere di commento, sempre precedute dal simbolo

  • Poi vengono inserite le istruzioni sui registri e le porte di IN/OUT
  • Poi inizia il vero e proprio programma.

Le istruzioni vengono evidenziate sul video con diversi colori dal Proton+.

' programma leduno.bas

' accende e spegne un singolo led sulla porta B

Device 16F628A ‘ scelta del PIC

XTAL 4 ‘ quarzo da 4 MHz

TRISB=%00000000 ‘ porta B tutti pin di uscita

PORTB =0 ‘ azzeramento porta B

ripeti: ‘ etichetta, inizio del programma

PORTB =8 ‘ è posto High solo il pin PortB.3

DelayMS 1000 ‘ attesa di 1 secondo

PORTB =0 ‘ sono posti Low tutti i pin della PortB

DelayMS 1000 ‘ attesa di 1 secondo

GoTo ripeti ‘ si salta all’etichetta iniziale

 

Il programma è eseguito indefinitamente ( è in loop )

Se si usa la versione LITE del software PROTON+, è consentita una sola istruzione per linea. Se si usa la versione intera, è possibile scrivere più istruzioni separate dal carattere : nella stessa linea

' programma leduno.bas

' accende e spegne un singolo led sulla porta B

Device 16F628A

XTAL 4

TRISB=%00000000 : PORTB =0

ripeti:

PORTB =8: DelayMS 1000: PORTB =0: DelayMS 1000

GoTo ripeti

Uso di nomi simbolici per le variabili di programma:

l’istruzione SYMBOL attribuisce un nome simbolico ai pin 0 e 7 della Porta B, in modo da poter usare questi nomi nel programma.

Si fa così per poter usare delle denominazioni comode o più significative.

' programma leddue.bas

' accende e spegne due led sulla porta B

' ledrosso sul pin 0 della Porta B

' ledverde sul pin 7 della Porta B

Device 16F628A

XTAL 4

TRISB=%00000000: PORTB=0

Symbol ledrosso=PORTB.0

Symbol ledverde=PORTB.7

vai:

ledrosso=1: ledverde=0: DelayMS 2000

ledrosso=0: ledverde=1: DelayMS 1000

Goto vai

Varianti:

Invece di ledrosso=1 si può scrivere: High ledrosso

Per invertire lo stato di un led si può usare il comando Toggle: Toggle ledrosso

Nel programma seguente, la stessa sequenza di accensione è ripetuta 5 volte. Per poter usare la variabile x, occorre dichiarare di che dimensioni è:

se si dichiara come Byte significa che può assumere valori tra 0 e 255.

Dimensioni di uso comune:

Bit: 0 oppure 1

Byte: da 0 a 255 ( 2^8 valori)

Word: da 0 a 65535 ( 2^16 valori).

' programma ledtre.bas

' accende e spegne un led sul pin 1 della porta B per cinque volte

' con l'uso del ciclo for...next

Device 16F628A

XTAL 4

TRISB=%00000000 : PORTB =0

Symbol led=PORTB.1

Dim x As Byte ‘ dichiarazione variabile

vai:

For x=0 To 4

led = 1: DelayMS 200

led = 0: DelayMS 200

Next x

DelayMS 2000

GoTo vai

"Spostamento" di un led.

' programma ledquattro.bas

' accende in modo sequenziale un unico led sulla Porta B

Device 16F628A

XTAL 4

TRISB=%00000000 : PORTB =0

gira:

PORTB=1: DelayMS 1000

PORTB=2: DelayMS 1000

PORTB=4: DelayMS 1000

PORTB=8: DelayMS 1000

PORTB=16: DelayMS 1000

PORTB=32: DelayMS 1000

PORTB=64: DelayMS 1000

PORTB=128: DelayMS 1000

GoTo gira

 

Nella porta B viene scritto un valore pari alla potenza crescente di due: si vede un unico led acceso che "si sposta" da un pin al successivo.

Questa soluzione è banale perché ripetitiva. Le soluzioni seguenti sono più efficienti.

Tra le operazioni matematiche possibili con questo compilatore Basic, vi è lo SHIFT LEFT ( spostamento a sinistra dei bit di un valore ) indicato formalmente col simbolo <<. Con questo comando si ottiene lo scorrimento del led acceso.

Per introdurre un altro tipo di ciclo condizionato, si usa il While... Wend

Non tutti i compilatori però dispongono di comandi matematici particolari.

' programma ledquattro1.bas

' scorrimento di un led con comando proprietario

Device = 16F628A

XTAL = 4

Dim I As Byte

Symbol LED = PORTB

TRISB=%00000000

PORTB =0

While 9=9 ‘ finchè è vera l’uguaglianza,cioè sempre

LED = 1

DelayMS 1000

For I = 1 To 7

LED = LED << 1 ‘ scorrimento

DelayMS 1000

Next

Wend ' ripeti

Dato che la moltiplicazione per 2 ottiene lo stesso risultato del comando SHIFT, si usa questo semplice calcolo e si visualizza sul PortB Monitor lo spostamento del led acceso.

Naturalmente tutti i compilatori compiono tutte le operazioni matematiche semplici, perciò si può fare a meno di comandi dedicati.

' programma ledquattro2.bas

' scorrimento di un led con calcolo semplice

Device = 16F628A

XTAL = 4

Dim I As Byte

Symbol LED = PORTB

TRISB=%00000000 : PORTB =0

LED = 1 ' primo LED on

DelayMS 1000

For I = 1 To 7

LED = LED*2 ' spostamento

DelayMS 500

Next

Nell’esempio seguente si fa uso di uno strumento potente: la tabella di LOOKUP.

Consiste in un elenco di valori memorizzati, selezionabili in base ad una variabile indice.

' programma ledcinque.bas

' accende in modo sequenziale un solo led sulla Porta B

' facendo uso di una tabella di valori

Device 16F628A

XTAL 4

TRISB=%00000000 : PORTB =0

Dim passo As Byte

Dim valore As Byte

For passo = 0 To 7

valore = LookUp passo, [1,2,4,8,16,32,64,128]

PORTB = valore

DelayMS 500

Next passo

 

Nell’esempio, la tabella di LOOKUP contiene 8 valori, selezionati in base alla variabile passo.

Cioè se passo = 0, allora la variabile valore vale 1 ; se passo = 7 allora valore = 128.

Il numero assunto dalla variabile valore viene scritto via via nella PORTA B, accendendo un led alla volta.

Tutte le variabili che appaiono nel programma, devono essere dichiarate col comando DIM..

In base alla dichiarazione BYTE, questa tabella di lookup può contenere fino a 256 numeri, ognuno compreso tra 0 e 255.

In questo ultimo esempio, programma ledsei.bas, usando due tabelle di LookUp, una contenente i valori da scrivere nella Porta B, e una contenente i ritardi, è possibile creare una sequenza qualsiasi in cui i led, o i carichi, sono attivati da soli o insieme, a piacere, per un tempo a piacere.

Nelle due tabelle, se la variabile pas vale 0, allora la variabile vai vale 129 e la variabile attendi vale 2000, e così via.

Il valore assunto dalla variabile vai viene scritto nella PORTA B, accendendo uno o più led alla volta. Il valore assunto dalla variabile attendi determina il tempo di ritardo.

Tutte le variabili che appaiono nel programma, devono essere dichiarate col comando DIM.

'programma ledsei.bas

Device = 16F628A

XTAL = 4

TRISB=%00000000 : PORTB =0

Dim pas As Byte ' definizione della variabile pas

Dim vai As Byte

Dim attendi As Word

For pas = 0 To 7

vai= LookUp pas,[129,0,8,0,16,0,24,0]

attendi= LookUpL pas,[2000,1000,500,1000,500,1000,3000,2000]

PORTB =vai

DelayMS attendi

Next pas

Dato che la variabile attendi supera 255, deve essere dichiarata come WORD, e si deve usare il comando LookUpL al posto di LookUp.

(Prima parte)