Sei sulla pagina 1di 39

Microcontrollori

Logica booleana e istruzioni


condizionali
Istruzioni condizionali
Eseguono una sequenza prefissata di istruzioni
SOLO SE una data condizione logica è verificata.

La sintassi del comando IF è la seguente:

IF [Condizione] THEN
[Istruzioni]
ENDIF
Condizioni logiche
Le condizioni logiche possono restituire solo
valore VERO o FALSO.

Un ingresso elettrico viene considerato VERO (1)


se la tensione presente sul morsetto è di 5V;
viene considerato FALSO (0) se la tensione sul
morsetto è di 0V.
I valori intermedi vengono «approssimati» al
valore logico più vicino.
L’istruzione IF
Ad esempio il seguente codice accende un led se
l’interruttore collegato con il pin4 è chiuso
(condizione logica VERA).
DO
IF IN4=1 THEN
HIGH 8 ‘ accendo il led verde
ENDIF
LOOP

Se la condizione logica è falsa, le istruzioni


comprese tra THEN e ENDIF vengono ignorate.
L’istruzione IF…ELSE
L’istruzione ELSE permette di eseguire istruzioni
particolari nel caso in cui la condizione testata
da IF non sia verificata:
DO
IF IN4=1 THEN
HIGH 8 ‘ accendo il led verde
ELSE
HIGH 7 ‘ accendo il led rosso
ENDIF
LOOP
L’istruzione IF…ELSEIF…ELSE
DO
IF (IN4=1) THEN
HIGH 8 ‘ accendo il led verde
ELSEIF (IN4=0) THEN
HIGH 7 ‘ accendo il led rosso
ELSE
LOW 8
LOW 7
ENDIF
LOOP
L’indentazione
DO (Esegui fino a che non incontri LOOP

ISTRUZIONE DEBUG

IF IN4 = 1 THEN

ISTRUZIONI DA ESEGUIRE SE LA CONDIZIONE


TESTATA DA IF E’ VERIFICATA

ELSE

ISTRUZIONI DA ESEGUIRE SE LA
CONDIZIONE TESTATA DA IF NON E’
VERIFICATA

ENDIF

LOOP
I connettivi logici
Molto spesso è necessario testare più di una
condizione alla volta.
Ad esempio, potrebbe essere necessario attivare
un motore quando un sensore si attiva oppure
quando viene attivato un comando manuale.
O ancora:
Il motore potrebbe essere attivato su comando
manuale ma solo se il sensore di finecorsa non è
attivo.
Connettivi logici
Seppure in italiano usiamo dei connettivi che
possono essere fraintesi (o può a volte essere
scambiato con e, se può essere confuso con solo
se, ecc.).
Quando implementiamo un software è
necessario che il microprocessore interpreti alla
lettera ciò che noi vogliamo che venga eseguito.
Esiste una famiglia di connettivi logici il cui
comportamento è univocamente definito.
Connettivi logici
I connettivi logici sono:
AND
OR
NOT
NAND
NOR
EXOR
AND
Il connettivo logico AND riceve 2 o più ingressi e
restituisce un valore di VERITA’ (livello logico 1)
solo quando TUTTI gli ingressi sono VERI.

Utilizzo questo connettivo quando occorre


controllare che tutte le condizioni siano vere
contemporaneamente.
AND – Tabella di verità
INGRESSO 1 INGRESSO 2 USCITA

VERO VERO VERO


VERO FALSO FALSO
FALSO VERO FALSO
FALSO FALSO FALSO
IF + AND
Un esempio di codice è il seguente:

DO
IF (IN4=1) AND (IN5=0) THEN
HIGH 8 ‘ accendo il led verde
ELSE
HIGH 7 ‘ accendo il led rosso
ENDIF
LOOP
OR
Il connettivo logico OR riceve 2 o più ingressi e
restituisce un valore di VERITA’ (livello logico 1)
se ALMENO UNO degli ingressi è VERO.

Utilizzo questo connettivo quando occorre


controllare che almeno una condizione sia
verificata.
OR – Tabella di verità

INGRESSO 1 INGRESSO 2 USCITA

VERO VERO VERO


VERO FALSO VERO
FALSO VERO VERO
FALSO FALSO FALSO
OR + AND
Un esempio di codice è:

DO
IF (IN4=1) OR (IN5=0) THEN
HIGH 8 ‘ accendo il led verde
ELSE
HIGH 7 ‘ accendo il led rosso
ENDIF
LOOP
VARIABILI
Le variabili sono celle di memoria (RAM) che
contengono valori utili durante l’esecuzione del
programma.
Ad esempio nel ciclo FOR…NEXT
La variabile i permette di tenere il conto del numero di
cicli che sono già stati effettuati.

DO
FOR i=0 TO 10
NEXT
LOOP
TIPI DI VARIABILI
Il Basic Stamp utilizza 3 tipi di variabili:
• Bit
• Byte
• Word

Queste differiscono tra loro nel numero di bit a


disposizione per memorizzare il dato.
TIPI DI VARIABILI
BIT (2 valori)
1

BYTE (256 valori)


1 0 0 1 0 1 1 1

WORD (65536 valori)


1 0 0 1 0 1 1 1 1 0 0 1 0 1 1 1
DICHIARAZIONE delle VARIABILI
All’inizio del codice, prima dell’inizio del ciclo
DO…LOOP è necessario dichiarare le variabili
utilizzate nel resto del programma.

[nomevariabile] VAR BYTE

Un superamento del valore massimo che può


essere gestito da un variabile porta ad un errore
di OVERFLOW.
ASSEGNAZIONE DI UN VALORE AD
UNA VARIABILE
Durante l’esecuzione di un programma, è
possibile assegnare un valore ad una variabile
attraverso la sintassi: variabile=valore
acceso VAR BIT

IF (IN4=1) THEN
acceso=1
ELSE
acceso=0
ENDIF
INIZIALIZZAZIONE DI UNA
VARIABILE
Si chiama inizializzazione di una variabile
l’attribuzione di un valore alla variabile PRIMA
che inizi l’esecuzione del programma (quindi
prima del ciclo DO LOOP).
Questo evita che il programma inizi a “girare”
con alcune variabili contenenti valori inattesi.
Operazioni sulle variabili
Il valore di una variabile può essere modificato
attraverso operazioni matematiche. Ad esempio
una variabile può essere incrementata con la
sintassi: variabile=variabile+1
VAR Contatore Byte
Contatore=0

IF (IN4=1) THEN
Contatore=Contatore+1
VARIABILI come CONDIZIONI
LOGICHE
Qualsiasi variabile può essere utilizzata,
all’interno di un’istruzione condizionale, come
una condizione logica. Ad esempio:
VAR numero WORD

IF (numero>132) THEN
[Istruzioni]
ENDIF
La variabile tempo
Per aspettare una certa quantità di tempo
utilizzo in comando PAUSE([ms]).
Mentre il processore sta eseguendo il comando
PAUSE, nessun altro comando può essere
eseguito.

Nella prossima slide viene mostrato un esempio


da evitare:
La variabile tempo
VAR tempo WORD
VAR i BYTE
DO
IF IN4=1 THEN
HIGH8 ‘ accendo il led verde
ENDIF
FOR i=1 TO 10
HIGH7
PAUSE (500)
LOW7
PAUSE(500)
NEXT
LOOP
Misurare il tempo
E’ possibile misurare il tempo?
Ad esempio misurare per quanto tempo un
interruttore viene tenuto premuto?
Misurare il tempo
Contatore VAR WORD
Contatore=0
DO
IF (IN4=1) THEN
Contatore=Contatore+1;
IF (Contatore>30000) THEN
DEBUG ”Eseguiti 30000 cicli”
ENDIF
ENDIF
LOOP
Misurare il tempo
Contatore VAR WORD
Contatore=0
DO
IF (IN4=1) AND (Contatore<30000) THEN
Contatore=Contatore+1
ELSE IF (IN4=1) AND (Contatore>=30000) THEN
DEBUG ”Eseguiti 30000 cicli”
Contatore=0
ELSE
Contatore=0
ENDIF
LOOP
Collegamenti elettrici
Collegamento di un led (promemoria)
Collegare un ingresso digitale
I problemi elettrici degli ingressi
La transizione tra livelli logici, nella pratica, non
è per nulla pulita:
Antirimbalzo
L’antirimbalzo è una
soluzione hardware
oppure software che
permette di
minimizzare i problemi
nei salti tra un livello
logico e l’altro.
Antirimbalzo SW
Tra le diverse tecniche che possono essere
adottate, una tra le più semplici è la seguente:
“Si accetta un cambiamento logico su un
ingresso solo se questo permane per più di x
millisecondi”.

N.B. L’antirimbalzo appesantisce il codice e il


carico di lavoro del microcontrollore.
ESERCITAZIONE 2_01
Collegare un interruttore ad un ingresso e
un’uscita ad un led.

Il led deve accendersi quando l’interruttore è


chiuso, deve spegnersi quando l’interruttore è
aperto.

Variante: inserire un’istruzione debug che


visualizzi su PC lo stato dell’interruttore.
ESERCITAZIONE 2_02
Collegare un interruttore ad un ingresso e
un’uscita ad un led.

Il led deve accendersi quando l’ingresso rimane


chiuso per almeno 5 secondi
ESERCITAZIONE 2_03
Collegare un interruttore ad un ingresso e
un’uscita ad un led.

Il led deve accendersi quando l’ingresso rimane


chiuso per almeno 5 secondi ma soltanto al
rilascio del pulsante.
ESERCITAZIONE 2_04
Collegare un interruttore ad un ingresso e 2
uscite a 2 led (uno rosso ed un verde).

Se l’interruttore è aperto i led devono


lampeggiare alternandosi alla frequenza di 2
Hz (circa).
Se l’interruttore è chiuso, per i primi 5 secondi
deve essere acceso fisso il led rosso e spento il
verde, dopodichè si accende fisso il verde e si
spegne il rosso.
ESERCITAZIONE 2_05 (autovelox)
Collegare 2 interruttori a 2 ingressi e 2 uscite a 2
led (uno rosso ed un verde).

Il programma misura il tempo tra l’attivazione di


un ingresso e l’attivazione del successivo.
Supponendo che i due ingresso siano posti a
50cm di distanza l’uno dall’altro, si calcola la
velocità del mezzo che deve comparire a video
attraverso una istruzione di debug
Si deve accendere il led verde se la velocità è