Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

11
voti

Timer h-m-s con PIC [1] - Il Progetto

Ecco un nuovo progettino che ho sviluppato negli ultimi giorni, un timer programmabile da 0 a 99 ore con l'impostazione di ore, minuti e secondi.

L'idea viene da uno sfortunato incidente con dei caricabatterie per degli elettroutensili; in pratica misi a caricare il mio avvitatore una sera in garage e me ne ricordai solo una settimana dopo... Essendo un utensile abbastanza "cinese", la batteria era andata al creatore, da qui l'idea di costruire un fido aiutante che si ricordasse al posto mio di staccare ciò che lascio in carica. Ovviamente le applicazioni sono molteplici, quindi il timer comanderà un relè con contatti NA e NC, quindi a questo si può collegare tutto ciò che si vuole. Passiamo a capire i punti salienti del progetto!

Indice

Scandire Il Tempo

La prima cosa che viene in mente progettando qualcosa che ha a che fare con il tempo, è proprio come fare a scandirlo; si va del sistema più "buzzurro" quale quello di mettere nel codice un delay a 1 secondo, al più raffinato che consiste nell'usare un RTC esterno (oppure interno se il micro lo possiede). La mia scelta è ricaduta su una soluzione intermedia che sfrutta il TIMER1 e un quarzo esterno. Se guardiamo i pin 11 e 12 del pic che ho scelto, cioè un 18F2520([1]), vediamo che riportano le due scritte T1OSO e T1OSI, in pratica su quei due pin è possibile inserire un oscillatore, allo stesso modo del clock di sistema, che servirà come clock per l'incremento del registro di conteggio del TIMER1.

pic pin.png

pic pin.png

Il TIMER1 genera un'interruzione ogni qualvolta il suo registro di conteggio va in overflow, cioè quando è pieno, ed essendo un registro a 16 bit (sarebbe meglio dire 2 registri a 8bit), ha bisogno di 216 fronti in salita del clock per scatenare un'interruzione. Se abbiamo capito il funzionamento, capiamo che servirà un clock per il TIMER1 di 216Hz, cioè 65536Hz, quarzi di questo tipo esistono, ma sono abbastanza rari, per questo userò un quarzo da 32768Hz, cioè 215Hz. I più scaltri con le potenze di 2, avranno già capito che in questo modo otterrei un interrupt per overflow del TIMER1 solo ogni 2 sec. e questo non è esattamente ciò che vogliamo...
La soluzione è semplice, basta precaricare, cioè inserire un valore iniziale, nel registro del TIMER1 ogni volta che questo va in overflow.
Siccome con il quarzo scelto dopo un secondo otterrei un valore di 215, devo precaricare il valore di 215, che sommati danno:

215 + 215 = 216

Cioè il valore massimo che il registro può contenere.
Per dirla tutta il registro del TIMER1 è suddiviso in due registri da 8 bit ciascuno, TMR1H e TMR1L, rispettivamente la parte più significativa e quella meno significativa.
Quindi se devo precaricare 215, divido il numero in due parti per sapere che valori devo inserire in ognuno.

215 = [100000000000000]2 = [8000]16

Quindi:

TMR1H = 0x80

TMR1L = 0x00

