Temporizzatore digitale basato sul circuito atmega8. Timer da cucina su ATmega8

Temporizzatore digitale basato sul circuito atmega8. Timer da cucina su ATmega8

27.10.2023


Un semplice timer da cucina che può proteggere la tua cucina dal fumo eccessivo. Un regalo ideale per l'8 marzo.
Il timer consente di impostare l'ora da 1 a 99 minuti, il conto alla rovescia si avvia automaticamente, 3 secondi dopo l'impostazione.

Schema del dispositivo:

La base del dispositivo è un microcontrollore ATMega8 con un quarzo esterno da 16 MHz. Per l'alimentazione del dispositivo viene utilizzato il connettore Zas, che viene alimentato con una tensione costante di 7-15V. La tensione di alimentazione di 5V è fornita dallo stabilizzatore lineare L7805; se si utilizza una fonte stabilizzata di 4,5 - 5V, come un caricatore mobile, allora lo stabilizzatore, C3 e C4 possono essere esclusi.
Il cicalino B1 e gli anodi del display W1 sono controllati dai transistor T1 - T5. I resistori R9 - R16 sono necessari per limitare la corrente che scorre attraverso i segmenti del display. Ai connettori Prog e R(reset) si collega un programmatore, al connettore Sw si collega una tastiera o dei pulsanti. Ci sono solo 5 pulsanti, quattro dei quali sono responsabili dell'impostazione dell'ora (+1, +5, +10 e +20 minuti, rispettivamente) e uno del ripristino del timer.

Scheda a circuito stampato:


Elenco dei componenti:

U1 ATmega8A-AU 1pz
Stabilizzatore lineare U2 LM7805CT 1pz
Transistor bipolare T1-T5 BC556 5 pz
C1, C2 Condensatore ceramico 22 pF 2 pz
C3 Condensatore elettrolitico 100 uF 1 pz.
C4 Condensatore elettrolitico 47 uF 1 pezzo
R1-R8, R17, R18 Resistore 3,3 kOhm 10 pz
Resistore R9-R16 330 Ohm 8 pz
Indicatore W1 a sette segmenti AF-05643FG-B (o con piedinatura simile) 1 pz.
B1 Cicalino con generatore 1 pz
X1 Cristallo di quarzo 16 MHz 1pz

Foto del dispositivo finito:


Diamo un'occhiata a come creare un timer con le tue mani sul microcontrollore ATmega8, sebbene il codice sia abbastanza facile da adattare per AVR MK di altre serie. Un timer elettronico è un dispositivo necessario in tutte le aree in cui è necessario eseguire determinate azioni dopo un determinato periodo di tempo.

Il controllo del timer è composto da soli quattro pulsanti:

— aumentare il valore del numero;

— diminuendo il valore del numero;

— avvio del timer;

— ripristino del timer.

Un generatore di frequenze audio con un altoparlante viene utilizzato come indicatore del funzionamento del timer. Il generatore verrà avviato utilizzando l'interruttore a transistor Q5, che a sua volta viene aperto da un potenziale positivo proveniente dalla porta PC2 del microcontrollore.

Semplificato, il timer funziona come segue. Utilizzare i pulsanti “+” e “-” per impostare il numero di secondi richiesto; Il pulsante “start” avvia il timer. Quando il timer conta alla rovescia fino a zero, sul pin PC2 del microcontrollore ATmega8 apparirà un potenziale elevato, che aprirà Q5. Successivamente, l'interruttore a transistor avvierà il generatore e si sentirà un suono nell'altoparlante. Il timer viene resettato premendo il pulsante “reset”. Il generatore di audiofrequenze è assemblato su due transistor Q6 e Q7 di diverse strutture di semiconduttori. Il principio di funzionamento e la descrizione del circuito di tali generatori si possono trovare cliccando su.

Algoritmo di funzionamento del timer su un microcontrollore

Il nostro timer effettuerà il conto alla rovescia esattamente di un secondo alla volta, anche se è possibile impostare qualsiasi altro tempo, ad esempio minuti, ore, centesimi di secondo, ecc.

