// ATiny45 timer0 és globális változó használata
// f_cpu 8MHz, CLDIV8 nincs pipálva, akkor kb 1 másodpercenként váltja a szineket, majd kezdi előről

#include <avr/io.h>      
#include <avr/interrupt.h>  //ez tartalmazza az ISR makrókat (megszakításokat)


#define WHT()			 PORTB = 0b00000111 //fehér (mind)

#define RED()         	 PORTB = 0b00000001 //csak piros   - PB0 -

#define YLLW()       	 PORTB = 0b00000011 //piros-zöld=sárga 

#define GRN()        	 PORTB = 0b00000010 //csak zöld   - PB1 -
	
#define CYAN()       	 PORTB = 0b00000110 //zöld-kék=cián

#define BLUE()			 PORTB = 0b00000100 //csak kék   - PB2 -

#define MAG()			 PORTB = 0b00000101 //piros-kék=magnetta

#define LED_OFF()        PORTB = 0b00001000 // sötétség :-)



// ----- Globális változó -------
volatile unsigned char b;   // értéktartomány: 0-255 
//-------------------------------


void init(void) {  //külső függvény nincs bemenő se kimenő paraméter, csak szimplán lefut

        DDRB= 0b00000111;    //kimenettek def. azaz a PB0, PB1, PB2, kimenet
 
        TCCR0B= 0b00000101;  //előosztást beállítjuk, most a max 1024 ( a timer1 nagyobb osztást is tud, de annak más a beállítása

 		TIFR= (1<<TOV0);         //engedélyezzük a TIMER0-ról jövő megszakítást

        TIMSK=(1<<TOIE0);        // ez is kell a megszakítás engedélyezéséhez (de csak a timer0-nál)
 
        sei();      //engedélyezzük a megszakítás hívást
        }
 
int main(){
//extern volatile unsigned char b; // extern deklaráció  most "kiiktatva" mert nem kellett
   
		for (;;) {
        init();  //a fentebbi külső függvényt meghívjuk, ami lefut és utána megy tovább a program
 
 		if(b > 255)   b=0; 			//törlés, kezdi előröl.    b változó értékét összehasonlitjuk értékekkel
        else
        {if(b > 224)   WHT(); 		//fehér
        else
		{if(b > 192)   RED(); 		// piros
        else  
		{if(b > 160)   YLLW();		// sárga
		else  
		{if(b > 128)   GRN();		// zöld
		else 
		{if(b > 96)   CYAN();		// cián
		else 
		{if(b > 64)   BLUE();		// kék
		else   
		{if(b > 32)   MAG();		// magnetta
		else		LED_OFF();		// sötét
		}}}}}}} // sok if-else vége
        }//for vége
 
} //main vége

ISR(TIMER0_OVF_vect)     //megszakítási vektor TIMER0 értelemszerű, OVF - overflow vagyis akkor fog ide ugrani (megszakadni a program futás) ha túlcsordult a TCNT0 regiszter
        { //extern volatile unsigned char b; // extern deklaráció most "kiiktatva" mert nem kellett
		b++; // interruptnál, tehát most, 1-el növeljük a b globális változót
		}
		
        
