Skip to content
Snippets Groups Projects
avr-led-panel-priklad-casovac-s-prerusenim.md 2.96 KiB

title = "AVR - LED panel - Příklad - Časovač s přerušením"
perex_e = "

Kompatibilní zapojení: LED panel s ATmega8

Ke stažení: LED_Casovac-preruseni.c == LED_Casovac-preruseni.pdf == LED_Casovac-preruseni.htm
.
.
"
tags = ["Článek", "Bastlení", "Konstrukce", "2011"]

Kompatibilní zapojení: LED panel s ATmega8

Ke stažení: LED_Casovac-preruseni.c == LED_Casovac-preruseni.pdf == LED_Casovac-preruseni.htm . .


Untitled <!-- body { color: #000000; background-color: #FFFFFF; } .cpp1-assembler { } .cpp1-brackets { } .cpp1-comment { color: #008000; font-style: italic; } .cpp1-float { color: #000080; } .cpp1-hexadecimal { color: #000080; } .cpp1-character { } .cpp1-identifier { } .cpp1-illegalchar { } .cpp1-number { color: #000080; } .cpp1-octal { color: #0000FF; } .cpp1-preprocessor { } .cpp1-reservedword { font-weight: bold; } .cpp1-space { color: #008080; } .cpp1-string { color: #800000; } .cpp1-symbol { } -->
/*
Popis:
Vybrané ledky budou blikat cca 2x za vteřinu

Ledky které mají takto blikat jsou vybrány konstantou "LED" a čas svícení je dán
děličkou časovače a šířkou jeho registru.
V tomto příkladu bude použit čítač/časovač "0" který má šířku registru 8 bitů 
to znamená že počítá do 255.
Čítač bude mít zapnutou děličku hodinového signálu s dělitelem 1024.
Výsledná frekvence tedy bude 1 000 000/1024/255 = 3,8 Hz - při každém přetečení 
budeme negovat stav ledek, takže se rozsvítí a zhasnou přibližně 2x za sekundu.

Přetečení čítače způsobí přerušení, ve kterém bude negován stav ledek.
*/

#include <avr/io.h>		//Vlož knihovnu vstupů a výstupů (PORT, DDR, PIN)
#include <avr/interrupt.h> //Vlož knihovnu vektorů přerušení (ISR() )

#define LED 0b01110101; //Ledky, které  se mají rozsvítit při stisku tlačítka

/********************Obsluha přerušení***********************/
ISR(TIMER0_OVF_vect)     //Vektor přerušení při přetečení čítače/časovače "0"
{
PORTB = ~PORTB;	//vyměň na portu "B" všechny nuly za jedničky a naopak
}

/**********************HLAVNÍ FUNKCE*************************/

int main (void) //hlavní funkce
{
TIMSK = 0b00000001; //vybereme přerušení od TC0
sei();              //povol přerušení
TCCR0 = 5; 			//spusť časovač "0" s předděličkou 1024

DDRB = 0xff; 	//(0xff = 0b11111111) -> Piny 0 - 7 portu "B" budou výstupní
PORTB = LED;	//rozsviť vybrané ledky

while (1)		// Nekonečná smyčka (dokud 1 = pořád)
	{

	;	//nic nedělej (prázdný příkaz)
		//- zde by mohl být program, který nebude zdržován blikáním
	}//Konec cyklu "while (1)" - program skočí zpět na jeho začátek

}//konec funkce main() - sem se program nikdy nedostane 
 //(závorka tu však musí být jinak by překladač nahlásil chybu)