logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Atmega8 - przerwania nie działają przy sterowaniu LED i przyciskami PC0-PC2

leszcz84 02 Gru 2010 23:44 1343 7
REKLAMA
  • #1 8819076
    leszcz84
    Poziom 11  
    Posty: 14
    Witam.
    Tak jak w temacie podłączyłem Atmege8.Pod PB0 podpiąłem LED,a do PC0, PC1 i PC2 przyciski zwierające wejście do masy. Układ ma generować miganie diody w następujący sposób:
    -wciskam PC2 uruchamia się generowanie częstotliwości co widać na diodzie LED
    -za pomocą przycisków PC0 i PC1 zwiększam lub zmniejszam częstotliwość migania diody. Kod napisany z użyciem samego timera i generowania sygnału co określony czas działa poprawnie. Po użyciu do tego celu przerwań nic się nie dzieje. Poniżej zamieszczam kod programu.Co tu jest nie tak??Program kompiluje się poprawnie i programuje Atmege,ale coś nie działa.

    #include <avr/io.h>
    #include <avr/iom8.h>
    #include <util/delay.h>
    int a=65000, b=0 ;
    
    ISR(TIMER1_OVF_vect)
    {
    	PORTB ^= (1 << 0); // Zmień stan diody LED
    	TCNT1 = 65536-a; // inicjuje wartość timera
    }
    int main (void)
    {
    DDRC = 0x00; // Ustawienie bitu  jako wejścia
    PORTC = 0xFF;//podciagniecie do plusa zasilania
    DDRB = 0xFF; //port B jako wyjście
    TCCR1A=0;
    TCCR1B |= (1 << CS10); // Ustawienie timera
    TIMSK = (1 << TOIE1);
    SREG=0x80;
    while (1)
    {
    	if(!(PINC &0x04))//jesli wcisniety pc2 to zwieksza b o jeden
    	{
    	b+=1;	
    	_delay_ms(30);
    	}
    	if(b>0)//jesli b jest wieksze od 0 to zaczyna generowac czestotliwosc
    	{		
    		if(!(PINC &0x02)) //jesli wcisniety pc1 to..
    		{
    		a+=1000;
    		_delay_ms(30);
    		}
    		if(!(PINC &0x01)) //jesli wcisniety pc0 to..
    		{
    		a-=1000;//zmniejsz a o 1000
    		_delay_ms(30);		
    		}
    	}	
    }
    }


    Proszę pamiętać o używaniu znaczników code. - arnoldziq
  • REKLAMA
  • #2 8820790
    landy13
    Poziom 31  
    Posty: 1418
    Pomógł: 195
    Ocena: 260
    Zmienna "a" musi być "volatile".
  • REKLAMA
  • #3 8821269
    Andrzej__S
    Poziom 28  
    Posty: 567
    Pomógł: 182
    Ocena: 65
    Zmienna a musi też być typu unsigned int, żeby mogła przyjąć wartość 65000.
  • REKLAMA
  • #4 8821660
    Konto nie istnieje
    Poziom 1  
  • REKLAMA
  • #5 8822726
    leszcz84
    Poziom 11  
    Posty: 14
    Niestety żadne z powyższych sposobów deklarowania zmiennej "a" nie przyniosły pozytywnego rezultatu. Układ zachowuje się dalej tak samo...Ma ktoś jeszcze jakieś pomysły??
  • #7 8823086
    maniex
    Poziom 10  
    Posty: 18
    Ocena: 1
    a może spróbuj przesunąć procedurę obsługi przerwania za funkcję main. a próbowałeś z biblioteką <avr/interrupt.h> ?
  • #8 8824283
    leszcz84
    Poziom 11  
    Posty: 14
    Witam.
    Panowie, układ działa :) . Dodałem bibliotekę "avr/interrupt.h" i tak jak napisał atom1477 zmieniłem TCNT1 = 65536-a na TCNT1 = 65535-a.Reszta programu pozostała bez zmian. Co do przycisku PC2 to nie zgadzam się z kolegą narasta gdyż PINC & 0x04 obsługuje właśnie ten przycisk, co widzę na działającym programie. Dziękuję wszystkim za pomoc i zamykam temat.

Podsumowanie tematu

LABEL_AI_GENERATED
Użytkownik podłączył mikrokontroler Atmega8, aby sterować diodą LED i przyciskami PC0, PC1 oraz PC2. Kod, który miał generować miganie diody, działał poprawnie bez użycia przerwań, ale po ich dodaniu nie funkcjonował. Użytkownicy zasugerowali, aby zmienna "a" była zadeklarowana jako "volatile" oraz jako typ unsigned int lub uint16_t. Po dalszych próbach, użytkownik dodał bibliotekę i zmienił inicjalizację timera z TCNT1 = 65536-a na TCNT1 = 65535-a, co rozwiązało problem.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA