ATtiny2313 a přerušení

C,C++,C#

Moderátori: psichac, Moderátori

Používateľov profilový obrázok
jirka.jirka.
Ultimate člen
Ultimate člen
Príspevky: 1538
Dátum registrácie: 17 Okt 2008, 00:00
Bydlisko: Uherské Hradiště
Kontaktovať používateľa:

ATtiny2313 a přerušení

Príspevok od používateľa jirka.jirka. » 03 Feb 2014, 19:10

Ahoj přátelé,
najde se někdo, kdo by poradil? Píšu program, ale zasekl jsem se hned na začátku. :lol: Už s tím bojuju asi moc dlouho a potřeboval bych někoho s čistou hlavou. Napsal jsem si jednoduchý program, kde v přerušení kontroluji stisk tlačítka a v nekonečné smyčce pouze zapínám na pár ms větřák. :wink: Ve skutečnosti ovšem ale spínám pouze relé.

Problém ale je ten, že při stisku tlačítka mi program nereaguje. A už fakt nevím jestli mám blbě nastavené přerušení nebo něco jiného. Hold se mi nějak nedaří tu mršku chybku najít.

Tak třeba když se na to koukne někdo, kdo zrovna vstal od telky a má čistou hlavu, tak ji hned uvidí. :lol: Dík moc
krystal mám 12MHz

fce inicializace

Kód: Vybrať všetko

void inicializace(){
		//nastaveni vstupnich pinu
	DDRD &= ~(1 << TL_1);
	DDRD &= ~(1 << TL_2);
		//aktivace pull-up
	PORTD |= (1 << TL_1);
	PORTD |= (1 << TL_2);
		//nastaveni vystupnich pinu
	DDRB |= (1 << ventilator_1);
	DDRB |= (1 << ventilator_2);
		//nastaveni preruseni od citace casovace 0 (TLACITKO)
	TCCR0A |= (1 << WGM01); 	//CTC mod
	TCCR0B |= (1 << CS02)|(1 << CS00);  // dělička kmitočtu CLK/1024
	TIMSK |= (1 << OCIE0A);  	//Aktivace preruseni CTC modu
	OCR0A = 188;				//cca 16ms pro kontrolu tlačítka
	sei();              		//povoleni preruseni
}
přerušení

Kód: Vybrať všetko

volatile unsigned char 	tl_prodleva_1,tl_present_1,tl_prodleva_2,tl_present_2 ;
ISR (TIMER0_COMPA_vect) {//compare interrupt B 
   //ošetření tlačítka TL_1 a jeho zákmitů
	  if((PIND & (1 << TL_1))){
	  	if(tl_prodleva_1<20) tl_prodleva_1++;
	    if(tl_prodleva_1==19) tl_present_1=1;  
      }
      else{	
	    if(tl_prodleva_1==20){		//sem se dostane pouze pri stisku tlacitka
			vetrak_1=1;
        }       
	 tl_prodleva_1=0;
				
     }

	  //ošetření tlačítka TL_2 a jeho zákmitů
	  if((PIND & (1 << TL_2))){
	  	if(tl_prodleva_2<20) tl_prodleva_2++;
	    if(tl_prodleva_2==19) tl_present_2=1;  
      }
      else{	
	    if(tl_prodleva_2==20){		//sem se dostane pouze pri stisku tlacitka
			vetrak_2=1;
        }       
	 tl_prodleva_2=0;		
     }
}
MAIN

Kód: Vybrať všetko

int main(){  
      inicializace();
   
    while(1){ // nekonečný cyklus  

		if (vetrak_1==1){
		PORTB |= (1 << ventilator_1);
		_delay_ms(200);
		PORTB &= ~(1 << ventilator_1);
		_delay_ms(200);
		vetrak_1=0;
		}

		if (vetrak_2==1){
		PORTB |= (1 << ventilator_2);
		_delay_ms(200);
		PORTB &= ~(1 << ventilator_2);
		_delay_ms(200);
		vetrak_2=0;
		}
	}
return 0;  
}  
0

Používateľov profilový obrázok
jirka.jirka.
Ultimate člen
Ultimate člen
Príspevky: 1538
Dátum registrácie: 17 Okt 2008, 00:00
Bydlisko: Uherské Hradiště
Kontaktovať používateľa:

Re: ATtiny2313 a přerušení

Príspevok od používateľa jirka.jirka. » 03 Feb 2014, 20:06

No takže chyba musí být v přerušení. Nyní jsem vytvořil něco takového a předpokládal bych, že cca jednou za 8s by relé mělo změnit stav (zapnuto/vypnuto), ale neděje se tak.

Přerušení jsem upravil takto:

Kód: Vybrať všetko

volatile unsigned char 	tl_prodleva_1=0,tl_present_1,tl_prodleva_2,tl_present_2 ;
ISR (TIMER0_COMPA_vect) {//compare interrupt A
	
	tl_prodleva_1++;
	if (tl_prodleva_1 >= 500){
		PORTB ^= (1 << ventilator_1);
		tl_prodleva_1=0;
		}

}
0

Hinsi

Re: ATtiny2313 a přerušení

Príspevok od používateľa Hinsi » 03 Feb 2014, 21:32

tl_prodleva_1 je doufám 16bitová proměná, deklarovaná jako volatile. ?

Používateľov profilový obrázok
jirka.jirka.
Ultimate člen
Ultimate člen
Príspevky: 1538
Dátum registrácie: 17 Okt 2008, 00:00
Bydlisko: Uherské Hradiště
Kontaktovať používateľa:

Re: ATtiny2313 a přerušení

Príspevok od používateľa jirka.jirka. » 03 Feb 2014, 21:40

Hinsi, měl jsi pravdu. :lol: Jsem to ale tupec, tak nyní už vím, že přerušení funguje. :rolleyes:

No nic tak jdu pokračovat.

EDIT: Volatile byla, ale nebyla 16bit ale jenom 8 bit.
0

Napísať odpoveď