Mikrokontroléry rady AVR – čítač/časovač 2 – RTC hodiny

Ako zdroj RTC signálu sa u AVR jednočipov využíva jednotka čítača/časovača2. Využíva sa časovanie pomocou externého kryštálu 32,768 kHz pripojeného na piny TOSC1 a TOSC2.

Čítač/časovač2

Obsahuje (umožňuje):
-> 8bit čítač a časovač;
-> generovanie signálu PWM;
-> clear time on compare match;
-> generátor frekvencií;
-> zdroje prerušenia: od output capture, pretečenie registra TCNT2;

obr1

Obr.1 Bloková schéma č/č2

Registre

8bit č/č2 využíva nasledovné v/v registre:

Konfiguračné registre:
TCCR2 – 8bit register, nastavuje sa nim režim č/č, delička a podobne;
ASSR – 8bit stavový register asynchrónneho režimu;
TIFR – 8bit príznakový register prerušení;
TIMSK – 8bitový register na ovládanie prerušení od spomínaných zdrojov;

Dátové registre:
TCNT2 – 8bit register, ktorý obsahuje aktuálne načítanú hodnotu;
OCR2 – 8bit register, obsahuje hodnotu, ktorá je pravidelne porovnávaná s hodnotou v registry TCNT2; pri zhode nastane vopred definovaná akcia (prerušenie a pod.)

Popis bitov konfiguračných registrov:

obr2

Obr.2 Register TCCR2

FOC2, WGM21:0, COM21:0 – nastavenie režimu č/č2 (viac o nastavení pozri datasheet str. 125;
CS22:0 – výber preddeličky;

obr3

Obr.3 Nastavenie preddeličky

obr4

Obr.4 Register ASSR

AS2 – zapisom tohto bitu do log1 povolíme externé hodiny pripojené na TOSC1 a TOSC2 piny;

obr5

Obr.5 Register TIMSK

OCIE2 – povolenie prerušenia pri Output Compare Match – teda zhode OCR2 a TCNT2;
TOIE2 – povolenie prerušenia pri pretečení TCNT2;

obr6

Obr.6 Register TIFR

Spôsob časovania, čítania a generovania signálu je podobný ako u predchádzajúcich jednotiek. V tomto sa budem venovať zdroju RTC hodín.

RTC hodiny

Pre RTC hodiny sa často využíva kryštál s frekvenciou 32,768kHz. Tento sa k MCU pripája na piny TOSC1 a TOSC2. Na časovanie sa potom využije delička 128 a prerušenie pri pretečení TCNT2, ktoré pri takomto nastavení nastane každú sekundu.

f = 32 768 Hz / 128 = 256 => 8bit

Ako príklad som spravil hodiny. Využívajú tento princíp časovania RTC a čas sa zobrazuje na displej. Nastavenie času sa realizuje stlačením tlačidla PD2 – nim sa zvoli čo chcem nastaviť (sekundy, minúty, hodiny). Ich vyber indikujú ledky. Nastavenie sekúnd PC0, minút PC1, hodín PC2. Inkrementácia sa robí stlačením PD3 a dekrementácia tiež PD3 za súčasného stlačenia a podržania PD4. V prerušení od TOVF2 sa realizuje inkrementácia sekúnd. Po prekročení 60 sekúnd sa vynuluje a inkrementujú sa minúty atď.

/* 	program - RTC hodiny s vyuzitim jednotky citac/casovac2

	FCPU: 12MHz
	FOSC: 32,768 kHz
*/

#include <avr/io.h>
#include <avr/interrupt.h>
#include <stdio.h>
#include <stdlib.h>
#include "lcd.h"

//deklaracia premennych

...

int main()
{
	// inicializacia displeja
		...
	// nastavenie tlacidiel
		...
	// nastavenie preruseni od tlacidiel
		...
	// inicializacia led
		...
	// nastavenie casovaca

	TCNT2 = 0;				// citac na nulu
	TIMSK = (1<<TOIE2);		// prerusenie od pretecenia TCNT2
	ASSR = (1<<AS2);				// hodiny z TOSC -> 32,768 kHz
	TCCR2 = (1<<CS22) | (1<<CS20);	// nastavenie delicky 128

	sei();	// povolenie preruseni

	while(1);  // beh programu

	return 0;
}

ISR(TIMER2_OVF_vect)	// prerusenie od pretecenia TCNT2
{
	TCNT2 = 0;

	unsigned char sreg = SREG;  // vypnutie preruseni
	cli();

	sec++;	// inkrementacia sekund

	if (sec >= 60)  // ak su sekundy viac ako 60 alebo rovne60
	{
		sec = 0;  // vynuluje sekundy
		min++;	  // a inkrementuje minuty
	}

	if (min >= 60)
	{
		min = 0;
		hour++;
	}

	if (hour >= 24) hour = 0;

	sprintf(buff,"%u:%u:%u   ",hour,min,sec);  // vypis casu na displej

	lcd_position(1,5);
	lcd_puts(buff);

	SREG = sreg;  // povolenie preruseni - vrati povodny obsah SREG registra
}

ISR(INT0_vect)  // prerusenie od PD2 - rezim nastavenia casu
{
	...
}

ISR(INT1_vect)  // ikrementacia/dekrementacia casovych premennych
{
	...
}

Príklad

16_timer2_rtc

Pridaj komentár

Vaša e-mailová adresa nebude zverejnená. Vyžadované polia sú označené *

Môžete použiť tieto HTML značky a atribúty: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>