Atmega8, pomalé přerušení

Všetko čo sa týka mikropočítačov + Sekcia Arduino

Moderátori: psichac, Moderátori

DanielK
Stály člen
Stály člen
Príspevky: 282
Dátum registrácie: 28 Feb 2015, 14:55

Atmega8, pomalé přerušení

Príspevok od používateľa DanielK » 18 Dec 2021, 13:01

Ahoj,
tvořím malé piano, tlačítka jako vstup, piezo na výstupu, a pár LEDek na metronom.
Mám problém s čítačem, který se nedostává do přerušení tak často, jak bych potřeboval.
Zvolil jsem Timer0 a nastavil ho na přetečení do TCNT0 jsem zapsal 255, aby přerušení nastávalo co nejčastěji ve kterém se budou inkrementovat nějaké promněnné. Následně jsem chtěl změřit čas kdy přerušení nastane a kolik tiků budu potřebovat pro různé tóny, problém je v tom že přerušení nastává každých 0,319ms což jsou cca 3,1kHz a to je bohužel málo. Přidat krystal úplně nechci kvůli nízkému VCC kolem 3V.
Nějaký tip jak by se to nechalo vyřešit?

Kód: Vybrať všetko

volatile uint16_t count_C4= 0; 	//261Hz
volatile uint16_t count_Cs4= 0; 	//277Hz
volatile uint16_t count_D4= 0; 	//293Hz
volatile uint16_t count_Ds4= 0; 	//311Hz
volatile uint16_t count_E4= 0; 	//329Hz
volatile uint16_t count_F4= 0;	//349Hz
volatile uint16_t count_Fs4= 0;	//369Hz
volatile uint16_t count_G4= 0;	//392Hz
volatile uint16_t count_Gs4= 0;	//415Hz
volatile uint16_t count_A4= 0;	//440Hz
volatile uint16_t count_As4= 0;	//466Hz
volatile uint16_t count_B4= 0;	//493Hz


int main (void) {

	DDRB = 0b00000010; 	// set IO PB1 out
	DDRD = 0b00000000; 	// set IO
	DDRC = 0b00111100; 	// set IO PC2,3,4,5 out
	
	PORTD |= (1 << PD0); // pull up
	PORTD |= (1 << PD1); // pull up
	PORTD |= (1 << PD2); // pull up
	PORTD |= (1 << PD3); // pull up
	PORTD |= (1 << PD4); // pull up
	PORTD |= (1 << PD5); // pull up
	PORTD |= (1 << PD6); // pull up
	PORTD |= (1 << PD7); // pull up

	PORTB |= (1 << PB0); // pull up
	PORTB |= (1 << PB2); // pull up
	PORTB |= (1 << PB3); // pull up
	PORTB |= (1 << PB4); // pull up
	PORTB |= (1 << PB5); // pull up

	PORTC |= (1 << PC0); // pull up
	PORTC |= (1 << PC1); // pull up	
	
	
	
	
	TCNT0 = 255;

	TCCR0 |= (1<<CS00); // NO PRESCALER

	TIMSK = (1<<TOIE0); //Timer/Counter0 Overflow Interrupt Enable





	sei(); // povolení globálního přerušení

	while(1){
			//C4
			if(((PIND & (1 << PD0)) == 0) & (count_C4>=30)){  
				PORTB ^= (1 << PB1);		
				count_C4 = 0;
			}
			if(count_C4>=57){
				count_A4 = 0;
			}
			
			//Cs4
			if(((PIND & (1 << PD1)) == 0) & (count_Cs4>=30)){  
				PORTB ^= (1 << PB1);		
				count_Cs4 = 0;
			}
			if(count_Cs4>=57){
				count_As4 = 0;
			}			
			
			//D4
			if(((PIND & (1 << PD2)) == 0) & (count_D4>=30)){  
				PORTB ^= (1 << PB1);		
				count_D4 = 0;
			}
			if(count_D4>=57){
				count_D4 = 0;
			}
		
			//Ds4
			if(((PIND & (1 << PD3)) == 0) & (count_Ds4>=30)){  
				PORTB ^= (1 << PB1);		
				count_Ds4 = 0;
			}
			if(count_Ds4>=57){
				count_Ds4 = 0;
			}

			//E4
			if(((PIND & (1 << PD4)) == 0) & (count_E4>=30)){  
				PORTB ^= (1 << PB1);		
				count_E4 = 0;
			}
			if(count_E4>=57){
				count_E4 = 0;
			}
			
			//F4
			if(((PIND & (1 << PD6)) == 0) & (count_F4>=30)){  
				PORTB ^= (1 << PB1);		
				count_F4 = 0;
			}
			if(count_F4>=57){
				count_F4 = 0;
			}

			//Fs4
			if(((PIND & (1 << PD5)) == 0) & (count_Fs4>=30)){  
				PORTB ^= (1 << PB1);		
				count_Fs4 = 0;
			}
			if(count_Fs4>=57){
				count_Fs4 = 0;
			}		

			//G4
			if(((PIND & (1 << PD7)) == 0) & (count_G4>=30)){  
				PORTB ^= (1 << PB1);		
				count_G4 = 0;
			}
			if(count_G4>=57){
				count_G4 = 0;
			}

			//Gs4
			if(((PINB & (1 << PB0)) == 0) & (count_Gs4>=30)){  
				PORTB ^= (1 << PB1);		
				count_Gs4 = 0;
			}
			if(count_A4>=57){
				count_A4 = 0;
			}
			
			//A4
			if(((PINB & (1 << PB4)) == 0) & (count_A4>=30)){  
				PORTB ^= (1 << PB1);		
				count_A4 = 0;
			}
			if(count_A4>=57){
				count_A4 = 0;
			}
			
			//As4
			if(((PINB & (1 << PB3)) == 0) & (count_As4>=30)){  
				PORTB ^= (1 << PB1);		
				count_As4 = 0;
			}
			if(count_As4>=57){
				count_As4 = 0;
			}

			//B
			if(((PINB & (1 << PB2)) == 0) & (count_B4>=30)){  
				PORTB ^= (1 << PB1);		
				count_B4 = 0;
			}
			if(count_B4>=57){
				count_B4 = 0;
			}


		} //while
	} //main
	

