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

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • 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.