Skip to content


Il nudo metallo

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

Posted in Nudo metallo.


One Response

Stay in touch with the conversation, subscribe to the RSS feed for comments on this post.

  1. ALEX says

    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???