ISR (TIMER0_OVF_vect){ // 0,319ms
	TCNT0 = 255;

	count_C4 ++;	//261Hz
	count_Cs4++;	//277Hz
	count_D4 ++;	//293Hz
	count_Ds4++;	//311Hz
	count_E4 ++;	//329Hz
	count_F4 ++;	//349Hz
	count_Fs4++;	//369Hz
	count_G4 ++;	//392Hz
	count_Gs4++;	//415Hz
	count_A4 ++;	//440Hz
	count_As4++;	//466Hz
	count_B4 ++;	//493Hz
	PORTC ^= (1 << PC2); // debug
}
0

Atlan
Zaslúžilý člen
Zaslúžilý člen
Príspevky: 1146
Dátum registrácie: 01 Feb 2008, 00:00
Bydlisko: Kosice okolie

Re: Atmega8, pomalé přerušení

Príspevok od používateľa Atlan » 18 Dec 2021, 13:33

Naprogramuj si poistky aby bezal na 8Mhz pac ti teraz asi beha na 1Mhz.

Vtedy by malo byt prerusenie kazdych 35us
1
Obrázok 1

peterple
Ultimate člen
Ultimate člen
Príspevky: 2328
Dátum registrácie: 25 Jún 2013, 21:06
Bydlisko: Krajné
Vek: 57
Kontaktovať používateľa:

Re: Atmega8, pomalé přerušení

Príspevok od používateľa peterple » 18 Dec 2021, 20:29

Nemôžeš nastaviť preddelič na 1 a ešte aj skrátiť cyklus čítača na 1 impulz. To by znamenalo že prerušenie nastane každý jeden strojový cyklus. Ty si nezmeral ako rýchlo nastáva prerušenie, ale ako dlho trvá obsluha prerušenia. Skompiloval som si tvoj program a obsluha prerušenia má dĺžku 147 slov. Presná dĺžka bude však o trochu dlhšia. Jednak je tam réžia na začiatku a konci obsluhy a ďalej niektoré inštrukcie môžu trvať aj 2 strojové cykly. Ani ten 1MHz nebude úplne presný. A to sedí s tým čo si nameral. Takže interný generátor 1MHz (fabrické nastavenie). Predpokladám že si meral periódu toho negovaného signálu na pine PC2, takže očakávaná hodnota je okolo 150*2=300μs čo si v podstate nameral.
Ak chceš ísť na maximum tak do toho musíš poriadne vidieť. Napríklad si v hlavnom programe vôbec nelámeš hlavu s atomickým prístupom.
Takémuto projektu by vôbec neškodilo keby si prešaltoval na assembler. Lebo tam bude treba škudliť každú jednu inštrukciu aj keď to zdvihneš na 8MHz alebo aj 16Mhz.
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

