Era da tanto che non programmavo microcontrollori. Un PIC16F84 per l'esattezza. Gli appassionati di elettronica lo conosceranno sicuramente. Per tutti gli altri: si tratta di un processore, uno di quei componenti che eseguono i programmi nei vostri computer. La differenza sostanziale sta nel fatto che memoria e periferiche sono tutte integrate in un unico componente di silicio: 2K di memoria programma, 64 byte di RAM, un timer, un DAC e una manciata di I/O. Ah, dimenticavo la cosa più interessante: il processore lavora a 4 Mhz (circa 4000 volte piu' lento di un processore Pentium di fascia media considerato che per eseguire alcuni comandi ha bisogno di più cicli di clock).
Quando programmo questo tipo di microcontrollori mi stupisco sempre di una cosa: la velocità impressionante di esecuzione…
So cosa state pensando: "Impressionante?! 4 Mhz?!?", ma so anche che non state considerando un fatto fondamentale e cioè che non esiste un sistema operativo. Quindi zero chiamate di sistema, zero driver, c'è solo ed unicamente l'hardware che viene pilotato direttamente dal codice che scriviamo noi bit per bit con delle temporizzazioni strettissime.
Collegando un pulsante ad una porta di input posso leggere il suo stato (premuto o non premuto) alla velocità mostruosa di 4 Mhz. Tradotto in parole povere potrei leggere il pulsante almeno 400.000 volte in un secondo. Si potrebbero contare i "rimbalzi" che la lamella meccanica fai sui contatti quando lo schiacchio!
Se volessi monitorare un evento in Real-Time (cioè mantendo i tempi di risposta al di sotto di un limite temporale) potrei farlo. E potrei farlo realizzando un sistema real-time vero, perchè non accadrà mai che un kernel decida proprio in quel momento che è il caso di fare swapping della ram su disco o chissà quale altra diavoleria, dato che non c'è un kernel!
Il progetto su cui sto lavorando è un cronometro un po' particolare (in realtà me lo ha commissionato mio padre che ha realizzato anche la board che vedete in fotografia). Molto presto pubblicherò tutti i dettali hardware e software. Non è nulla di particolarmente innovativo, però secondo me didatticamente è molto valido. In più c'è una parte del software che serve a comandare il componente siglato MAX7219 che permette di controllare la visualizzazione su 8 display numerici.
Vi lascio con un piccolo estratto del codice assembly che ho scritto:
MAX7219_CLOCK MACRO
NOP ; HACK: hardware doesn't support
NOP ; high frequency on that line
NOP
NOP
NOP
NOP
NOP
BSF PORTA, MAX7219_CLK
BCF PORTA, MAX7219_CLK
ENDM
; Send a commando to MAX7219
; Arguments: MAXADDR, MAXDATA
; —————————
MAX7219_SEND_
BCF INTCON, GIE
MAX7219_CS_ON
MOVFWF MAX7219_ADDR, MAXSHREG
CALL MAXLOAD
MOVFWF MAX7219_DATA, MAXSHREG
CALL MAXLOAD
MAX7219_CS_OFF
BSF INTCON, GIE
RETURN
; Send the byte contained in MAXSHREG
; ———————————–
MAXLOAD
MOVLWF 08, COUNT_1
MAXLOAD1
RLF MAXSHREG, 1
BC MAXLOAD11
MAX7219_DIN_RESET
GOTO MAXLOAD2
MAXLOAD11
MAX7219_DIN_SET
MAXLOAD2
MAX7219_CLOCK
DECF COUNT_1, 1
BNZ MAXLOAD1
RLF MAXSHREG, 1
RETURN
ciao,
sono interessato al tuo progetto , vorrei assemblare un cronometro da utilizzare suL mio kart per i tempi in pista visto che cronometri in commercio passano le 200 euro!!!
saresti cosi gentile da passarmi lo schema elettrico e il programmino per far funzionare il tutto a casa ho un PIC16F84 una eeprom e il programmatore.
se non chiedo troppo saresti disposto a modificare il tuo progetto visto che non ci capisco niente di programmazione (tutto quello che so fare e’ scaricare il .hex
nel pic) per renderlo perfetto per il mio scopo???