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

[ATtiny2313][C] Problem z obsługą przerwania

m3 29 Kwi 2010 09:28 1253 8
REKLAMA
  • #1 8015639
    m3
    Poziom 12  
    Witam serdecznie,

    Walczę z przerwaniami już jakiś czas i niestety bezskutecznie, dlatego zwracam się o pomoc. Pod PIND2 (odpowiedzialny za przerwania) podpinam przycisk podciągnięty do plusa. Pod Portem B mam LEDY. Chce aby przyciśniecie przycisku gasiło dany LED a puszczenie przycisku go z powrotem zapalało. Przerwania wykrywam na zmianę stanu logicznego. Chce to zrobić na przerwaniu pochodzącym z jednego pinu. Da się to zrobić?

    Poniżej kod.

    
    
    ISR(INT0_vect)
    {
    	PORTB |= (PIND2 << 0);
    }
    
    int main()
    {
    	// ustawienie parametrow dla przerwania
    	MCUCR |= (1 << ISC00) | (0 << ISC01); // czy na INT0 jest zmiana stanu
    
    	GIMSK |= (1 << INT0);
    
    	DDRB = 0xFF; // wyjscie dla B (ledy)
    	PORTB = 0x00; 
    
    	DDRD = 0x00;  // wejscie dla przyciskow, normalnie stan niski
    	PORTD = 0xFF;		
    
    	SREG = 0x80; // wlaczenie globalnego przerwania
    
    	while(1)
    	{
    		asm("nop");
    	}
    }
    
  • REKLAMA
  • REKLAMA
  • #3 8015672
    m3
    Poziom 12  
    Już tłumacze o co chodzi. W momencie obsługi przerwania jest właśnie wywoływane to co zacytowałeś czyli na PORTB0 ustawiany jest stan (0 lub 1), pochodzący z PIND2 (przycisk). W rezultacie gasimy lub zapalamy LED.

    Wiem że pewnie jest bez sensu. A jak byś proponował to rozwiązać?
  • #4 8015695
    _Robak_
    Poziom 33  
    Nie bardzo wiem jak tą instrukcją chcesz zgasić już zapaloną diodę.
  • REKLAMA
  • #5 8015709
    Freddie Chopin
    Specjalista - Mikrokontrolery
    PIND2 nie jest żadną zmienną, tylko numerem pinu (2)...

    Żeby zrobić to co chcesz, to musisz zrobić coś na styl:
    PORTx &= ~(1 << pinX);
    PORTx |= ((PINy & (1 << pinY)) >> pinY) << pinX;

    4\/3!!
  • #6 8015788
    m3
    Poziom 12  
    No dobrze ale Ty masz tutaj PinX i PinY. Problem w tym że ja wykorzystuje tutaj tylko jeden przycisk do zapalania i gaszenia diody. No chyba że ten drugi Pin pochodzi od LEDa?
  • REKLAMA
  • Pomocny post
    #8 8016227
    uuidgen
    Poziom 12  
    if((PIND & _BV(PD2))
    PORTB |= _BV(PB2);
    else
    PORTB &=~_BV(PB2);
    Jak to ewentualnie zapisać w jednej linii to już sam pomyśl.
  • #9 8018688
    m3
    Poziom 12  
    Dzieki Panowie za poświęcony czas.
    uuidgen, Twój kod działa :) dzięki
REKLAMA