maskrtnik01
Ultimate člen
Ultimate člen
Príspevky: 2563
Dátum registrácie: 20 Júl 2010, 00:00
Bydlisko: okolie KE
Vek: 27

Re: Atmega8, pomalé přerušení

Príspevok od používateľa maskrtnik01 » 18 Dec 2021, 21:40

Ja vidím dve možnosti ako realizovať primitívny generátor tónov. Obidva si zaslúžia taktovanie kryštálom.

Časovač nastaviť na 8bit PWM, strieda cca 50%, frekvencia zodpovedajúca požadovanému tónu. Funkcie softwaru sa zredukujú na nastavovanie časovača.

Prehrávač raw zvukových dát. MCU taktovať najrýchlejšie ako sa dá. Časovač opäť na 8bit PWM. Do polí si uložiť waveform požadovaných tónov pri vzorkovacej frekvencii rovnej frekvencii PWM. V obsluhe prerušenia už len prechádzať cez pole a zaradom nastavovať hodnoty v poli do striedy.
0

michal312
Stály člen
Stály člen
Príspevky: 385
Dátum registrácie: 30 Dec 2007, 00:00
Bydlisko: Hlohovec

Re: Atmega8, pomalé přerušení

Príspevok od používateľa michal312 » 07 Jan 2022, 11:42

Ahojte nechcem zakladat novu temu ale kedze sa to tyka prerusenia v atmege8 tak to dam sem.
Trosku som sa hral s prerusenim na TIMER0 nastavil som si prerusenie na pretecenie. Prerusenia som si nastavil na rozne hodnoty pomocou delicky .Ked som meral s logickym analyzerom ako casto mam prerusenia aktivne sedelo mi to presne.

Dalej chcel som si este potvrdit pomocou bitu TOV0 v registri TIFR ci je taktiez nasetovani kazdym pretecenim. Vdatasheete sa pise ze je nastaveny na hodnotu 1 pri kazdom preteceni. Ja som tento bit nameral aktivny pravidelne pri kazdom piatom preteceni (preruseni). Vie mi niekto vysvetlit preco? Programovane je to v AS7. Dakujem
0

peterple
Ultimate člen
Ultimate člen
Príspevky: 2328
Dátum registrácie: 25 Jún 2013, 21:06
Bydlisko: Krajné
Vek: 57
Kontaktovať používateľa:

Re: Atmega8, pomalé přerušení

Príspevok od používateľa peterple » 07 Jan 2022, 18:21

To čo sa píše v DS je pravda. Ak by nebola tak by to prerušenie nenastalo. Tvoje meranie TOV0 je určite chybné. Ale keďže neviem ako si ho robil neviem vysvetliť ani prečo je chybné. Snáď len citácia z DS
The bit TOV0 is set (one) when an overflow occurs in Timer/Counter0. TOV0 is cleared by hardware
when executing the corresponding interrupt Handling Vector.
Ak je teda I v SREG nahodený tak TOV0 sa nuluje akonáhle sa spustí jeho obsluha. Teda doba pokiaľ je nastavený je za normálnych okolností doba spracovania aktuálnej inštrukcie (zvyčajne jeden strojový cyklus).
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

michal312
Stály člen
Stály člen
Príspevky: 385
Dátum registrácie: 30 Dec 2007, 00:00
Bydlisko: Hlohovec

Re: Atmega8, pomalé přerušení

Príspevok od používateľa michal312 » 07 Jan 2022, 20:52

Kod je uplne primitivny ako som spominal len si otestovat TOV0

Kód: Vybrať všetko

#define F_CPU 12000000  
#include <avr/io.h>
#include <avr/interrupt.h>

#define _test_OVF 6
#define _Test_LED_ 7
#define test 5

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

volatile unsigned char Timer0 = 0; 

ISR(TIMER0_OVF_vect){
	
	Timer0++;	
}

int main(void)
{
	DDRD|=(1<<_test_OVF);
	DDRD|=(1<<_Test_LED_);
	DDRD|=(1<<test);
	
	TCCR0|=(1<<CS02)|(1<<CS00); ///prescaler 1024 
	SET(TIMSK,TOIE0); //enable ovf T0
	TCNT0 = 0;
	sei(); //povol globálne prerušenia
	
     while (1)
	{
		if(TST(TIFR,TOV0)== 1)SET(PORTD,PD6);
			else RESET(PORTD,PD6);
		
		
		if (Timer0)
		{
			SET(PORTD,PD5);
			Timer0 = 0;			
		}
	    	else RESET(PORTD,PD5);		
			
	}
}
A tu je screen s analyzera. Channel0 je PD5. CHannel2 je PD6. Ako vidno s obrazku pretecenia na channel0 su v poriadku ale priznaky TOV0 su aktivne kazde siedme pretecenie.
Skusal som sa hrat aj s optimalizaciou ale bolo to este horsie.Momentalne to mam na -Os
Prílohy
interupt.PNG
0

