Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
+ Mikrobasic® programming
I/O CPU
Memoria
All’interno del microcontroller sono presenti altri tipi di memoria di cui alcuni
sono fondamentali per l’esecuzione del programma.
Clock
Il clock che serve per fare evolvere lo stato della macchina nonche
sincronizzare i vari dispositivi, è dato da un oscillatore che può essere esterno
(RC o un quarzo) oppure in alcuni microcontrollers è presente all’interno.
Dato che un PIC può lavorare con diverse frequenze (nell’ordine delle decine di
Mhz) è possibile selezionare e configurare l’oscillatore utilizzato settando i bit di
particolari zone di memoria che prendono il nome di flag.
Registri
Porte di comunicazione
Coem già acennato nell’introduzioen un pic può interagire con una gran varietà
di dispositivi esterni e per questo presenta dei piedini di I/O.
Ogni bit di tale registro corrisponde al valore logico presente sul pin del
microcontroller.
Come si vede dalla figura i pin di una porta sono sia di input che di output, ma
non possono essere usati in entrambe le modalità contemporaneamente, si
potrebbe infatti verificare un cortocircuito quando in ingresso è presente un
valore di tensione basso e si scrive un valore di tensione alto.
Tale registro che nei microcontrollers AVR prende il nome di Data Direction
Register, nei microcontrollers PIC prende il nome di TRISx dove x indica
sempre la porta a cui si riferisce ed ogni bit indica il singolo pin di tale porta.
Per questo è possibile che un pin del microcontroller abbia più funzioni,
selezionabili impostando i flag di configurazione e cioè andando a scrivere i
registri di cui si è parlato prima.
Progetti
Dati
Il firmware memorizzato nella memoria programma, ha la necessità di lavorare
con dei dati che si trovano nella memoria codice.
Poiché l’utilizzo di indentificatori separati per la gfestione dei dati nons empre è
conveniente, può essere utile l’utilizzo di gruppi di variabili che prendono il
nome di array.
Array:
Esempio scorretto:
Per accedere ad una cella basterà porre l’indice tra parentesi [], ad esempio
per memorizzare nella prima temperatura il valore 20:
temperature[0]= 20
NomeArray[indice] = ValoreDaMettereNellaCellaIdentificataDallIndice
(il primo indice valido è quello che indica la cella prima cella e vale 0 come in
C, l’ultimo disponibile indicherà l’ultima cella e corrisponderà a N-1 poiché
inizia da 0)
….
Infatti le varie variabili sono memorizzate in maniera contigua sulla RAM del
microcontroller e quindi prima ci sarà una cella che conterrà il valore di indice,
poi 20 celle che corrispondono alle 20 celle dell’array temperature, e poi la
nostra variabile X che ora scopriamo cos’è.
Gli array risultano molto comodi nella loro gestione con i cicli, ma la loro
dimensione fissa spreca spesso molta memoria, cosa che viene risolta con le
strutture dinamiche.
Records (strutture):
structure Studente
dim matricola as integer
...
dim classe as string[2]
end structure
Una volta dichiarata una struttura possono essere dimensionate delle variabili
che rappresentano una o più strutture ralmente esistenti sulla RAM , ad
esempio il miglioreStudente
Gi array vengono quindi sostituiti dalle LISTE che sono una sequenza di
strutture formate dal campo che memorizza unc erto valore, e il campo che
contiene l’indirizzo in memoria della cella successiva, in gergo informatico il
puntatore alla cella successiva.
Al termine della lista, l’ultima cella punterà all’indirizzo NULL che indica che lòa
lista è finita.
Oviamente siccome le celle sono prese dove c’è spazio sulla memoria RAM non
sono contigue e se si perde un puntatore non si può più ritrovare il resto della
lista.
Nonostante tuttwe queste belle cose, nelle varie architetture chi si occupa della
gestione della memoria è il SISTEMA OPERATIVO, e quindi le strutture
dinamiche sono solo parzialmente gestite da mikrobasic, il quale fornisce la
possibilità di dichiarare una variabile di tipo puntatore, ma non consente
l’allocazione e la deallocazione dinamica sulla memoria.
Per accederci
puntatore^ = valore
Allo stesso modo però sono state utilizzate espressioni del tipo
Senza analizzare nello specifico cosa fosse per mikrobasic il simbolo “=”
Operatori:
Un OPERATORE è un costrutto della programmazione ad alto livello che
consente di eseguire delle operazioni con e su i dati.
Beh non ha senso scrivere x+y come costrutto da solo.. il risultato (che sia la
somma piuttosto che la differenza o la moltiplicazione non ha importanza)
dev’essere assegnato a qualcosa, o comunque utilizzato in un contesto
dim x as byte
dim y as byte
dim risultato as byte
…
risultato = x+y
ecco che quì la parola restituisce assume senso; x+y restituisce la somma, cioè
il valore da assegnare a risultato.
Negazione aritmetica:
Esempio:
Risultato=((a+b)*c)-4
dim a as byte
dim b as byte
a = 0 ‘ in binario a= 00000000
b = NOT a ‘ NOT a restituisce Not(00000000) = 111111111 = 255
Nel caso di word composte da n bit, per ogni bit restituisce 1 se il bit iesimo del
primo dato è 1 e così anche per l’iesimo bit del secondo dato.
OR (1 se almeno un bit = 1)
XOR (0 se i bit sono uguali, 1 se i bit sono diversi)
Operatori di confronto
Del tutto simili sono gli operatori >=, <, <=, = (uguaglianza), <> (diversità)
Il microcontroller come detto nella prima parte di questo tutorial, integra al suo
interno un microprocessore che è capace di eseguire operazioni basilari su
delle locazioni di memoria. Come prima cosa quindi per verificare se una cella
di memoria è maggiore di un'altra, occorrerà copiarla in un registro, in amniera
tale da poter accederci più velocemente.
Identica cosa per l’operatore < con la differenza che viene restituito il flag di
segno non negato.
Due numeri sono uguali se la loro differenza vale 0, viene quindi restituito il
flag di Zero.
Ad esempio
Per leggere da una pin di I/O impostato come input, si ricordi che basta
utilizzare i registri di comunicazione, che in mikrobasic sono accessibili come
una qualsiasi variabile.
Esempio:
dim v as byte
….
TRISB = 255 ‘ scrive in TRISB 11111111 (PORTB usata come input)
….
V=PORTB ‘ legge il contenuto del registro di comunicazione in v
IF (CONDIZIONE) THEN
Istruzioni da compiere se la condizione è vera
ELSE
Istruzioni da compiere se la condizione è falsa
END IF
Dato che il progetto mi sembra utile a livello didattico anche per spiegare
l’iterazione ho deciso di descrivere il circuito.
Dobbiamo realizzare una board che fornisce sugli o pin di PORTB in ingresso 0
(0v) oppure 1 (5V) in base ad una combinazione inseribile dall’utente.