Perfetto, sappiamo come fare a scandire il tempo, però potrebbe sorgere un dubbio. "Chi ci avvisa che il TIMER1 abbia finito di contare e sia andato in overflow?". La soluzione di controllare all'infinito il valore del contatore è da escludere, altrimenti ricadremmo nella soluzione "buzzurra" al problema; la cosa è semplice: esistono le interruzioni, una manna dal cielo per qualsiasi sistema informatico (anche se il poveretto che le dovrà gestire scrivendo gli opportuni interrupt handler potrebbe non pensarla allo stesso modo!), i ferrati in materia sanno già di cosa sto parlando, quindi possono passare al successivo paragrafo, per gli altri spiego brevemente cosa sono.
Un'interruzione in pratica focalizza l'attenzione del processore, in questo caso del microcontrollore, su un frammento di codice che non fa parte della normale esecuzione del programma e che verrà eseguito solo per gestire un'interruzione, indipendentemente da ciò che il programma principale stesse facendo, questo permette di rispondere a un certo evento solo se accade senza che sia necessario andare a controllare continuamente se questo sia accaduto.
Per esempio, pensiamo che montare una libreria (magari dell'IKEA!) sia il mio programma principale, lo squillo del telefono sia l'interrupt e il rispondere al telefono l'interrupt handler.
Mentre monto la libreria non devo controllare continuamente se qualcuno mi sta chiamando, perchè ci penserà lo squillo del telefono ad avvisarmi e a focalizzare la mia attensione su quell'evento, quando questo squilla passerò dal programma principale all'interrupt handler per rispondere al telefono, una volta gestita l'interruzione potrò riprendere a montare la libreria dal punto in cui l'avevo lasciata.
In definitiva sarà l'evento di overflow del TIMER1 a scatenare un interrupt, e con un opportuno interrupt handler andrò a incrementare le variabili che mi gestiscono il tempo trascorso.
Per abilitare l'interrupt sul TIMER1 dobbiamo settare:

PIE1bits.TMR1IE = 1

Gestire i Display 7 Segmenti

Ho intenzione di usare due display 7 segmenti per visualizzare il tempo da impostare e il conto alla rovescia, per questo mi servono almeno due display, per un totale di 14 LED da pilotare senza contare il punto decimale. Ad essere sincero, usare 14 pin per pilotare solo dei display è un certo spreco, per questo potremmo adottare una tecnica che complica leggermente lo schema, ma che permette di comandare molti più display con molti meno PIN, per l'esattezza: 8 + ndisplay PIN. In pratica con gli stessi 14 PIN di prima potremmo comandare potenzialmente 6 display, ma a me ne bastano due, quindi userò 10 PIN.
La tecnica è semplice e si basa sul fenomeno della permanenza retinica su cui si basano anche i video. In pratica sopra una certa velocità di cambiamento dell'immagine, l'occhio non si accorge della differenza e l'immagine permane sulla retina anche se effettivamente non è più la stessa, per questo se accendiamo i due display alternativamente non ci accorgiamo della cosa e ci sembreranno entrambi accesi.
Basterà che associamo, al momento in cui accendiamo un certo display, il dato che dovrà visualizzare sulla porta che alimenta i segmenti dei display (che dovranno essere messi a comune), gestendo tutto dal codice, così il gioco è fatto.

Lo schema

Bando alle ciance ecco lo schema del timer.

Vediamo che i due display sono collegati a massa con un transistor comandato a sua volta dai pin RC5 e RC6 del PIC, con il quale si opera la tecnica del multiplexing.

  • Sul PIN RC7 troviamo il comando del relè attraverso un transistor di adeguata potenza (io ho usato un BC337).
  • Sui PIN RC3 e RC2 sono collegati due led che indicheranno se il numero visualizzato si riferisce alle ore (led superiore) ai minuti (led inferiore) o ai secondi (entrambi i led accesi).
  • Sul PIN RC4 è collegato un'ulteriore LED giallo, che segue il comportamento del PIN RC7 e che notifica quando il countdown è in esecuzione.
  • Sui PIN da RB0 a RB3 sono presenti quattro pulsanti per impostare il timer, per semplificare il progetto ho fatto uso delle resistenze di pull-up interne al PIC che si trovano sulla PORTB.

Infine da notare che non ho specificato il collegamento dei pin della PORTA con gli anodi del segmenti del display, questo perché il loro collegamento dipenderà dalle esigenze del montaggio e il programma è facilmente modificabile per adattarlo a ogni configurazione.

Il Primo Prototipo

Ecco il primo prototipo del timer, su cui ho sviluppato la prima bozza del firmware e su cui ho risolto i primi problemi, la configurazione di collegamento dei pin su questo prototipo è diversa dallo schema perché si riferisce al vecchio schema, lo schema proposto sopra è la versione definitiva che risolve alcuni problemi di accavallamento delle piste.

Primo Prototipo con Countdown Attivo

Primo Prototipo con Countdown Attivo

Primo Prototipo

Primo Prototipo

Si vede sulla parte in basso a sinistra della millefori, che è presente un semplice stadio di alimentazione, un raddrizzatore con 4 diodi 1N4007, un condensatore elettrolitico da 470uF (ma nella versione finale è più piccolo), un 7805 per ottenere i 5V e due condensatori di filtraggio.
In questo prototipo il relè è alimentato con i 5V dello stabilizzatore, ma gli si può fornire tranquillamente anche un tensione superiore e svincolata dal 7805.

Indice

  1. Timer h-m-s con PIC [1] - Il Progetto
  2. Timer h-m-s con PIC [2] - Il Programma
0

Commenti e note

Inserisci un commento

Inserisci un commento

Per inserire commenti è necessario iscriversi ad ElectroYou. Se sei già iscritto, effettua il login.