Per formare un intervallo di tempo di un secondo, utilizzeremo il primo timer-contatore del microcontrollore ATmega8. Definiremo tutte le sue impostazioni nella funzione inizio. Innanzitutto, dividiamo la frequenza operativa del microcontrollore 1000000 Hz per 64 e otteniamo una nuova frequenza di 15625 Hz. A ciò provvedono i bit CS10, CS11 e CS12 del registro TCCR1B. Successivamente, abilitiamo l'interruzione di coincidenza e scriviamo un numero binario uguale al decimale 15625 nei registri di confronto del registro di confronto (alto e basso).

inizio nullo (nullo)

TCCR1B &= ~(1<

TCCR1B |= (1<

TIMSK |= (1<

OCR1AH ​​= 0b00111101;

OCR1AL = 0b000001001; // registro di confronto 15625

TCNT1 = 0;

TCCR1B |= (1<

Quando il timer esegue il conto alla rovescia esattamente di un secondo, verrà chiamato un interrupt. Nel corpo della funzione di interruzione diminuiremo di uno il valore della variabile. Quando viene raggiunto lo zero, sulla seconda uscita della porta C del microcontrollore apparirà un potenziale elevato, che aprirà l'interruttore a transistor e avvierà il generatore, a seguito del quale sentiremo il suono nell'altoparlante.

ISR (TIMER1_COMPA_vect)

Z—;

Questo timer è progettato per impostare velocità dell'otturatore da 5 secondi a 100 minuti. Alla sua uscita è presente un relè elettromagnetico abbastanza potente che consente di commutare corrente fino a 30 A con una tensione di 12 V e corrente fino a 10 A con una tensione di 220 V. Grazie all'utilizzo di un relè elettromagnetico, il timer può controllare non solo dispositivi di riscaldamento o illuminazione, ma anche dispositivi elettronici critici per la forma della tensione di alimentazione CA. L'alimentazione del trasformatore, in combinazione con un relè, fornisce il completo isolamento galvanico del circuito elettronico del timer dalla rete.

Per la comunicazione tra il timer e l'operatore è presente un indicatore LED a quattro cifre; contiene quattro vecchissime matrici AL304 a 7 segmenti, collegate in una matrice collegando insieme pin di segmento con lo stesso nome. Naturalmente, puoi utilizzare indicatori LED più moderni e persino matrici a quattro cifre già pronte per la visualizzazione dinamica.

Il timer è controllato dai pulsanti S1, S2, S3, S4. Quando si preme il pulsante S1, il carico viene acceso e il timer si avvia. Per impostare il tempo durante il quale il carico dovrà funzionare è necessario premere S4, sul display lampeggeranno le due cifre più significative (minuti). Ora puoi utilizzare i pulsanti S2 e S3 per impostare i minuti. Quindi è necessario premere nuovamente S4. Ora lampeggeranno le cifre meno significative e sarà possibile utilizzare i pulsanti S2 e S3 per impostare i secondi. Per salvare le impostazioni, premere nuovamente S4. Ora l'indicatore mostrerà la velocità dell'otturatore impostata. Per avviare il timer è necessario premere S1. Il carico è acceso e le letture dell'indicatore iniziano a diminuire. Non appena il tempo impostato è scaduto, sull'indicatore appare "OFF" e il carico viene spento dal relè elettromagnetico. Per ripetere, premere due volte il pulsante S1. La prima volta che si preme "OFF" cambierà per mostrare l'ora impostata e la seconda volta si avvierà il timer. Controllo relè tramite pin 23 D1. L'accensione è un'unità logica. La chiave su VT5 e VT6 controlla il relè elettromagnetico K1. Tali relè vengono utilizzati nei circuiti di allarme delle automobili. Possono commutare sia la corrente continua (12V) che la corrente alternata (220V), poiché hanno un buon isolamento.

La fonte di alimentazione è realizzata utilizzando un trasformatore a bassa potenza. Poiché l'avvolgimento secondario del trasformatore viene prelevato dal centro (12-0-12), il raddrizzatore viene realizzato non utilizzando un ponte, ma utilizzando un circuito a onda intera utilizzando due diodi VD2 e VD3. Se il trasformatore ha un avvolgimento da 12 V senza presa, è necessario un ponte raddrizzatore. Il relè è alimentato direttamente dall'uscita del raddrizzatore e il resto del circuito tramite il regolatore di tensione A1 da 5 V.

Quando si esegue il flashing del firmware, è necessario impostarlo affinché funzioni con un oscillatore interno da 8 MHz.

Il circuito è assemblato su un prototipo di circuito stampato acquistato, da un lato c'è un microcircuito e altre parti, dall'altro pulsanti e indicatori. Trasformatore di alimentazione esterno al quadro.

I transistor KT315 possono essere sostituiti con KT3102 o qualsiasi analogo. Il transistor KT815 può essere sostituito con KT817, KT604. Diodo KD521 - quasi tutti gli analoghi. I diodi nel raddrizzatore KD209 sono tutti i diodi raddrizzatori per corrente continua non inferiore a 150 mA. Lo stabilizzatore integrato 7805 può essere sostituito con qualsiasi altro da 5 volt, ad esempio KR142EN5A. Oppure realizza uno stabilizzatore utilizzando un circuito parametrico utilizzando due transistor e un diodo zener da 5 V. Per quanto riguarda gli indicatori, è stato detto sopra. Può trattarsi di qualsiasi indicatore a sette segmenti con un anodo comune (catodo).

Archivio per l'articolo "Timer su Atmega8 e indicatori LED"
Descrizione: File del firmware
Dimensione del file: 5,58KB Numero di download: 4 319

Nell'articolo precedente, ho scritto che questo è l'ultimo sviluppo di un dispositivo del genere che utilizza indicatori LED a sette segmenti, ma si è scoperto che avevo fretta. Il fatto è che questo design utilizza solo il 40% della memoria del microcontrollore e c'è ancora un pin inutilizzato della porta del microcontrollore (ad eccezione del pin RESET). Pertanto, si è deciso di correggere questa ingiustizia rispetto al MK e di aggiungere un altro canale di controllo del carico. Al termine del lavoro, la memoria MK viene utilizzata al 99% e tutti i pin MK vengono utilizzati. Nome completo del progetto modificato:
"Un termometro a due canali, un termostato a due canali (termostato) con la possibilità di funzionare in tempo, un timer in tempo reale a canale singolo su un microcontrollore ATmega8 e sensori di temperatura DS18B20"

Descrizione e caratteristiche di un termometro a due canali, termostato (termostato), timer in tempo reale a canale singolo
su ATmega8 e DS18B20

Poiché questo design è "emerso" dal precedente - ed è descritto in dettaglio (tutte le caratteristiche di termometri e termostati, modalità operative, reazioni agli errori - sono rimaste invariate), mi concentrerò solo sull'innovazione: il timer in tempo reale.

Temporizzatore in tempo reale

Introdotto nel design timer in tempo reale, che ti permette di gestire il tuo terzo carico in tempo reale per 24 ore e ti permette di impostare due intervalli orari per il controllo dei carichi durante la giornata. Il timer consente inoltre di impostare un intervallo di tempo per il controllo del carico durante il giorno per ciascun canale di controllo della temperatura (controllo termico).
Cosa intendo per timer in tempo reale. Si tratta essenzialmente di un orologio interno con una risoluzione di 10 minuti. Durante la configurazione iniziale del dispositivo, l'ora corrente reale viene impostata con una precisione di 10 minuti, quindi il timer conta intervalli di 24 ore con incrementi di 10 minuti come un normale orologio.

La discrezione del conteggio degli intervalli di tempo di 10 minuti è stata adottata per due ragioni:
— comodità di visualizzare le informazioni su un indicatore a tre cifre, ad esempio 22 ore e 40 minuti — 22.4
- il controllo del carico con una precisione di 10 minuti è abbastanza sufficiente per la maggior parte delle attività (in realtà la precisione è di 5 minuti - se è necessario accendere il carico a 7 ore e 35 minuti, è possibile impostare 7,4 o 7,3)

L'introduzione di un timer ha leggermente modificato l'algoritmo per lavorare con il dispositivo (parlerò dell'algoritmo di funzionamento di seguito). Ora premendo il pulsante “Seleziona” è possibile accedere a due menu:
— menu per l'impostazione dei limiti di temperatura dei termostati e degli intervalli di tempo per il funzionamento del termostato, intervalli di tempo per il controllo del carico tramite timer
— menu per la correzione della frequenza dell'orologio e l'impostazione dell'ora corrente.
Poiché l'MK funziona con un oscillatore RC interno (8 MHz), che non è stabile e dipende sia dalla temperatura dell'MK che dalla tensione di alimentazione, la funzione di correzione della frequenza di clock consente di regolare la precisione della frequenza di clock per condizioni specifiche. E la funzione di impostazione dell'ora corrente consente di impostare l'ora reale corrente durante la configurazione iniziale o di chiarirla se differisce notevolmente dal tempo reale.
Le indicazioni del timer non vengono visualizzate quando il dispositivo è in funzione; puoi scoprire “che ore sono” solo quando entri nella modalità di impostazione dell'ora corrente.

Il controllo timer dei carichi non viene effettuato (disabilitato) se i tempi di accensione e spegnimento sono impostati a zero. In linea di principio, i carichi non sono controllati da un timer se i tempi di accensione e spegnimento sono uguali.

Quando si accede al menu di correzione dell'orologio e si imposta l'ora corrente, il timer si ferma. Pertanto, quando si corregge la frequenza dell'orologio, è necessario impostare l'ora corrente prima di uscire dal menu.

Schema di un termometro a tre canali, termostato, timer su ATmega8

Il circuito del dispositivo è stato creato nel programma e, in linea di principio, non differisce dal circuito di un termostato a due canali (è stato aggiunto un terzo canale di controllo del carico e, per varietà, i circuiti di controllo del carico sono stati modificati):


Poiché il circuito utilizza parti di “uscita”, per comodità di collocare la struttura in un apposito alloggiamento, il circuito è diviso in due parti:
— Blocco display: indicatori e pulsanti
— Unità di controllo — tutto il resto
Sarebbe necessario inserire nel blocco display dei led che segnalino l'accensione dei canali, ma questo può essere fatto indipendentemente in fase di disposizione della scheda (aggiungere tre coppie di contatti per i led e collegarli alla centralina filare).

Progettazione del dispositivo

Base del dispositivo- Microcontrollore ATmega8 con una frequenza di clock di 8 MHz da un oscillatore integrato con un circuito RC interno.
Per regolare la frequenza dell'oscillatore interno, durante la programmazione del MK, è necessario scrivere nella memoria EEPROM all'indirizzo zero il valore della cella di calibrazione per una frequenza di clock di 8 MHz. Il file HEX predefinito della memoria EEPROM riportato di seguito contiene il numero $В1 (В1) - il valore medio delle celle di calibrazione di 5 microcontrollori testati.
Inoltre, per il corretto funzionamento del timer in tempo reale, e funziona tramite interruzioni dal timer/contatore T1 quando il registro di conteggio e il registro di confronto OCR1A sono uguali, quando si programma la memoria EEPROM, seguendo il valore della cella di calibrazione , viene scritto il numero 33050 (1A81), che è programmato nel registro di confronto OCR1A. Quando l'avanzamento del timer viene corretto, cambia anche il valore di questo numero.

Indicazione le temperature e i valori attuali nella modalità di installazione vengono visualizzati su due indicatori a sette segmenti a tre cifre con un circuito di commutazione a "catodo comune".

Sensori DS18B20 sono collegati all'apparecchio tramite connettori femmina a 3 poli DS1 e DS2, la cui numerazione dei pin corrisponde alla numerazione dei pin del sensore.

Gestione dei bit realizzato da transistor bipolari di tipo NPN a bassa potenza.

Accesso al menu, impostazione dei valori, l'avvio delle singole modalità di riscaldamento (raffreddamento) viene effettuato tramite tre pulsanti tattili di tipo DTS:
— S1 — “Selezione”
— S2 — » + »
— S3 — » — »


— per i canali di controllo della temperatura — tramite optosimistori MOS3063 e triac VT139-800E secondo il circuito di commutazione standard, che consente di controllare carichi con una potenza fino a 3,5 kW (se la potenza del carico è superiore a 300-400 W, i triac devono essere installato sui radiatori)
- per il canale dal timer - attraverso un relè meccanico miniaturizzato con una tensione di alimentazione della bobina di 5 Volt, che consente, a seconda del relè utilizzato, di controllare un carico fino a 2 - 2,5 kW

Attiro la vostra attenzione sul collegamento della tensione di rete di 220 volt al dispositivo e sull'accensione del carico: deve essere collegato come nello schema, tenendo conto della “fase” e dello “zero” della tensione di rete.

Potenza del dispositivo effettuato da qualsiasi fonte di corrente continua con una tensione di 7-25 Volt. Il circuito può anche essere alimentato da un caricabatterie non necessario di un telefono cellulare con una tensione di uscita di 5 +-0,5 Volt. In questo caso è possibile escludere dal circuito lo stabilizzatore 7805 e i condensatori C4, C5. Il consumo medio di corrente del dispositivo è di 40 milliampere.

Se è necessario organizzare l'alimentazione di riserva (per il funzionamento ininterrotto del timer), è possibile utilizzare, ad esempio, il seguente schema:

Dettagli utilizzati nel design:

Controllo di un termometro a tre canali, termostato, termostato, timer

1. Entra nel menù

Il dispositivo dispone di due menu.
Quando si preme “brevemente” il pulsante “Seleziona”, sugli indicatori viene visualizzata la scritta “ON—-OFF”, si entra nel menu:
— impostazione dei limiti di temperatura per il funzionamento del termostato e degli intervalli di tempo per il funzionamento del termostato, intervalli di tempo per il controllo del carico utilizzando un timer
Premendo “a lungo” il pulsante “Seleziona”, la scritta “ON—-OFF” viene sostituita dalla scritta “Cor—-USt”; è necessario rilasciare il pulsante ed entrare nel menu:
— correzione della frequenza dell'orologio e impostazione dell'ora corrente

Si noti che quando si accede al menu (pressione lunga o breve del pulsante “Seleziona”), tutti i canali di controllo del carico sono disabilitati.

2. Menu “Correzioni dell'avanzamento e impostazione dell'ora corrente” (pressione prolungata del pulsante “Seleziona”)

Dopo essere entrati nel menu, ci troviamo subito nella modalità di correzione dell'orologio:
"Cor—-00"
Premendo nuovamente il pulsante “Seleziona”, passiamo alla modalità di impostazione dell'ora corrente:
"USt—-00.0"
Nella modalità di impostazione dell'ora corrente, guardiamo il nostro orologio più preciso e utilizziamo i pulsanti “+” e “-” per impostare l'ora più vicina con una precisione di 10 minuti.
Ad esempio, l'ora corrente è 20 ore e 37 minuti, impostiamo l'indicatore su “20.4” (20 ore e 40 minuti) ed esattamente alle 20.40, premendo il pulsante “Seleziona” usciamo dal menu. Questo è tutto, l'ora reale è impostata, l'orologio è avviato.
È possibile regolare la frequenza del clock da +50 unità a -50 unità. Il valore iniziale è “00” (“00” appare sempre quando si accede a questa modalità)
Modificando l'impostazione di uno si aumenta la frequenza dell'orologio (+1) o la si diminuisce (-1) di circa 4 secondi ogni 24 ore.
La precisione dell'orologio può essere verificata sul canale di controllo del carico utilizzando un timer senza carico collegato accendendo il LED.
Ad esempio, alle 21.00 impostiamo l'ora corrente, impostiamo l'accensione del carico alle 8.50 e lo spegnimento alle 9.00. Al mattino abbiamo misurato l'orario di spegnimento del carico. Supponiamo che il carico si sia spento alle 8 ore 59 minuti e 20 secondi. Ciò significa che il timer è indietro di 40 secondi in 12 ore. In 24 ore il ritardo sarà di 80 secondi. Dividere 80 secondi per 4 = 20. Nella modalità di correzione, impostare la lettura su 20, quindi passare alla modalità di impostazione dell'ora corrente, impostare l'ora corrente più vicina, ad esempio 9.1, e su 9 ore e 10 minuti, premendo il pulsante "Seleziona". ", usciamo dalla modalità operativa.

Si tenga presente che in assenza di una fonte di alimentazione di riserva, in caso di “mancanza” della tensione di rete, l'orologio viene azzerato ed è necessario impostare nuovamente l'ora corrente.

3. Menu per l'impostazione della temperatura e degli intervalli di tempo per i termostati

Permettetemi di ricordarvi le modalità di funzionamento dei canali di termostatazione (controllo termico):
— modalità di termostatazione — mantenimento di una certa temperatura
— modalità di controllo termico — mantenimento della temperatura entro determinati limiti
— modalità di riscaldamento (raffreddamento) singola
Tutte queste modalità sono descritte in dettaglio nell'articolo, che fornisce anche istruzioni dettagliate e funzionalità di ciascuna modalità.
Con l'introduzione di un timer in tempo reale nel progetto, è diventato possibile per ciascun canale impostare un intervallo di tempo affinché il canale funzioni durante il giorno. Per fare ciò, al menu sono state aggiunte ulteriori righe per l'attivazione e la disattivazione dei canali.
Ad esempio, abbiamo bisogno che il 1° canale di controllo della temperatura funzioni solo di notte dalle 23:00 alle 6:30. Per fare ciò, nel 1° menu (premere brevemente il pulsante “Seleziona”):
— dopo aver impostato i limiti di temperatura superiore e inferiore, appariranno altre due righe: “t.On——00.0” e “t.OF——00.0” (lo stesso avverrà per il secondo canale)
— utilizzare i pulsanti “+” e “-” per impostare: “t.On——23.0” e “t.OF——06.3”
Ora alle 23.00 il 1o canale inizierà a funzionare nella modalità specificata, alle 6.30 il canale verrà spento, e così via ogni giorno.
Modalità singola di riscaldamento/raffreddamento. Se l'intervallo di tempo non è selezionato (l'orario di accensione/spegnimento è impostato su "0"), queste modalità vengono avviate manualmente premendo il pulsante corrispondente. Questa modalità può funzionare anche nel tempo.
Diciamo che dobbiamo riscaldare l'acqua nel serbatoio a 45 gradi sul 2° canale di controllo della temperatura al mattino, entro le 7.00, tenendo conto che l'acqua nel serbatoio si riscalda a questa temperatura in 25 minuti:
— impostare “2.On——00” e “2.OF——45”
— impostare “t.On——06.3” e “t.OF” lasciare il valore predefinito “t.OF——00.0”
Ora il canale 2 si avvierà automaticamente alle 6,30 minuti e quando la temperatura dell'acqua raggiunge i 45 gradi si spegnerà.
Quando si utilizza la modalità di riscaldamento/raffreddamento singola insieme a un timer, è comunque possibile avviare manualmente la modalità, ma è necessario tenere presente che durante il periodo di tempo “t.OF—-t.On” (per l'esempio precedente - dalle 24.00 alle 6.30) non è possibile la modalità manuale. Pertanto, per poter avviare manualmente la modalità in qualsiasi momento, è necessario impostare “t.OF” 10 minuti in meno rispetto a “t.On”.

4. Menu per l'impostazione degli intervalli di tempo per il timer

Temporizzatore in tempo reale permette di impostare due intervalli orari durante la giornata per controllare il carico tramite timer.
Per fare ciò sono state aggiunte al menu quattro ulteriori righe:
— t1.1 — orario di commutazione per il primo intervallo di tempo
— t1.0 — ora di spegnimento per il primo intervallo di tempo
— t2.1 — orario di commutazione per il secondo intervallo di tempo
— t2.0 — ora di spegnimento per il secondo intervallo di tempo
Gli intervalli di tempo non devono sovrapporsi.
Diciamo che dobbiamo accendere l'illuminazione del cortile due volte al giorno: dalle 21.00 alle 0.30 e dalle 5.30 alle 7.00
Installare:
— t1.1 — 21.0
— t1.0 — 00.3
— t2.1 — 05.3
— t2.0 — 07.0
Ora il carico del timer verrà attivato alle 21:00 e alle 5:30 e spento alle 0:30 e alle 7:00

Seconda opzione PCB:

Opzione per impostare i bit FUSE:

(22,2 KiB, 2.016 visite)

In questo tutorial parleremo di timer.

Questo argomento è direttamente correlato all'argomento del clock del microcontrollore. Pertanto, ti consiglio di leggere quello precedente prima di leggere questa lezione.

Allora perché abbiamo bisogno di un timer?

Quando si realizzano progetti su microcontrollori, spesso è necessario misurare intervalli di tempo precisi. Ad esempio, il desiderio di far lampeggiare un LED a una determinata frequenza o di interrogare lo stato di un pulsante agli intervalli di tempo richiesti.

I timer aiutano a risolvere i compiti. Ma i timer del microcontrollore AVR non sanno cosa siano un secondo, un minuto o un'ora. Tuttavia, sanno benissimo cos'è il tatto! Funzionano proprio grazie alla presenza del clock del controller. Cioè, il timer conta il numero di cicli del controller, misurando così gli intervalli di tempo. Supponiamo che il controller funzioni a una frequenza di clock di 8 MHz, ovvero quando il timer conta fino a 8.000.000, passerà un secondo, contando fino a 16.000.000, passeranno 2 secondi e così via.

Tuttavia, ecco che arriva il primo ostacolo. I nostri registri sono a 8 bit, cioè possiamo contare fino a un massimo di 255, e prendendo un timer a 16 bit, possiamo contare fino a un massimo di 65535. Cioè in un secondo dobbiamo resettare il timer a un numero enorme di volte! Naturalmente puoi farlo se non hai nient'altro da fare. Ma semplicemente misurare il tempo utilizzando un potente microcontrollore non è affatto interessante; voglio fare qualcosa di più. È qui che il predivider ci viene in aiuto. In termini generali, si tratta di un collegamento intermedio tra il timer e la frequenza dell'orologio del controller. Il prescaler semplifica il nostro compito consentendoci di dividere la frequenza del clock per un certo numero prima di inviarla al timer. Cioè, impostando il prescaler su 8, in 1 secondo il nostro timer conterà fino a 1.000.000 invece di 8.000.000 (ovviamente con una frequenza di clock del controller di 8 MHz). È già più interessante, no? E possiamo dividere non solo per 8, ma anche per 64 e perfino per 1024.

Ora è il momento di assemblare il circuito, impostare il timer, il prescaler e fare almeno qualcosa di utile!

E oggi realizzeremo "luci di marcia" dai LED. Cioè, accenderemo 3 LED uno per uno, con un periodo di 0,75 secondi (ovvero, il tempo di funzionamento di un LED è 0,25 secondi). Mettiamo insieme il seguente diagramma:

Calcola tu stesso i valori dei resistori R 1-R 3.

Successivamente, diamo un'occhiata ai registri responsabili del funzionamento dei timer. In totale, AtMega 8 ha 3 timer: due a 8 bit (Timer 0, Timer 2) e uno a 16 bit (Timer 1). Considereremo l'esempio del timer 1 a 16 bit.

Una coppia di registri, i registri a 8 bit TCNT 1H e TCNT 1L, insieme formano il registro a 16 bit TCNT 1. Questo registro è aperto sia in scrittura che in lettura. Quando il timer 1 è in esecuzione, il valore di questo registro cambia di uno ad ogni conteggio. Cioè, il registro TCNT 1 registra il numero di cicli di clock che il timer ha contato. Possiamo anche scrivere qui qualsiasi numero compreso tra 0 e 2 alla 16a potenza. In questo caso i cicli di clock verranno conteggiati non da 0, ma dal numero che abbiamo registrato.

Il registro TIMSK è responsabile degli interrupt generati quando funzionano i timer del microcontrollore. Un'interruzione è un gestore di un segnale speciale ricevuto quando qualcosa cambia.. Qualsiasi interruzione del microcontrollore può essere abilitata o disabilitata. Quando si verifica un interrupt abilitato, il corso del programma principale viene interrotto e questo segnale viene elaborato. Quando si verifica un'interruzione disabilitata, il flusso del programma non viene interrotto e l'interruzione viene ignorata. Il bit TOIE 1 (Timer 1 Overflow Interrupt Enable) è responsabile dell'abilitazione dell'interruzione di overflow del registro di conteggio TCNT 1 del timer 1. Quando si scrive 1 su questo bit, l'interrupt è abilitato e quando si scrive 0, è disabilitato. Questo interrupt viene generato dal timer 1 quando viene raggiunto il valore massimo del registro TCNT 1. Parleremo più approfonditamente degli interrupt nella prossima lezione.

Il registro TCCR 1B è responsabile della configurazione del timer 1. In questo caso con i bit CS 10-CS 12 impostiamo il valore del prescaler secondo la tabella seguente.

Le restanti parti per il momento non ci interessano.

C'è anche un registro TCCR 1A, che consente di configurare altre modalità operative del timer, ad esempio PWM, ma ne parleremo in un articolo separato.

E ora il codice in C:

#define F_CPU 16000000UL #include #includere uint8_tnum=0; ISR(TIMER1_OVF_vect) ( PORTD=(1<2) ( num=0; ) TCNT1=61630;//Valore iniziale del timer ) int main(void) ( DDRD|=(1<

#define F_CPU 16000000UL

#includere

#includere

uint8_tnum = ;

ISR(TIMER1_OVF_vect)

PORTA = (1<< num ) ;

numero++ ;

se (num > 2)

numero = ;

TCNT1 = 61630 ; //Valore iniziale del timer

int principale(vuoto)

DDRD |= (1<< PD0 ) | (1 << PD1 ) | (1 << PD2 ) ;

TCCR1B |= (1<< CS12 ) | (1 << CS10 ) ; //Prescaler = 1024

TIMSK |= (1<< TOIE1 ) ; //Abilita l'interruzione di overflow del timer 1

TCNT1 = 61630 ; //Valore iniziale del timer

sei(); //Abilita gli interrupt

mentre(1)

//Il ciclo principale del programma è vuoto, poiché tutto il lavoro è nell'interrupt

Codice ASM:

Assemblaggio (x86)

Include "m8def.inc" rjmp start .org OVF1addr rjmp TIM1_OVF start: ldi R16,LOW(RamEnd) out SPL,R16 ldi R16,HIGH(RamEnd) out SPH,R16 ldi R16,1 ldi R17,0b00000111 out DDRD,R17 ldi R17,0b00000101 out TCCR1B,R17 ldi R17,0b11110000 out TCNT1H,R17 ldi R17,0b10111110 out TCNT1l,R17 ldi R17,0b00000100 out TIMSK,R17 sei main_loop: nop rjmp main_loop TIM1_OV F: uscita PORTD,R16 lsl R16 cpi R16,8 brlo label_1 ldi R16,1 label_1: ldi R17,0b10111110 uscita TCNT1L,R17 ldi R17,0b11110000 uscita TCNT1H,R17 reti

Includi "m8def.inc"

Inizio Rjmp

Org OVF 1 ind

Rjmp TIM 1_OVF

inizio :

Ldi R 16, BASSO (RamEnd)

Fuori SPL, R 16

Ldi R 16, ALTA (RamEnd)

Fuori SPH, R 16

Ldi R 16, 1

Ldi R 17, 0b00000111

Fuori DDRD, R 17

Ldi R 17, 0b00000101

Fuori TCCR 1B, R 17

Ldi R 17, 0b11110000

Fuori TCNT 1H, R 17

Ldi R 17, 0b10111110

© 2023 hecc.ru - Notizie sulla tecnologia informatica