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

[ATMega128] ATMega128 - Niewykonywanie instrukcji IF przy odczycie klawiatury matrycowej 4x4

mag32 24 Maj 2005 14:56 1308 5
REKLAMA
  • #1 1520971
    mag32
    Poziom 19  
    Posty: 450
    Pomógł: 4
    Ocena: 17
    Odczyt klawiatury matryca 4/4 z portu B, port D pin 7 dioda LED w celach kontrolnych. Poniższy kod napisany jest w WinAvr. Co w nim jest nie tak ?
    Chodzi o to, że kompiluje się prawidłowo, ładuje się przez AVRStudio do AM128 i śledząc jego wykonanie widzę, że na wyjścia matrycy wystawia zera tak jak powinien a na wejściach po wciśnięciu klawisza pojawiają się zera, problem polega na tym, iż instrukcje IF nie są wykonywane. Nie rozumiem dlaczego. Może coś przeoczyłem :/ ??

    DDRD|=1<<7;PORTD|=1<<7;/*Zapal LED*/
    /*Program Główny*/
    DDRB|=1<<0;PORTB|=1<<0;/*wyjście w stanie 1*/
    DDRB|=1<<1;PORTB|=1<<1;/*wyjście w stanie 1*/
    DDRB|=1<<2;PORTB|=1<<2;/*wyjście w stanie 1*/
    DDRB|=1<<3;PORTB|=1<<3;/*wyjście w stanie 1*/

    DDRB&=~(1<<4);PORTB|=1<<4;/*wejście w stanie Podciągnięcia*/
    DDRB&=~(1<<5);PORTB|=1<<5;/*wejście w stanie Podciągnięcia*/
    DDRB&=~(1<<6);PORTB|=1<<6;/*wejście w stanie Podciągnięcia*/
    DDRB&=~(1<<7);PORTB|=1<<7;/*wejście w stanie Podciągnięcia*/
    PORTD|=1<<7;/*Zapal LED*/
    for(;;)
    {
    PORTD|=1<<7;/*Zapal LED*/
    DDRB|=1<<bit;PORTB&=~(1<<bit);/*wyjście w stanie 0*/
    if (PINB4==0)
    {PORTD&=~(1<<7);}/*Zgaś LED*/
    if (PINB5==0)
    {PORTD&=~(1<<7);}/*Zgaś LED*/
    if (PINB6==0)
    {PORTD|=1<<7;}/*Zapal LED*/
    if (PINB7==0)
    {PORTD|=1<<7;}/*Zapal LED*/
    DDRB|=1<<bit;PORTB|=1<<bit;/*wyjście w stanie 1*/
    PORTD&=~(1<<7);/*Zgaś LED*/
    bit++;
    if (bit==4)
    {bit=0;}
    }
    return(0);
  • REKLAMA
  • #2 1521098
    gmp
    Poziom 19  
    Posty: 434
    Pomógł: 29
    Ocena: 28
    Nie za bardzo mi sie chce analizowac Twoj program, ale podpowiem ci ze prawdopodobnie Twoj problem wynika z tego ze "'za szybko" probujesz odczytac stan wejsci gdy na wyjscia pdajesz okreslony stan. Wyjasniam np PIN1-wyjscia PIN2 wejscie, zalozmy ze sa zwarte, podajesz PIN1=0 i jesli w nastep[nej instrukcji odczytasz stan PIN2 to nie bedie on 0, daj troche opoznienian pomiedzy a zapisem na port a odczytem .
  • REKLAMA
  • #3 1521537
    frohme
    Poziom 21  
    Posty: 421
    Pomógł: 25
    Ocena: 15
    Ja wiem, że avr-gcc ma fatalny dostęp do bitów, ale jest na to sposób. Spróbuj znaleźć to w książce wydanej w BTC pod tytułem chyba "Procesory AVR" autor Szczesiul???? Jest tam struktura i dzięki niej dostęp do bitu w rejestrze lub przestrzeni I/O to bajka typu " DDRB6 = 1; " - i program się pisze jak należy, i wygląda to przejrzyście.
    Teraz do programu - masz ileśtam warunków if i coś tam sie w nich robi z LEDem, a na koniec tego LEDa gasisz. Program przy wyjątkowo mułowatym kwarcu wykonuje sie tak szybko, że tego błusku nawet nie dostrzeżesz- konieczne są opóżnienia, o czym pisał przedmówca. I sprawa ostatnia tycząca sprzętu - dobrze jest dla procesora jeżeli przyłącza sie do niego LED od + przez rezystor R do nóżki portu. W tym połączeniu procesor może łyknąć w siebie tą nogą najczęściej do 20 mA, ale wydać z tej nogi na zewnątrz dużo mniej. Jeżeli jest tylko 1 LED to niewiele znaczy i problem nie istnieje, ale w przeciwnym wypadku miej to na uwadze.
  • REKLAMA
  • #4 1521646
    delibert
    Poziom 13  
    Posty: 37
    Pomógł: 5
    Badaj stan bitów w ten sposób:
    if (PINB & _BV(PINB4))...
    Kod który przytoczyłeś realizuje coś takiego:
    if (4==0)...
    To dla przykładu z PINB4, raczej nie bedzie działać :-)
  • REKLAMA
  • Pomocny post
    #5 1522129
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 51
    delibert napisał:
    Badaj stan bitów w ten sposób:
    if (PINB & _BV(PINB4))...

    raczej
    
    if (!(PINB & _BV(PINB4))) //czy=0
    

    lub po "ludzku"
    
    if(bit_is_clear(PINB,PB4))...
    

    delibert napisał:

    Kod który przytoczyłeś realizuje coś takiego:
    if (4==0)...
    To dla przykładu z PINB4, raczej nie bedzie działać :-)

    Ten kod nic nie realizuje - kompilator go ignoruje.

    Piotrek

    PS
    Zajrzyjcie czasami do pliku *.lss :wink:
REKLAMA