Skocz do zawartości

[Atmega 8 C] Zawieszający się program


Kocon

Pomocna odpowiedź

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 ?

Link do komentarza
Share on other sites

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

  • Lubię! 1
Link do komentarza
Share on other sites

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

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.