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][ATMega16] Odczytywanie błędnych stanów na portach

Prezes87 27 Cze 2010 21:40 1413 3
REKLAMA
  • #1 8238114
    Prezes87
    Poziom 11  
    Witam!
    Podłączyłem 16 guzików pod ATmege16 i chciałem zrobić identyfikację klikniętego. Podzieliłem je na rzędy(4) i kolumny(4) i podpiąłem pod portd(PD0-PD6) i portb(PB3).
    Następnie ustawiam na kolumnach(PD0-PD3 i PB3) stan wysoki i puszczam pętle w programie główny która oczekuje na wciśnięcie przycisku. Jednak polecenie PIND błędnie odczytuje stan portu (przy ustawnieniu PORTD=0x07 i DDRD=0x07 pokazuje 0xBF)
    Może ktoś pomóc?

    Cytat:

    #define Kolumna_1 PD2
    #define Kolumna_2 PD1
    #define Kolumna_3 PD0
    #define Kolumna_4 PB3
    #define Wiersz_1 PD6
    #define Wiersz_2 PD5
    #define Wiersz_3 PD4
    #define Wiersz_4 PD3


    volatile unsigned char stan;

    int przycisk()
    {
    int wiersz, kolumna, wynik;
    wiersz = kolumna = 0;

    DDRB |= (1<<Kolumna_4);
    DDRD = 0x00;
    PORTD = 0X00;

    DDRD = (1<<Kolumna_1)+(1<<Kolumna_2)+(1<<Kolumna_3);
    PORTB |= (1<<Kolumna_4);
    PORTD |= (1<<Kolumna_1)+(1<<Kolumna_2)+(1<<Kolumna_3);
    _delay_us(20);

    if(PIND & (1<<Wiersz_1))
    {
    wiersz = 0x01;
    }
    else if(PIND & (1<<Wiersz_2))
    {
    wiersz = 0x02;
    }
    else if(PIND & (1<<Wiersz_3))
    {
    wiersz = 0x03;
    }
    else if(PIND & (1<<Wiersz_4))
    {
    wiersz = 0x04;
    }
    else
    return 0;
  • REKLAMA
  • #2 8239612
    szelus
    Poziom 34  
    Jeżeli to ma być klawiatura matrycowa, to powinieneś włączyć rezystory podciągające na wejściach (jeżeli nie masz ich w układzie). Bez tego będziesz odbierał "śmietnik".
    Po drugie, w klawiaturze matrycowej przeglądanie robi się zerem, czyli wykrycie przycisku powinieneś robić przez sprawdzanie zera na wejściu, a nie jedynki.
    Tak w ogóle, to co ta funkcja przycisk() ma robić, według Ciebie?
  • REKLAMA
  • #3 8239623
    tadzik85
    Poziom 38  
    DDRD = (1<<Kolumna_1)+(1<<Kolumna_2)+(1<<Kolumna_3); 

    To jest poprawne jednak zwyczajowo wykorzystuje się sumę logiczną.
    Z kolegą powyżej się zgodzę, nie zapomnij po zmianie kolumny odczekać jeden takt zegarowy (instrukcja NOP) przed odczytem wiersza.
  • #4 8244543
    janbernat
    Poziom 38  
    A te przyciski nie mają drgań?
    Jakiś specjalny typ?
REKLAMA