ATmega32 , problem z przerwanie zewnętrznym

To forum jest dla wszystkich pasjonatów mikrokontrolerów AVR Atmela. Wymiana doświadczeń i pomoc dla początkujących w pisaniu programów zarówno w C, Asemblerze jak i BASCOM. Zapraszam znawców tematu, aby pomogli wszystkim początkującym!
ODPOWIEDZ
atmega
-
Posty: 26
Rejestracja: 07 cze 2008, 20:17
Lokalizacja: Gdańsk

ATmega32 , problem z przerwanie zewnętrznym

Post autor: atmega » 26 sie 2008, 15:39

Witam w kolejnym temacie.

Niedawno porzuciłem( tak na chwilkę ) mój kochany assembler i rozpocząłem przygodę z językiem C. Otóż problem wygląda następująco : Jest to wycięty fragment obsługi matrycy klawiszowe :

Kod: Zaznacz cały

SIGNAL (SIG_INTERRUPT0)
	{
 	TimeDelay(30);
	if(!NewKey)
		{
		NewKey = 1;
		  if(KEYB == 0b00001110){Key = 0;}
		  if(KEYB == 0b00001101){Key = 4;}
		  if(KEYB == 0b00001011){Key = 8;}
		  if(KEYB == 0b00000111){Key = 12;}
		KEYSD = 0b00001111;
		KEYSP = 0b11110000;
        TimeDelay(15);
		  if(KEYB == 0b11100000){Key += 0;}
		  if(KEYB == 0b11010000){Key += 1;}
		  if(KEYB == 0b10110000){Key += 2;}
		  if(KEYB == 0b01110000){Key += 3;}
		KEYSD = 0b11110000;
		KEYSP = 0b00001111;
		GIFR = 1<<INTF0;
        TimeDelay(15);
		}
	else
		{
		TimeDelay(30);
	//	NewKey = 0;
		}
	}
1) Pewnie was zastanawia co robi "GIFR = 1<<INTF0 " w środku przerwania . Otóż bez tej linijeczki zaraz po wyjściu wywołane zostaje jakby ponowne przerwanie Bóg wiedzieć czemu.
Teraz mistrzowie pytanie . Zbocze opadające wywołuje przerwanie, program wykonuje wszystko ładnie pięknie , wraca skąd "uciekł" , puszczamy klawisz mamy zbocze narastające przechodzimy do obsługi else'a i po nim program już nie wraca skąd wrócił . Teraz pytanie co jest nie tak ? SP jest w porządku.
Ostatnio zmieniony 27 sie 2008, 6:33 przez atmega, łącznie zmieniany 3 razy.

ZbeeGin

Post autor: ZbeeGin » 26 sie 2008, 18:13

A teraz pokaż kod gdzie ustalasz co wywołuje przerwanie: zbocze narastające, zbocze opadające, stan niski. Rekonfiguracja przerwania w locie skutkować może fałszywymi wyzowleniami przerwania.
atmega pisze:1) Pewnie was zastanawia co robi "GIFR = 1<<INTF0 " w środku przerwania . Otóż bez tej linijeczki zaraz po wyjściu wywołane zostaje jakby ponowne przerwanie Bóg wiedzieć czemu.
Sprawa wygląda tak, jakbyś tą konfigurację pominął lub ustawił stan niski - stąd retriggering przerwania.
atmega pisze:Teraz mistrzowie pytanie . Zbocze opadające wywołuje przerwanie, program wykonuje wszystko ładnie pięknie , wraca skąd "uciekł" , puszczamy klawisz mamy zbocze narastające przechodzimy do obsługi else'a i po nim program już nie wraca skąd wrócił .
A zmienna NewKey jest określoina jako voliatile?

atmega
-
Posty: 26
Rejestracja: 07 cze 2008, 20:17
Lokalizacja: Gdańsk

Post autor: atmega » 26 sie 2008, 20:53

Kod: Zaznacz cały

MCUCR = 1<<ISC00;
GIFR = 1<<INTF0;
GICR = 1<<INT0;

Przerwanie uruchamiane dwoma zboczami.

Kod: Zaznacz cały

A zmienna NewKey jest określoina jako voliatile
Nie była . Zmieniłem , ale dalej to nie pomaga - Ale to raczej nie jest problem bo do obsługi else'a przechodzi ( czyli warunek tu nie sprawia problemu ) , wszystko wykonuje się poprawnie i przy wychodzeniu z procedury obsługującej przerwanie program "głupieje".

ODPOWIEDZ