Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Podciąganie do jedynki nie działa -o co chodzi?

03 Mar 2008 19:06 981 7
  • Poziom 18  
    Code:
    DDRD = 0x00; //D jako wejscia
    
    PORTD = 0x40; //podciagniecie pinu D.6 do '1'
    DDRB = 0xff; //B jako wyjscia

    while(1)
    {
       if (PIND&0x40 == 1)
       { PORTB = 0x80; }   //czemu to sie nie wykonuje??!
       else
       { PORTB = 0; }
    }


    Pracuje w AVRStudio 4.13. Dlaczego mimo podciagniecia programowego do jedynki pinu D.6, w AVRStudio ustawia sie tylko PORTD a nie PIND? I czemu program nie pracuje tak, ze wykowywac sie bedize pierwszy warunek tylko drugi? Co robie zle? Attiny2313
  • Poziom 21  
    "PIND&0x40" nigdy nie da Ci jedynki, tylko 0x40.
  • Poziom 12  
    Witam
    raczej używaj warunku :

    if(PIND&7<<1){//tu masz warunek czy 7 bit rejestru jest w stanie logicznej "1"

    PORTB = 0x80;
    }else
    { PORTB = 0x00; }


    DDRD = 0x00; //D jako wejscia -> nie ma poco tego pisać, domyślnie rejestr jest to zadeklarowane jako zero....
    PORTD = 0x40; //podciagnięcie pinu D.6 do '1' -> jak tak robisz to włączasz pull-upa, rezystor podciągający do VCC++ a co za tym idzie port staje się źródłem zasilania...

    Powodzenia

    Pozdr
  • Pomocny post
    Specjalista - Mikrokontrolery
    Jj_Johnys napisał:
    "PIND&0x40" nigdy nie da Ci jedynki, tylko 0x40.

    owszem, tyle ze PIND&0x40 == 1 juz da jedynke albo zero

    Cytat:
    if(PIND&7<<1){//tu masz warunek czy 7 bit rejestru jest w stanie logicznej "1"

    to powyzej to jest warunek na 2,3 i 4 bit rejestru... jak juz cos, to: (PIND&(1<<7))

    kod warunku sie nie wykonuje, bo niby czemu mialby to zrobic? jesli PORTx sluzy do tego co mysle, to na pewno nie jest zadnym wlaczaniem pullupow, i jego zmiany gdy port jest ustawiony jako wejscie sa... bezcelowe...

    0x41 0x56 0x45!!
  • Pomocny post
    Poziom 32  
    Freddie Chopin napisał:

    kod warunku sie nie wykonuje, bo niby czemu mialby to zrobic? jesli PORTx sluzy do tego co mysle, to na pewno nie jest zadnym wlaczaniem pullupow, i jego zmiany gdy port jest ustawiony jako wejscie sa... bezcelowe...


    Tu się kolega myli. W mikrokontrolerach AVR ustawienie bitu PORTXn dla linii skonfigurowanej jako wejście aktywuje rezystor podciągający. W celu odłączenia rezystora podciągającego należy wyzerować bit PORTXn lub ustawić wyprowadzenie jako wyjście.
  • Poziom 10  
    Jj_Johnys napisał:
    owszem, tyle ze PIND&0x40 == 1 juz da jedynkę albo zero



    Tak właściwie to PIND&0x40 == 1 da zawsze zero. PIND&0x40 == 0x40 lub PIND&0x40 != 0 dają jedynkę lub zero.
    Wracając do zapisu PIND&0x40 == 1, to jest on równoważny (i tak zostanie potraktowany przez kompilator) zapisowi PIND&0x40 == 0x01, a tu już chyba widać jak na dłoni że wyrażenia po lewej i prawej stronie nie mogą być sobie równe niezależnie od tego jaka wartość będzie miał PIND.

    Pozdrawiam.
  • Specjalista - Mikrokontrolery
    racja... [;

    zasadniczo sprawdzajac jeden pin stosuje sie samo maskowanie:

    if (PIND&0x40)

    ktore jest najzupelniej wystarczajace dla sprawdzenia jednego pinu.

    0x41 0x56 0x45!!