Cronometro Segnatempo

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.

Figura 1: schema elettrico.

Figura 1: schema elettrico.

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.
Figura 2: il display LCD LM044L.

Figura 2: il display LCD LM044L.

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.

Figura 3: il display in funzione.

Figura 3: il display in funzione.

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.

Figura 4: pinout del Pic 16F877.

Figura 4: pinout del Pic 16F877.

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.

Figura 5: il Pic 16F877.

Figura 5: il Pic 16F877.

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.

Figura 6: funzione delle porte di I/O del 16F877.

Figura 6: funzione delle porte di I/O del 16F877.

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.

Figura 7: la stringa di caratteri txt[8].

Figura 7: la stringa di caratteri txt[8].

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.
Figura 8: ricostruzione 3D del prototipo.

Figura 8: ricostruzione 3D del prototipo.

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.

Scarica subito una copia gratis

9 Commenti

  1. ZOPDAR ZOPDAR 27 Gennaio 2020
  2. santelectronic santelectronic 28 Gennaio 2020
  3. Adriano Gandolfo Adriano Gandolfo 28 Gennaio 2020
  4. Alessandro Alessandro 31 Gennaio 2020
  5. giulioelettronica giulioelettronica 31 Gennaio 2020
  6. Tony21 Tony21 5 Febbraio 2020
    • giulioelettronica giulioelettronica 5 Febbraio 2020
      • Tony21 Tony21 5 Febbraio 2020
  7. giulioelettronica giulioelettronica 8 Febbraio 2020

Scrivi un commento

Seguici anche sul tuo Social Network preferito!

Send this to a friend