trippling - komfortne blikanie (trojblik) - atmega8

Takze po 2 tyzdnovom uspesnom testovani triplingu bez nejakych anomalii a divneho spravania posuvam kod ktory som pouzil v atmege. Dufam ze pomoze, inspiruje pri pisani kodu na tripling. Schemu som pouzil tu istu ako je v prvom pripevku len s tym rozdielom ze som nepouzil odporove delice a zenerky ale optočleny.

#include <avr/io.h>
#include <avr/interrupt.h> 

#define TRUE 0xFF
#define FALSE 0

#define SET(ADDRESS,BIT) (ADDRESS |= (1<<BIT))
#define RESET(ADDRESS,BIT) (ADDRESS &=~(1<<BIT))
#define TST(ADDRESS,BIT) ((ADDRESS) & (1<<(BIT)))

#define lava_smerovka_on SET(PORTD,PD0)
#define lava_smerovka_off RESET(PORTD,PD0)
#define prava_smerovka_on SET(PORTD,PD1)
#define prava_smerovka_off RESET(PORTD,PD1)

volatile unsigned int lava, prava,lava_zap,prava_zap,lava_vyp,prava_vyp;



ISR(TIMER0_OVF_vect){

	//ak je zapnuta lava smerovka
	if(TST(PIND,PD2)==0){ lava++; //pocitaj dlzku impulzu
						  lava_vyp = FALSE; //vynuluj pocitadlo dlzky vypnutia smerovky
						  				}	
		//ak je vyp. lava smerovka a pocitadlo dlzky vypnutia smerovky nie je 400
		else if(TST(PIND,PD2) && lava_vyp!=400) lava_vyp++; 

	//ak je zapnuta lava smerovka pocitaj dlzku zopnutia	
	if(TST(PIND,PD0))lava_zap++; 
						
		//ak je zapnuta prava smerovka
		if(TST(PIND,PD3)==0){ prava++; //pocitaj dlzku impulzu
							  prava_vyp = FALSE; //vynuluj pocitadlo dlzky vypnutia smerovky
							  					}
		//ak je vyp. lava smerovka a pocitadlo dlzky vypnutia smerovky nie je 400
		else if(TST(PIND,PD3) && prava_vyp!=400) prava_vyp++;

	//ak je zapnuta prava smerovka pocitaj dlzku zopnutia	
	if(TST(PIND,PD1))  prava_zap++;	

					}

	int main(){

	DDRB|=(1<<PB1);

 	DDRD = 0xF3; //vstup PD2,PD3 ostatne vystup

 	PORTD|=(1<<PD2)|(1<<PD3);	//pull-up na PD2,PD3

 	TCCR0|=(1<<CS01)|(1<<CS00); //predelicka 64 pri 8MHz

	TIMSK|=(1<<TOIE0); //povolenie prerusenia T0 

 	sei();

	while(1){	

		//ak je lava smerovka vypnuta dlhsie ako 400 preruseni (800mS)
	if(lava_vyp==400) lava = FALSE; //vynuluj pocitadlo dlzky impulzu
							
						
		//tripling lava strana						 			
	if(lava>30 && lava<145){ 	//ak je impulz v tomto rozmedzi
		if(TST(PIND,PD2) && TST(PIND,PD3)){//ak su smerovky vypnute
			 		 lava_smerovka_on;	//zapni lavu smerovku
			 		 lava = FALSE;	//vynuluje pocitadlo dlzky impulzu
			 		 prava_zap = 1000; //vypni opacnu smerovku (v pripade ak bola zapnuta) 
					 		 	} 
			  				}
							

	//ak counter narata 1000 cca 2s vypne lavu smerovku a vynuluje pocitadla
	if( lava_zap==1000){	lava_smerovka_off; //vypni lavu smerovku	
							lava=FALSE;			//vynuluj pocitadlo dlzky impulzu
							lava_zap=FALSE;		//vynuluj pocitadlo dlzky zapnutia triplingu
											}

	//ak je prava smerovka vypnuta dlhsie ako 400 preruseni(800mS)
	if(prava_vyp==400) prava = FALSE;
								
					

		
	//tripling prava strana
	if(prava>30 && prava<145){ //ak je impulz v tomto rozmedzi
		if(TST(PIND,PD3) && TST(PIND,PD2)){//ak su vypnute smerovky
			  prava_smerovka_on; //zapni smerovku
			  prava = FALSE; //vynuluje pocitadlo
			  lava_zap=1000;  }	//vypni opacnu smerovku (v pripade ak bola zapnuta) 
			  				}	


	//ak counter narata 1000 cca 2s vypne pravu smerovku a vynuluje pocitadla 
	if(prava_zap==1000){	prava_smerovka_off;	 //vypni pravu smerovku
							prava= FALSE;		//vynuluj pocitadlo dlzky impulzu
							prava_zap=FALSE; //vynuluj pocitadlo dlzky zapnutia triplingu
												}
 					
				
	}
 }