Skocz do zawartości

[C] Prerwania od timera0 ATmega64.


co_pat

Pomocna odpowiedź

Witam!

Problem polega na tym, że gdy w obsłudze przerwania dodam coś więcej niż zmiana stanu portu to program jakby się zawiesza. Nie mam pojęcie dlaczego tak się dzieje.

//ZMIENNE GLOBALNE
volatile unsigned long miliSekundy=0;			


void Init(void){

DDRA=0xFF;										//port A jako wyjscie
DDRD=0x00;										//Potr D jako wejścia
PORTD=0xFF;										//z podziagnieciem do Vcc


}

void InitTimer0()							// Inicjalizacja Timera0 w trybie CTC do dokładnego odmierzania czasu
{
 TCNT0 = 0x00;								// Wyzerowanie zawartości rejestru Timera2

 /* Praca w trybie Clear Timer on Compare (CTC) */
 TCCR0 = 0x0a;								// 0 0 0 0 1 0 1 1 - linia portu OC2 odcięta, tryb: CTC,
										// 					 preskaler: 128;
										//					 Częstotliwość zegara: 16MHz/128 = 125kHz
 OCR0 = 125;								// Porównania będą następować z częstotliwością: 125kHz/125 = 1kHz
										// czyli reset co 1ms

 /* Aktywacja przerwań */
 Set(TIMSK, OCIE0);						// Zezwolenie na przerwanie od porównania
 Set(SREG, 7);								// Globalne zezwolenie na przerwania
}



int main(){

Init();
InitTimer0();

Clr(PORTA,PA3);
Set(PORTA,PA0);
Set(PORTA,PA1);

while(1){


}}



ISR(TIMER0_COMP_vect)	// Przerwanie występujące przy porównaniu (co 1ms)
{
 ++miliSekundy;


Flip(PORTA,PA2);					//DZIAŁA

/*
if(miliSekundy>=100){
miliSekundy=0;						// NIE DZIAŁA
	Flip(PORTA,PA2);}
 	*/
}
Link do komentarza
Share on other sites

Witam.

Spróbuj zadeklarować milisekundy w funkcji ISR ale jako static - wtedy po każdym wyjściu z funkcji jej wartość będzie "zapamiętywana" ale będzie niedostępna dla innych funkcji.

Poza tym po co zmienna typu Long jak odmierzasz do 100 uint8_t lub char, byte zupełnie by wystarczyły. Chyba, ze to jest dopiero część rozwojowa Twojego programu i będzie zliczał większe wartości.

Static podobnie jak volatile jest instrukcją preprocesora, w zależności w którym miejscu zadeklarujesz zmienną static słówko ma różne działania.

Deklaracja static wewnątrz funkcji powoduje przydzielenie zmiennej pamięci na stałe przy pierwszym wywołaniu funkcji, po wyjściu i wejściu do funkcji wartość zmiennej jest zachowana, ale tylko ta funkcja ma dostęp do tej zmiennej, z poziomu innej funkcji ta zmienna jest niewidoczna.

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.