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

Dziwny problem atmega16 wejścia

honestly 29 Gru 2010 16:41 938 10
REKLAMA
  • #1 8929737
    honestly
    Poziom 10  
    Witam,
    problem jest taki:
    Mam 3 przyciski i kilka diod podłączonych prawidłowo do procka.
    Diody robią wszystko tak jak chcę (jak zaprogramuje), problem dzieje się z przyciskami.. Gdy zaprogramuje dwa przyciski:

    Cytat:
    int main(void)
    {
    /* Wszystkie linie portu D będą wyjściami */
    DDRD = 0xff;

    /* wejścia podciągnięte do VCC */
    DDRA = 0x00;

    while(1)
    {

    if(!(PINA = 0x01))
    {
    PORTD = 0b00000001;
    }

    if(!(PINA = 0x02))
    {
    PORTD = 0b00000010;
    }

    }

    }


    Działa tak jak w programie, ale jak dodam trzeci przycisk robią się jakieś cudy niewidy, obojętnie na jakim porcie to zrobię...

    A jak podłączyłem diody na tamtych portach co przyciski to diody wykonywały to co zaprogramowałem.
    Próbowałem tez przyciski do GND, ale ten sam błąd.

    Jakaś podpowiedź? Dziwne, że wyjścia działają prawidłowo, a wejścia tylko 2 pierwsze piny każdego portu.
  • REKLAMA
  • #2 8929763
    asembler
    Poziom 32  
    Gdzie masz wejscia podciągniete do Vcc?
  • REKLAMA
  • #3 8929861
    LordBlick
    VIP Zasłużony dla elektroda
    Stan wejść odczytuje się na PINx, a nie na PORTx. PORTx należy ustawić na 1 i DDRx na 0, aby wejścia były podciągnięte. x ∈ {A,B,C,D,E,F}
  • REKLAMA
  • #4 8929932
    honestly
    Poziom 10  
    Cytat:
    int main(void)
    {
    /* Wszystkie linie portu D będą wyjściami */
    DDRD = 0xff;

    /* wejścia podciągnięte do VCC */
    DDRA = 0x00;
    PORTA = 0xff;

    while(1)
    {

    if(!(PINA & 0x01))
    {
    PORTD = 0b00000001;
    }

    if(!(PINA & 0x02))
    {
    PORTD = 0b00000010;
    }


    if(!(PINA & 0x03))
    {
    PORTD = 0b00000100;
    }

    }

    }


    Trzeci przycisk nie działa... Reszta tak
  • REKLAMA
  • Pomocny post
    #5 8929973
    landy13
    Poziom 31  
    if(!(PINA & 0x03)) oznacza sprawdzanie czy wciśnięte dwa pierwsze przyciski.
    Gdy chcesz sprawdzić trzeci napisz if(!(PINA & 0x04))
  • Pomocny post
    #6 8930043
    krdln
    Poziom 13  
    Pojedynczy znak równości oznacza przypisanie, nie porównanie! Aby te błędy wyłapać, kompiluj z parametrem -Wall (gdzieś w opcjach powinnieneś mieć parametry kompilacji).

    Poprawne sprawdzanie rób tak, jak podał landy13, albo, nie bawiąc się w hexy:
    if (!(PINX&_BV(Y))) { (*...*) }

    (dla przycisku połączonego do PX.Y)

    [edit] poprawka, zapomniałem nawiasu
  • #7 8930202
    gdL
    Poziom 27  
    DDRX 1:wyjście (wtedy doprecyzowujesz PORTX 1:wysoki; 0:niski);
    DDRX 0:wejście (wtedy doprecyzowujesz PORTX 1:pullup; 0:tri-state/float);
    PINX sprawdza stan, w praktyce stosuje się tylko, gdy DDRX 0. Inaczej (DDRX:1), otrzymasz to, co ustawiłeś w sekcji PORT.
  • #8 8930489
    honestly
    Poziom 10  
    Ok, działa, dzięki wielkie landy widziałem, że to jakaś głupota, bo zapisywałem 0x03 ;/, a jeszcze jedno pytanie mi się nasuneło.
    Jak zapisać w programie, żeby po puszczeniu przycisku dioda gasła?
    Teraz pali się cały czas, dopiero gdy nadusze inny przycisk
  • #10 8931056
    honestly
    Poziom 10  
    Szybciej się tutaj nauczę niż w szkole...
    Jeszcze mnie zastanawia to jak zrobić żeby procesor pamiętał poprzedni przycisk, czyli dioda pali się cały czas, nawet jak nacisnę kolejny, że palą się oba itd

    ok już wiem, wystarczy zamiast = dać |=

    teraz bym chciał zrobić aby drugie naciśnięcie przycisku tym razem gasiło diodę którą wsześniej zapalił, ale tu już nie wiem za bardzo jak do tego dojść
  • #11 8931310
    landy13
    Poziom 31  
    honestly napisał:
    teraz bym chciał zrobić aby drugie naciśnięcie przycisku tym razem gasiło diodę którą wsześniej zapalił
    Istnieje taki operator: "^", którym można zmienić bit a tym samym stan pinu na przeciwny. Ale tu już musisz poczytać o deboucingu.
    Gotowców na dziś wystarczy.
REKLAMA