L’articolo illustra la realizzazione di un cronometro, utilizzando il microcontrollore Pic. Pratica e didattica per lavorare al meglio con il compilatore mikroBASIC PRO.
Quando i microcontrollori non erano così alla portata di mano, anche per via dei relativi costi elevati, la costruzione di un cronometro o di un orologio era un'impresa davvero complicata. Occorreva infatti l’adozione di contatori, clock, divisori, sommatori e altri dispositivi digitali, con cui si ottenevano prototipi molto grandi. Come se non bastasse, anche la precisione non era delle migliori, e si doveva agire su componenti discreti ed analogici per “ritoccare”. manualmente l’accuratezza delle misure.
Oggi per fortuna non è così, e se da un lato ogni tanto la nostalgia delle vecchie realizzazioni si fa sentire, dall’altro la moderna tecnologia ci aiuta a realizzare circuiti poco ingombranti e molto precisi.
Il cronometro a 4 vie
Il progetto che ci accingiamo a descrivere in queste pagine espone la realizzazione di un cronometro a 4 vie. Si tratta in pratica di ben quattro cronometri implementati nello stesso dispositivo. Ogni cronometro è indipendente dall’altro e può essere avviato, fermato e azzerato. La precisione di conteggio è molto elevata, a patto di usare un quarzo da 20 Mhz.
Elenco componenti
- R1-R12 = 10 kOhm, 1/4 W
- C1-C2 = 22 pF
- U1 = PIC 16F877A
- LCD2 = display LM044L 4 righe e 20 colonne
- RESET1-RESET4 = pulsanti n/a
- START1-START4 = pulsanti n/a
- STOP1-STOP4 = pulsanti n/a
- RV1 = potenziometro lineare 10 kOhm
Caratteristiche tecniche ed operative nel cronometro
Di seguito riportiamo le caratteristiche salienti del dispositivo:
- Presenza di 4 cronometri indipendenti;
- Possibilità di Start, Stop e Reset per ogni cronometro;
- Alta precisione di conteggio;
- Grande display Lcd a 4 righe;
- 4 Pulsanti di Start;
- 4 Pulsanti di Stop;
- 4 Pulsanti di Reset;
- Risoluzione di 1 secondo;
- Formato del timer: hh:mm:ss;
- Limite conteggio: 99 ore, 59 minuti e 59 secondi.
Utilizzi pratici
Possedere un cronometro contatempo formato da 4 timer indipendenti è indubbiamente un fatto molto comodo. Per di più se lo strumento è realizzato in casa, la soddisfazione è ancora maggiore. Il cronometro a 4 vie può essere utilizzato in diverse situazioni, laddove cioè sia necessario misurare il trascorrere del tempo, esteso a quattro diversi eventi e temporalmente distanti. Molto spesso infatti è necessario prendere il tempo di un evento, ma contemporaneamente si deve misurare il tempo di un secondo evento, e così via. Lo spunto della realizzazione del prototipo in questione è nato in cucina. In diversi momenti, infatti, esisteva l’esigenza di misurare il tempo di cottura di 4 diverse pietanze per uno stresso pranzo (uovo, zampone, patate in pentola a pressione e brasato) con diverso tempo iniziale di cottura. Sarebbero stati necessari ben quattro orologi o cronometri. Col dispositivo in questione, invece, il problema è stato brillantemente risolto. Ecco alcuni settori nei quali l’uso del presente cronometro potrebbe risultare molto produttivo:
- In cucina, per tenere il tempo di 4 cotture diverse;
- Durante le gare sportive a medio e lungo termine;
- Nei giochi di società, cacce al tesoro e altri;
- Per applicazioni statistiche e di conteggio eventi (esempio: conteggio di automobili che transitano in 2 ore e, separatamente, conteggio di motociclette che transitano in 3 ore);
- A scuola, per cronometrare il tempo di risposta dei test e, contemporaneamente, il tempo di altri questionari;
E molti altri esempi che la fantasia suggerisce.
Schema elettrico
Lo schema elettrico è abbastanza semplice ed intuitivo (vedi figura 1). Il cuore del circuito è formato dal noto microcontrollore Pic 16F877 della Microchip. Esso è coadiuvato dai due condensatori C1 e C2 da 22pF e dal quarzo da 20 Mhz. Tale rete è utilizzata per produrre il segnale di clock del micro. Il display Lcd è particolare, in quanto è capace di visualizzare i dati su ben 4 righe e 20 colonne. Il protocollo di comunicazione è comunque lo stesso rispetto ad altri display con codifica Hitachi. La PORT-B del Pic è destinata alla comunicazione con il display LCD. Ecco in dettaglio i piedini del display con i rispettivi collegamenti:
- Vss: a massa;
- Vdd: al +5V dell’alimentazione;
- Vee: al partitore resistivo per permetterne la regolazione del contrasto;
- RS: al piedino RB4 del Pic;
- RW: a massa;
- E: al piedino RB5 del Pic;
- D0: a massa;
- D1: a massa;
- D2: a massa;
- D3: a massa;
- D4: al piedino RB0 del Pic;
- D5: al piedino RB1 del Pic;
- D6: al piedino RB2 del Pic;
- D7: al piedino RB3 del Pic.
La PORT-C (composta da 8 porte) è collegata a otto pulsanti n/a che comandano lo Start e lo Stop dei quattro cronometri. A riposo, lo stato logico delle porte è “basso”, per via delle resistenze di pull-down collegate direttamente a massa. Alla pressione dei rispettivi tasti, lo stato logico commuta ad “alto” poiché esse vengono collegate direttamente a VCC. Pertanto l’intera PORT-C ha funzione di ingresso. La PORT-D (o almeno i suoi primi quattro bit meno significativi) ha anche funzione di ingresso ed è comandata da quattro pulsanti che determinano l’azzeramento (Reset) dei cronometri. Una pressione imposta il conteggio a “00:00:00”. L’intero prototipo è alimentato con una tensione stabilizzata di 5V.
Il display a 4 righe
Il display utilizzato (vedi figura 2 e figura 3) deve disporre di uno spazio sufficiente per ospitare tante informazioni. Il modello prescelto è un display LCD capace di visualizzare i dati in 4 righe e 20 colonne, il famoso LM044L. Può essere anche utilizzato un modello compatibile. La sua codifica Hitachi permette il collegamento standard con molte periferiche ed è gestito perfettamente dal mikroBASIC PRO. Di seguito sono riportate alcune caratteristiche del display:
- 20 caratteri x 4 linee;
- Controller HD44780 presente;
- Alimentazione singola di 5V;
- Effettiva area di visualizzazione: 76x25 mm.
Per maggiori informazione si rimanda la lettura ai datasheet ufficiali.
Il PIC 16F877
Il microcontrollore utilizzato è il noto 16F877 (figura 4 e figura 5). È stato utilizzato questo micro poiché il progetto necessita di molte por- te di I/O. In più, la vasta memoria lo rende versatile e adatto a qualsiasi tipo di progetto.
Il compilatore
Come per molti altri progetti pubblicati in precedenza in questa rivista, il compilatore utilizzato è il mikroBASIC PRO. Maturo ed affidabile, esso offre un grande ambiente si sviluppo, soprattutto per ciò che concerne la varietà di librerie messe a disposizione e il controllo dei programmi tramite debugger.
Listato
Esaminiamo adesso il listato sorgente, scritto in Basic tramite l’ambiente di sviluppo mikroBASIC PRO. Dopo le dichiarazioni iniziali delle porte (figura 6) per il display e delle variabili utilizzate, si passa alla definizione della procedura “visualizza()”. Essa ha 2 compiti molto importanti: 1) quello di discriminare le decine ed unità delle ore, minuti e secondi al fine di agevolare la visualizzazione; 2) quello di mostrare sul display i dati, sottoforma di stringhe (figura 7). Quindi, inizia il programma vero e proprio, con l’identificazione della label “main:”. La definizione della funzionalità delle porte, nonché l’azzeramento delle stesse è il primo passo obbligatorio. Successivamente si passa alla prima visualizzazione delle stringhe fisse sul display (“Timer A”, “Timer B”, ecc). Poi vengono azzerate le variabili relative alle ore, minuti e secondi dei quattro cronometri (O1, M1, S1, O2, M2, S2, ecc). Viene anche impostato a 0 l’incremento dei secondi, che pertanto restano “bloccati” e fermi all’inizio. Il cuore del programma è costituito dal un ciclo “while” senza fine. In esso avviene la visualizzazione vera e propria sul display, ad opera della relativa procedura. Si passa quindi al controllo del superamento del limite da parte dei valori temporali, come segue:
- Se i secondi arrivano a 60, vengono azzerati e, contestualmente, vengono incrementati i minuti;
- Se i minuti arrivano a 60, vengono azzerati e, contestualmente, vengono incrementate le ore;
- Se le ore arrivano a 100, vengono azzerate.
Si passa infine al controllo dei tasti premuti. Se i tasti “Start” sono pressati, la variabile inc1 (o inc2, inc3, inc4) è impostata a 1 e può così avvenire l’incremento dei se condi. In altre parole, il cronometro va avanti. Viceversa, se i tasti “Stop” sono pressati, la variabile inc1 (o inc2, inc3, inc4) è impostata a 0 e non può avvenire l’avanzamento dei secondi. In altre parole, il cronometro è fermo. Infine, se i tasti “Reset” sono pressati, le variabili relative al conteggio del tempo (O1, M1, S1, O2, M2, S2, ecc) sono impostate a 0 e il cronometro viene azzerato. Occorre notare il fatto che, per mantenere sempre la stessa precisione e la stessa cadenza di conteggio, i quattro cronometri sono sempre visulizzati, anche se sono fermi. Ciò consente di ottenere un ottimo grado di precisione.
program cronometro rem CRONOMETRO rem by Giovanni Di Maria rem Lcd module connections dim LCD_RS as sbit at RB4_bit LCD_EN as sbit at RB5_bit LCD_D4 as sbit at RB0_bit LCD_D5 as sbit at RB1_bit LCD_D6 as sbit at RB2_bit LCD_D7 as sbit at RB3_bit LCD_RS_Direction as sbit at TRISB4_bit LCD_EN_Direction as sbit at TRISB5_bit LCD_D4_Direction as sbit at TRISB0_bit LCD_D5_Direction as sbit at TRISB1_bit LCD_D6_Direction as sbit at TRISB2_bit LCD_D7_Direction as sbit at TRISB3_bit rem End Lcd module connections dim k as word dim txt as string[8] dim O1,M1,S1 as byte dim O2,M2,S2 as byte dim O3,M3,S3 as byte dim O4,M4,S4 as byte dim inc1,inc2,inc3,inc4 as byte sub procedure visualizza(dim riga,o,m,s as byte) dim od,ou,md,mu,sd,su as byte od = o / 10 ‘ Calcola Decine Ore ou = o mod 10 ‘ Calcola Unita’ Ore md = m / 10 ‘ Calcola Decine Minuti mu = m mod 10 ‘ Calcola Unita’ Minuti sd = s / 10 ‘ Calcola Decine Secondi su = s mod 10 ‘ Calcola Unita’ Secondi txt[0]=od+48 txt[1]=ou+48 txt[2]=”:” txt[3]=md+48 txt[4]=mu+48 txt[5]=”:” txt[6]=sd+48 txt[7]=su+48 Lcd_Out(riga,13,txt) end sub main: TRISB = 0 TRISC = 255 TRISD = 15 PORTB = 0 PORTC = 0 PORTD = 0 Lcd_Init() Lcd_Cmd(_LCD_CLEAR) Lcd_Cmd(_LCD_CURSOR_OFF) Lcd_Out(1,1,”Timer A”) Lcd_Out(2,1,”Timer B”) Lcd_Out(3,1,”Timer C”) Lcd_Out(4,1,”Timer D”) O1=0 M1=0 S1=0 O2=0 M2=0 S2=0 O3=0 M3=0 S3=0 O4=0 M4=0 S4=0 inc1 = 0 inc2 = 0 inc3 = 0 inc4 = 0 while true visualizza(1,O1,M1,S1) visualizza(2,O2,M2,S2) visualizza(3,O3,M3,S3) visualizza(4,O4,M4,S4) rem ——Controlla gli Overflow del Cronometro 1——- S1 = S1 + inc1 if S1=60 then S1=0 M1=M1+1 end if if M1=60 then M1=0 O1=O1+1 end if if O1=100 then O1=0 end if rem ——Controlla gli Overflow del Cronometro 2——- S2 = S2 + inc2 if S2=60 then S2=0 M2=M2+1 end if if M2=60 then M2=0 O2=O2+1 end if if O2=100 then O2=0 end if rem ——Controlla gli Overflow del Cronometro 3——- S3 = S3 + inc3 if S3=60 then S3=0 M3=M3+1 end if if M3=60 then M3=0 O3=O3+1 end if if O3=100 then O3=0 end if rem ——Controlla gli Overflow del Cronometro 4——- S4 = S4 + inc4 if S4=60 then S4=0 M4=M4+1 end if if M4=60 then M4=0 O4=O4+1 end if if O4=100 then O4=0 end if rem —Controlla i tasti, START, STOP, RESET— —- for k=1 to 966 delay_ms(1) rem —————-START——————- if portc.0=1 then inc1 = 1 end if if portc.2=1 then inc2 = 1 end if if portc.4=1 then inc3 = 1 end if f portc.6=1 then inc4 = 1 end if rem —————-STOP——————- if portc.1=1 then inc1 = 0 end if if portc.3=1 then inc2 = 0 end if if portc.5=1 then inc3 = 0 end if if portc.7=1 then inc4 = 0 end if rem —————-RESET——————- if portd.0=1 then O1=0 M1=0 S1=0 end if if portd.1=1 then O2=0 M2=0 S2=0 end if if portd.2=1 then O3=0 M3=0 S3=0 end if if portd.3=1 then O4=0 M4=0 S4=0 end if next k wend end.
Listato 1 |
Possibili miglioramenti
Il progetto è perfettamente funzionante (vedi ricostruzione in 3D in figura 8). Per chi si volesse cimentare in alcune modifiche, soprattuto a scopo didattico, ecco comunque qualche utile suggerimento:
- Possibilità di conteggiare anche i centesimi di secondo, secondo il formato: “mm:ss:cc”;
- Diminuzione del numero dei pulsanti, in modo che un solo pulsante possa servire ad avviare, fermare ed azzerare i contatori;
- Aggiunta di un ulteriore pulsante “Reset All” che possa azzerare tutti i cronometri, in un sol colpo;
- Aggiunta di un ulteriore pulsante “Stop All” che possa fermare tutti i cronometri, in un sol colpo.
Conclusioni
Un progetto indubbiamente utile, quando si ha a che fare con la misura del tempo. Si raccomanda l’adozione di un quarzo da 20 Mhz, pena la perdita di precisione dello strumento. Buon lavoro.
Grazie per questo articolo; il progetto si presta a tantissime applicazioni e senza dubbio lo prenderò in considerazione sia in cucina avendo una moglie brava sui fornelli, ma ‘maldestra’ col timer; sia con i figli per cronometrare i giri di pista delle automobiline. In quest’ultimo caso mi viene in mente uno start&stop fatto con magnete e contatto reed o con sensore induttivo al passaggio dell’automobilina: dovrei modificare lo start e lo stop del progetto utilizzando un unico pulsante; oltre al tempo che trascorre, farei visualizzare anche il tempo dell’ultimo giro (considerando solo secondi e centesimi). Oppure per allenamento con automobilina radiocomandata, potrei pensare ad una barriera infrarossi come start&stop e visualizzare per ogni riga del display il numero del giro (attuale e i 3 precedenti) e il tempo impiegato (o il miglior giro).
Ciao a tutti, è un bel progetto, da subito ho pensato in grande , mi chiedevo se c’è la possibilita di duplicare o quadruplicare il circuito per poi collegare il tutto ad un display più grande e avere la possibilità di controllare il tempo di piu persone ad esempio atleti in una squadra di atletica o altro che si sta allenando o gareggiando, io ad esempio utilizzerei il circuito cosi com’è anche in ambito chimico dove si potrebbe misurare il tempo di reazione di alcune prove chimiche, o addirittura per misurare il tempo e poi fare la media di prodotti che passano su un nastro trasportatore per aiutare una stampante a stampare ad esempio il lotto sempre allo stesso punto.
Come citato all’inizio dell’articolo, in un periodo in cui per avere un cronometro è sufficiente scegliere la relativa applicazione sul telefono, è bello rivedere un articolo che mi fa tornare indietro nel tempo.
L’utilizzo di un microcontrollore programmato in BASIC era da tanto tempo che non lo vedevo.
Può essere certamente un esempio per i più giovani che si avvicinano all’elettronica per “vedere” il dietro le quinte di un circuito.
Certamente per tutti è più semplice utilizzare per esempio un Arduino, collegare un modulo RTC, una tastiera e utilizzando uno dei vari sketch già disponibili avere un cronometro.
Ma l’orgoglio di vedere funzionare un circuito montato magari su una basetta millefori con un intrigo di fili, con ore passate a ricompilare il programma magari per piccoli errori di sintassi, non ha eguali.
Davvero un bell’esempio di come la programmazione dei microcontrollori possa portare a sviluppare dei progettini molto interessanti. Anche io non vedevo un listato BASIC da non so quanto tempo.
Analizzando il listato stesso però mi sono sorte un paio di domande:
1) come mai il ciclo FOR che campiona i ritardi è dimensionato proprio fino a 966? (se esiste una ragione)
2) come mai i valori testuali, che poi determinano ciò che viene visualizzato a display, vengono incrementati di 48?
Grazie
Alessandro
Ottimo questo progetto, anche xké come ha fatto notare l’amico Adriano, mi porta indietro nel tempo di quando usavo il prestigioso basic su i vecchi PC, ancora con 8086, (se non ricordo male).
credo mi darò da fare per metterlo in essere, anche per rispolverare l’uso del basic. Ovviante questo basic è po’ diverso poiché specifico per Pic. ho trovato e scaricato l’istruzione in PDF del mikrobasic Pro. Grazie a questo progetto mi divertirò apportando qualche modifica, poiché dispongo già del Pic 16F676 quindi adeguerò il progetto a questo Pic. Ringrazio la redazione che grazie a questo progetto, ho trovato uno spunto per divertirmi un po’! saluti.
Troppo forte, un cronometro a 4 vie con una manciata di componenti! Però il mikroBASIC PRO è a pagamento, visto che siamo nell’ambito dell’open source, perché non presentare il listato in assembly o in C, così da poterlo scrivere con il programma gratuito messo a disposizione di tutti dalla microchip? In questo modo questo bellissimo progetto sarebbe alla portata di tutti, e non solo da chi possiede il programma a pagamento, inoltre programmare i microcontrollori in assembly è molto più semplice e intuitivo di quanto si pensi, e il programma gira a velocità molto più alta di qualsiasi altro linguaggio. Comunque complimenti per il progetto presentato.
Grazie
saluti a tutti
Bravo! Grazie mi hai aperto la mente, xké diventare matti per un programma a pagamento quando lo si può fare in assembler, oltretutto io trovo molto divertente farlo, questa modalità di programmazione ti fa entrare nel cuore del processore o controllore che sia, ti permette di manipolare la CPU come ti pare. Ci farei un pensierino 🙂
Infatti, io ho notato che per programmare i pic è più semplice farlo in assemby che in c. Il programma si complica quando si devono fare i calcoli, ma ne vale la pena smanettarci un po’, perché non ci sono limitazioni, si può implementare qualsiasi algoritmo, basta lavorare con la fantasia, e poi manipolare gli ingressi e le uscite è molto intuitivo, inoltre si acquista in velocità di esecuzione del pic. Ci proverò anch’io a realizzare questo bellissimo progetto in assembly, che alla fine risulterà molto utile in tante situazioni, potendolo realizzare in un piccolo contenitore e quindi averlo sempre a portata di mano. Ma c’è un’altro problema con il mikroBasic, gira solo su windows, chi ha un sistema operativo linux, come me, non può usarlo, invece il programma offerto dalla micrichip gira anche su sistemi linux.
grazie per il complimento.
Giustissimo, infatti io che lavoro con Apple su Mac, peggio che andare di notte.
Invece lavorando in assembler, la Microchip, ha fatto anche la versione che gira su Mac, volendo c’è anche in “C”, ma come abbiamo detto, conviene lavorare in assembler, che si guadagna in velocità di esecuzione programma, che si traduce anche in minor utilizzo della memoria poiché risulta più compatto. Detto questo non c’è fretta che metterci all’opera saluti.