Atlan
Zaslúžilý člen
Zaslúžilý člen
Príspevky: 1146
Dátum registrácie: 01 Feb 2008, 00:00
Bydlisko: Kosice okolie

Re: Atmega8, pomalé přerušení

Príspevok od používateľa Atlan » 07 Jan 2022, 21:17

Lenze hned ako je splnena podmienka ifes to prerusenia, takze to v maine je uz nepodstatne pac sa v preruseni ten bit vynulujeca v maine o tom ani nebudu vediet.
0

peterple
Ultimate člen
Ultimate člen
Príspevky: 2328
Dátum registrácie: 25 Jún 2013, 21:06
Bydlisko: Krajné
Vek: 57
Kontaktovať používateľa:

Re: Atmega8, pomalé přerušení

Príspevok od používateľa peterple » 07 Jan 2022, 21:18

Tak potom je to už jasné. Odpoveď je skrytá už v tom čo som písal. Máš povolené prerušenia. Teda ak TOV0 naskočí do aktívneho stavu tak sa vykoná iba jediná inštrukcia a začne sa okamžite jeho obsluha. To TOV0 zároveň vynuluje. Teda jediná šanca kedy môžeš trafiť nastavený TOV0 je vtedy keď práve je na rade inštrukcia čo ho testuje. Lenže to sme už na ASM úrovni a to neviem ako si tam pevný v kramflekoch.
Dajme tomu že ten while má povedzme celkovo 10 inštrukcií (len tak som strelil - nechce sa mi to kompilovať). Potom je v prípade že sa prerušenie posúva o jednu inštrukciu hlavného programu. Zase som strelil lebo to záleží na počte inštrukcií while, počte inštrukcii prerušenia, a asi aj preddeliči. Tak je pravdepodobnosť 1/10 že to vyjde zrovna na tú inštrukciu čo to testuje.

Ak chceš toto otestovať. Tak musíš mať zakázané prerušenie. Testovať TOV0 a ak je jedna tak nastalo pretečenie - nastavil sa príznak TOV0. Aby si to bol schopný detegovať opäť tak ho musíš vynulovať. Tak že na jeho pozíciu TIFR zapíšeš jednotku (popis z DS). Samozrejme prerušovacia rutina sa nezavolá, lebo je to zakázané.
Jasné?
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

peterple
Ultimate člen
Ultimate člen
Príspevky: 2328
Dátum registrácie: 25 Jún 2013, 21:06
Bydlisko: Krajné
Vek: 57
Kontaktovať používateľa:

Re: Atmega8, pomalé přerušení

Príspevok od používateľa peterple » 07 Jan 2022, 21:30

Atlan:
Ale bude. Ako vidíš. Sem tam sa to trafí na tú testovaciu inštrukciu a vtedy mu to ten pin nahodí, lebo práve na tejto inštrukci TOV0 naskakuje na jednotku (alebo jednu pred ňou). Je to len vďaka tomu že počet inštrukcií vo while má strašne malý. A tiež sa tie pomery pekne posadali takže sa to posúva vždy na nejakú inú inštrukciu. Ono by to náhodou mohlo dopadnúť aj tak že by sa to nenapasovalo nikdy. A dokonca aj tak že vždy. To by bola taká náhoda ako vyhrať v očkovacej lotérii.

Inak takto napísaný kód sa volá časovaná bomba. Ak by main mal milión inštrukcií a ten test by viedol na kód ktorý by obsahoval nejakú chybu, tak pri všetkých testoch takéhoto výrobku (napr. brake controler) by všetko fungovalo. Len potom by nabehla masová výroba a to už by sa sem tam stalo že by brzdy zlyhali, len by nikto nevedel prečo.
Tak bacha na to. Pracovať s prerušeniami treba vedieť. Pekné že si to pán takto odskúšal a čuduje sa tomu, ako to "nefunguje".
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

