co_pat Napisano Grudzień 20, 2009 Udostępnij Napisano Grudzień 20, 2009 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);} */ } Cytuj Link do komentarza Share on other sites More sharing options...
Zuk Grudzień 28, 2009 Udostępnij Grudzień 28, 2009 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. Cytuj Link do komentarza Share on other sites More sharing options...
Pomocna odpowiedź
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!