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 i przerwania-co tu nie gra??

leszcz84 02 Gru 2010 23:44 1238 7
REKLAMA
  • #1 8819076
    leszcz84
    Poziom 11  
    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  
    Zmienna "a" musi być "volatile".
  • REKLAMA
  • #3 8821269
    Andrzej__S
    Poziom 28  
    Zmienna a musi też być typu unsigned int, żeby mogła przyjąć wartość 65000.
  • REKLAMA
  • #4 8821660
    Konto nie istnieje
    Poziom 1  
  • #5 8822726
    leszcz84
    Poziom 11  
    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??
  • REKLAMA
  • #7 8823086
    maniex
    Poziom 10  
    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  
    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.
REKLAMA