Atlan
Zaslúžilý člen
Zaslúžilý člen
Príspevky: 1146
Dátum registrácie: 01 Feb 2008, 00:00
Bydlisko: Kosice okolie

Re: Atmega8, pomalé přerušení

Príspevok od používateľa Atlan » 07 Jan 2022, 22:29

Az tam da nejakenoneskorenie, kludne sa mu to bude stretat na 10 pokus alebo na 100 zaleI od toho kedy sa to pretne.
0

michal312
Stály člen
Stály člen
Príspevky: 385
Dátum registrácie: 30 Dec 2007, 00:00
Bydlisko: Hlohovec

Re: Atmega8, pomalé přerušení

Príspevok od používateľa michal312 » 07 Jan 2022, 23:33

peterple napísal:
07 Jan 2022, 21:18
Dajme tomu že ten while má povedzme celkovo 10 inštrukcií (len tak som strelil - nechce sa mi to kompilovať). Potom je v prípade že sa prerušenie posúva o jednu inštrukciu hlavného programu.
Dakujem za vysvetlenie, uz mi to dava zmysel. Tymto stylom by som nekodil. Ako som spomenul chcel som len otestovat vyvolanie prerusenia cez priznakovy bit. Co sa tyka assembleru tam moje vedomosti koncia, ale aspon si ma nasmeroval kde je problem budem skusat dalej.

peterple napísal:
07 Jan 2022, 21:18
Ak chceš toto otestovať. Tak musíš mať zakázané prerušenie. Testovať TOV0 a ak je jedna tak nastalo pretečenie - nastavil sa príznak TOV0. Aby si to bol schopný detegovať opäť tak ho musíš vynulovať. Tak že na jeho pozíciu TIFR zapíšeš jednotku (popis z DS). Samozrejme prerušovacia rutina sa nezavolá, lebo je to zakázané.
Jasné?
V podstate je mi to jasne ale az som dobre pochopil ak by som testoval priznak prerusenia tymto sposobom tak mi neprebehne prerusenie. Spravne?
0

peterple
Ultimate člen
Ultimate člen
Príspevky: 2328
Dátum registrácie: 25 Jún 2013, 21:06
Bydlisko: Krajné
Vek: 57
Kontaktovať používateľa:

Re: Atmega8, pomalé přerušení

Príspevok od používateľa peterple » 08 Jan 2022, 10:01

Ja viem že toto je výskumný program. Myslel som to ako pochvalu že si to snažíš ujasniť. Bohužial je veľa začiatočníkov čo si s tým hlavu nelámu. Potom vznikajú výtvory ktorých funkčnosť je viac dielom náhody ako úmyslu.
Ak nepovolíš prerušenie, tak samozrejme hw volanie prerušovacej rutiny neprebehne. V takom prípade si ju musíš zavolať sám a aj vynulovať ten príznak.
Existoval ešte jeden scenár ako prísť na to že TOV0 naskočí. Preto som sa pýtal na kód aký si použil. Ten scenár je že prerušenie bude povolené. Obsluha prerušenia bude natiahnutá tak aby bola trochu dlhšia ako je doba pretečenia časovača. V takom prípade na konci prerušenia pozrieš TOV0 a on bude nastavený a keďže obsluhuješ stále to prvé prerušenie tak ďalšie sa obslúžiť nemôže a preto vidíš že TOV0 je nahodený. Keď potom ukončíš obsluhu prerušenia tak sa z hlavného programu vykoná jediná inštrukcia a opäť vbehneš do obsluhy pretečenia lebo TOV0 je nastavený. Takto ale v každom prerušení naberieš nejaký sklz a nakoniec sa nejaké to pretečenie časovača stratí.
Tie príznaky sú ako jednobitová pamäť ktorá podrží informáciu o tom že sledovaná udalosť nastala. Pretože tých zdrojom prerušenia je v procesore veľa a potom sa obsluhujú podľa priority, ak niektoré nastanú súčasne alebo s prekrytím.
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

michal312
Stály člen
Stály člen
Príspevky: 385
Dátum registrácie: 30 Dec 2007, 00:00
Bydlisko: Hlohovec

Re: Atmega8, pomalé přerušení

Príspevok od používateľa michal312 » 08 Jan 2022, 11:34

Este som si chcel overit kolko strojovych instrukcii trva while a je to tak ako si hovoril. Podla toho co sa mi vygenerovalo v jednom zo suborov pri kompilacii. V hlavnom programe sa vykonava 7 instrukcii co zodpoveda aj tomu screenu s analyzera.

