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
}
}
}