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

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.