Kód: Vybrať všetko

	    while(1){	
			
		if(TST(TIFR,TOV0)== 1){
  9c:	08 b6       	in	r0, 0x38	; 56
  9e:	00 fe       	sbrs	r0, 0
  a0:	04 c0       	rjmp	.+8      	; 0xaa <main+0x2e>
				SET(PORTD,PD6);
  a2:	82 b3       	in	r24, 0x12	; 18
  a4:	80 64       	ori	r24, 0x40	; 64
  a6:	82 bb       	out	0x12, r24	; 18
  a8:	f9 cf       	rjmp	.-14     	; 0x9c <main+0x20>
			
			}
			else RESET(PORTD,PD6);
  aa:	82 b3       	in	r24, 0x12	; 18
  ac:	8f 7b       	andi	r24, 0xBF	; 191
  ae:	82 bb       	out	0x12, r24	; 18
  b0:	f5 cf       	rjmp	.-22     	; 0x9c <main+0x20>

000000b2 <_exit>:
  b2:	f8 94       	cli

000000b4 <__stop_program>:
  b4:	ff cf       	rjmp	.-2      	; 0xb4 <__stop_program>
Dal si mi do hlavy chrobaka s tym assemblerom. Trochu som nad tym uvazoval mozno instrukcie na reset by stacilo vykonavat len raz hned po tom co prebehne zapis na pd6. Tym padom by som si to skratil cakanie na TOV0 na tri instrukcie.
0

peterple
Ultimate člen
Ultimate člen
Príspevky: 2328
Dátum registrácie: 25 Jún 2013, 21:06
Bydlisko: Krajné
Vek: 57
Kontaktovať používateľa:

Re: Atmega8, pomalé přerušení

Príspevok od používateľa peterple » 08 Jan 2022, 12:28

Áno ten reset PD6 ak presunieš z else vetvy tak sa tá mainloop naozaj skráti.
Pozor na to že nie každá inštrukcia trvá jeden strojový cyklus. Niektoré aj viac. V tvojom prípade RJMP trvá dva cykly, lebo nepodmienený skok nabúra pipelining. Takže je treba počkať až sa načíta nová inštrukcia. Podmienené skoky navyše trvajú rôzne podľa toho či stav bol pravda alebo nepravda.

Ešte oprava. V tomto kóde nie je pre detekciu podstatná inštrukcia testu ale inštrukcia

Kód: Vybrať všetko

9c:	08 b6       	in	r0, 0x38	; 56
Ak je v jej dobe vykonania TOV0 nastavený, tak sa najprv po jej dokončení vykoná obsluha prerušenia a potom sa nahodí PD6. Na všetkých ostatných inštrukciách TOV0 nahodenie nezbadáš.
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

michal312
Stály člen
Stály člen
Príspevky: 385
Dátum registrácie: 30 Dec 2007, 00:00
Bydlisko: Hlohovec

Re: Atmega8, pomalé přerušení

Príspevok od používateľa michal312 » 08 Jan 2022, 14:00

Dakujem za vysvetlenie, este som sa s tym chvilu pohral odkrokoval v simulatore teraz je mi vsetko jasne. Ale neviem si predstavit tento bit testovat v hlavnej slucke ked tam bude 200-300 riadkov prip 1000. Ak dobre chapem v podstate tento flag je v praxi nepouzitelny.
0

peterple
Ultimate člen
Ultimate člen
Príspevky: 2328
Dátum registrácie: 25 Jún 2013, 21:06
Bydlisko: Krajné
Vek: 57
Kontaktovať používateľa:

Re: Atmega8, pomalé přerušení

Príspevok od používateľa peterple » 08 Jan 2022, 17:04

Ten bit sa používa dvomi cestami.
HW cesta - je povolené globálne prerušenie. Sledovaná udalosť nahadzuje bit, to má za následok automatické prerušenie behu programu a odskok do obsluhy prerušenia a automatické vynulovanie bitu. Všetko sa deje bez účasti programu a bez potreby aby to programátor nejako riešil.
SW cesta - je zakázané prerušenie. Bit (alebo viaceré) je testovaný v nejakej slučke. V prípade zistenia že udalosť nastala, tak je ju potrebne obslúžiť a aj deaktivovať. Volá sa to polling a funguje to len ak ten sw je v tej slučke. Každá cesta má niečo do seba. Na konštruktérovi je to aby poznal výhody a nevýhody každej cesty a vedel to správne urobiť tak aby to plnilo to čo treba.
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

Napísať odpoveď