/********************************************/
/* Blikajuce LED */
/* */
/* V.Chromy (c)2009 */
/* */
/* CPU:ATtiny13 Fclk:4.8MHz */
/* Fwdt:128kHz*/
/********************************************/
/*
Program riadi rozsvietenie 3 LED
Interval LED1 LED2 LED3
T1 Up Down OFF
T2 Down OFF Up
T3 Off Up Down
a nasledne T1
======== HW ========
PB0 - LED1
PB1 - LED2
PB2 - LED3
*/
#include <avr/io.h> // io
#include <avr/interrupt.h> //prerusenia
//=============== Makrodefinicie ====================
#define SETBIT(VAR,BIT) (VAR|=(1<<BIT))
#define CLEARBIT(VAR,BIT) (VAR&=~(1<<BIT))
#define CHECKBIT(VAR,BIT) (VAR&(1<<BIT))
//*************** definicie ****************
//HW
#define Led1 PB0 //
#define Led2 PB1 //
#define Led3 PB2 //
//premenne
volatile unsigned char Status; //value 0-2
//0 = T1
//1 = T2
//2 = T3
volatile unsigned char Timer; //zmena casovania
volatile unsigned int Cas; //pocitanie casu
//===================================================
// Prerusenia
//===================================================
//pouzijem WTD prerusenie pre casovanie a
//spustanie casovaca T0 spolu so smenou hodnoty
ISR(SIG_WATCHDOG_TIMEOUT){
unsigned char p; //pomocna premenna
//kazdu periodu nastavim porty a spustim timer
p=(PINB&0xf8); //stav portu do premennej a znulovanie dolnych bitov
switch(Status){
//T1
case 0: p=p|0b00000110;break;
//T2
case 1: p=p|0b00000011;break;
//T3
case 2: p=p|0b00000101;break;
}
PORTB=p; //a stav na port
//nastavim timer 0 a odstartujem ho
//spravne by malo byt (0x00-Timer)...ale v tomto pripade to je jedno
TCNT0=(0xFF-Timer); //podla nastavenej timer menim hodnotu
TCCR0B=0x05; //zapnem timer - CLK/1024
//a tu podla casu to cele menim
Cas++; //pocita pocet preruseni
//a podla dosiahnuteho casu robim zmenu
Timer++;
Timer++;
//uplynul limit a tak dam vsetko do povodnych hodnot
if(Cas>=100){Timer=1;
Cas=0x00;
Status++; //a zmenim riadenie LED
if(Status==0x03)Status=0x00;//pre max hodnotu sa Status=0x00
};
}
//timer 0 overflow
ISR(TIM0_OVF_vect){
unsigned char p; //pomocna premenna
//podla statusu zmenim stav
p=(PINB&0xf8); //stav portu do premennej a znulovanie dolnych bitov
switch(Status){
case 0: p=p|0b0000101;break;
case 1: p=p|0b0000110;break;
case 2: p=p|0b0000011;break;
}
PORTB=p; //a stav na port
TCCR0B=0x00; //vypnem timer
}
//==========================================================
int main(){
//inicializacia
Timer=1;
Cas=0x00; //vynulujem casovanie
Status=0x00; //nasavim status
//nastavenie portu
DDRB=0x07; //dolne 3 bity su vystupom
PORTB=0x07; //a vsetko je zhasnute
//timer
TCCR0A=0x00; //normal timer
//prerusenia
TIMSK0|=(1<<TOIE0); //TOVF je povoleny
WDTCR|=(1<<WDTIE); //WDT interupt je povoleny
sei(); //globalne povolenie preruseni
//hlavna slucka nerobi nic,lebo cely system je riadeny preruseniami
//z timer a WDT
for(;;){
}
}