Kocon Napisano Wrzesień 7, 2013 Udostępnij Napisano Wrzesień 7, 2013 Witam, mam problem z następującym programem : #include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> #define LED (1<<PC0) #define PRZERWANIE (1<<PD2) volatile uint8_t a=0;//zmienna licznik int main(void) { DDRC = 0xFF; //cały port C jako wyjście DDRD &= ~(1<<PRZERWANIE); //konfiguracja 2 pinu portu D jako wejście PORTD |= 1<<PRZERWANIE; //ustawienie rezystora podciągającego MCUCR |= 1<<ISC01; //konfiguracja przerwania INT0 GICR |= 1<<INT0; //włączenie przerwania INT0 sei(); //globalne włączenie przerwań while(1) //pusta pętla { switch(a) { case 0: PORTC=0x00; break; case 1: PORTC=0x11; break; case 2: PORTC=0x22; break; case 3: PORTC=0x33; break; case 4: a=0; break; } } } SIGNAL(SIG_INTERRUPT0) //początek funkcji obsługi przerwania { ++a; } Program się zawiesza po maksymalnie kilku sekundach pracy. Całość jest uruchamiana na płytce stykowej, dołożyłem kondensatory i dławik do filtracji zasilania. Program jest prosty, gdy podam zbocze opadające na wejście int0 ma zostać inkrementowana zmienna a zależnie od tej zmiennej wyjścia portu C mają się zmieniać, gdy zmienna przekroczy wartość 3 zostaje zmniejszona do 0 i tak w kółko 🙂 Może któryś z szanownych kolegów pomoże mi znaleźć błąd ? Cytuj Link do komentarza Share on other sites More sharing options...
MirekCz Wrzesień 7, 2013 Udostępnij Wrzesień 7, 2013 Program się zawiesza jak nie ciśniesz żadnych przycisków? Jedna z możliwości jest taka, że przez drgania styków jedno naciśnięcie przycisku może wygenerować wielokrotne wywołanie przerwania... jak a przejdzie w 5 to już pętla główna nic z tym nie zrobi i program się "wiesza". Sugerowane zmiany: 1. Ustaw jakiś timer, który miga diodą, żeby kontrolować czy procesor nadal działa czy nie (timer niezależny od reszty programu). 2. Zmień kod przerwania na: if (++a > 3) a=0; W ten sposób to w kodzie przerwania resetujesz a i nigdy nie wyjdzie poza interesujący Ciebie zakres. Co zrobić żeby rozwiązać problem drgania styków znajdziesz w internecie czy nawet na forum... 1 Cytuj Link do komentarza Share on other sites More sharing options...
Kocon Wrzesień 7, 2013 Autor tematu Udostępnij Wrzesień 7, 2013 Teraz wszystko jasne,jesteś genialny, nie wpadłbym na wyjście poza zakres podczas drgania styków, oczekiwałem do najwyżej 'przeskoku' o parę wartości w przód 🙂 Dziękuję, problem rozwiązany 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!