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

[C] Program obsługujący przyciski ATtiny2313

warczyna 28 Maj 2011 16:35 1626 3
REKLAMA
  • #1 9553136
    warczyna
    Poziom 12  
    Napisałem program jak poniżej gdy wprowadzam wartości portu B bez pętli wszystko działa jak należy jednak kiedy dodaje ify by móc wykorzystać przyciski do ustawienia portu B nie dzieje się nic. Wartości jakie należy ustawić przeliczałem dwa razy a więc powinno być wszystko ok. Płytka też działa Prawdopodobnie jakoś źle stosuje pętle jednak nie wiem gdzie popełniam błąd czy mógłby ktoś pomóc?

    #define F_CPU 8000000L
    #include <avr/io.h>
    #include <util/delay.h>
    
    
    int main(void)
    {
    	/* Wszystkie linie portu B będą wyjściami */
    	DDRB = 0xff;
    	PORTB = 0xff;
    	/* PWszystkie linie portu D będą wejściami, PD2...PD5 podciągnięte do VCC */
    	DDRD = 0x00;
    	PORTD = 0x3c;
    	/* Początek nieskończonej pętli */
    while(1)
    {
    if(!(PIND & 0x38))
    	{
    		PORTB=0xFA;
    		_delay_ms(100);
    	}
    
    if(!(PIND & 0x34))
    	{
    		PORTB=0xDD;
    		_delay_ms(100);
    	}
    
    if(!(PIND & 0x2C))
    	{
    		PORTB=0xDE;
    		_delay_ms(100);
    	}
    
    if(!(PIND & 0x1C))
    	{
    		PORTB=0xF9;
    		_delay_ms(100);
    	}
    
    
    }
      
    }
    


    Przyciski na wejściach PD2...PD5. Płytka wykonana według schematu:
    [C] Program obsługujący przyciski ATtiny2313
  • REKLAMA
  • Pomocny post
    #2 9553246
    dondu
    Moderator na urlopie...
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Pozostałe warunki odpowiednio popraw.
    Przy okazji naucz się przesuwania bitów i używania zdefiniowanych symboli, bo kod będzie czytelniejszy (nie stosuj liczb).
    http://mikrokontrolery.blogspot.com/2011/04/problemy-c-ustawianie-i-zerowanie-bitow.html
    http://www.java2s.com/Tutorial/C/0100__Operator/0140__Bitwise-Operator.htm
  • REKLAMA
  • Pomocny post
    #3 9554753
    drzasiek
    Specjalista CNC
    Zadeklarowałeś wejścia i pull_up'y(podciągnięcia do VCC):
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    W takim wypadku PIND przy wyłączonych przyciskach wygląda tak:
    00111100
    Pytając o wciśnięcie klawisza na PD2 pytasz
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    A wiesz co znaczy to?
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    0x38 to binarnie jest 00111000
    zaś & w warunku to suma logiczna, a suma logiczna jest równa 1 jeśli są same jedynki sumowane. Tak więc PIND & 0x38 sprawdza czy bit 3, 4 i 5 rejestru PIND są równe 1. A one są równe 1 czy naciśniesz klawisz na PD2 czy nie naciśniesz. Dodatkowo zaprzeczasz operatorem ! czyli (!(PIND & 0x38)) a więc jak pisałem wyżej czy naciśniesz przycisk czy też nie działanie w nawiasie zwraca jeden. Zaprzeczona jedynka jest zerem a więc czy naciśniesz klawisz czy nie warunek nie jest spełniony dlatego instrukcja w if się nie wykonuje.
    Jeśli chcesz sprawdzić, czy dany pin jest zerem rób w taki sposób:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    0x04 = 00000100 więc taki kod wyżej sprawdza, czy bit 2 (ten z jedynką) jest zerem, reszta go nie obchodzi. Mam nadzieję, że rozumiesz już co miałeś źle?
    Możesz jeszcze stosować _BV(numer bitu)
    np:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Lub tak jak ci podał dondu.
  • #4 9557035
    warczyna
    Poziom 12  
    Dzięki za odpowiedzi, ale w koncu samemu udało mi się do tego dojść :D
REKLAMA