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.

ATmega128 + obsługa klawiatury matrycowej

11 Cze 2007 14:36 4451 2
  • Poziom 10  
    Witam!
    Proszę o pomoc.
    Piszę program obsługujący klawiaturę matrycową - w sumulatorze wszystko działa, ale w momencie wgrania do ATmega128 nie działa.
    Klawiatura wygląda tak:

    ATmega128 + obsługa klawiatury matrycowej

    tranzystory podpięte są do PORTC0-3
    Linie wierszowe klawiatury do PORTA0-3
    Dioda LED podłączona jest do PORTB0

    Cały program jest niewielką modyfikacją programu z książki "Mikrokontrolery AVR w praktyce".

    Cytat:

    .INCLUDE "m128def.inc"

    .DSEG
    .ORG 0x100 ;poczatek pamięci sram
    klawisz_inf: .BYTE 1

    .CSEG ;segment programu
    .ORG 0 ;wektor zerowania - przygotowanie mikrokontrolera do pracy
    jmp Reset

    Reset:
    ;*** INICJALIZACJA stosu ***
    ldi R17, high(RAMEND)
    ldi R16, low(RAMEND)
    out SPH, R17
    out SPL, R16

    ;*** INICJALIZACJA KLAWIATURY ***
    ;tryb wyjściowy na liniach z tranzystorami Q2(PC0), Q3(PC1), Q4(PC2), Q5(PC3)
    sbi DDRC, DDC0
    sbi DDRC, DDC1
    sbi DDRC, DDC2
    sbi DDRC, DDC3

    sbi DDRB, DDB0 ;tryb wyjsciowy linii z LED


    Petla:
    ;jeżeli jakiś klawisz jest wciśnięty zostaje wywołana procedura odczytu klawiatury matrycowej
    sbi PORTC, PORTC0 ;podanie na tranzystory stanu wysokiego - tranzystory przewodza
    sbi PORTC, PORTC1
    sbi PORTC, PORTC2
    sbi PORTC, PORTC3

    ;podciągnięcie wierszowych linii
    sbi PORTA, PORTA0
    sbi PORTA, PORTA1
    sbi PORTA, PORTA2
    sbi PORTA, PORTA3

    sbis PINA, PINA0
    call Odczyt_klawiatury
    sbis PINA, PINA1
    call Odczyt_klawiatury
    sbis PINA, PINA2
    call Odczyt_klawiatury
    sbis PINA, PINA3
    call Odczyt_klawiatury

    lds R16, klawisz_inf
    cbr R16, 1<<7 ;kasuje informacje o wcisnietym klawiszu

    cpi R16, 0x00 ;zgas LED jezeli wcisniety klawisz "0"
    brne Petla_0 ;skocz jeżeli różne
    cbi PORTB, PORTB0
    rjmp Koniec

    Petla_0: ;zapal LED dla klawisza "1"
    cpi R16, 0x01
    brne Koniec
    sbi PORTB, PORTB0

    Koniec:
    rjmp Petla



    ;*** ODCZYT KLAWIATURY ************************************************************************
    Odczyt_klawiatury:
    push R16
    push R17
    push ZL
    push ZH
    in R17, SREG
    push R17

    ;podciągnięcie wierszowych linii
    sbi PORTA, PORTA0
    sbi PORTA, PORTA1
    sbi PORTA, PORTA2
    sbi PORTA, PORTA3

    ldi R16, 0b10110000 ;w przypadku gdy klawisz nie wcisniety

    ;testowanie linii wierszowych, gdy:
    ;pierwsza linia kolumnowa w stanie niskim
    sbi PORTC, PORTC0 ;tranzystor Q2 (kolumna pierwsza) przewodzi
    cbi PORTC, PORTC1 ;pozostałe tranzystory w stanie zatkania (nie przewodzą)
    cbi PORTC, PORTC2
    cbi PORTC, PORTC3
    nop
    nop
    sbis PINA, PINA0
    ldi R16, 0
    sbis PINA, PINA1
    ldi R16, 1
    sbis PINA, PINA2
    ldi R16, 2
    sbis PINA, PINA3
    ldi R16, 3

    ;druga linia kolumnowa w stanie niskim
    cbi PORTC, PORTC0
    sbi PORTC, PORTC1
    nop
    nop
    sbis PINA, PINA0
    ldi R16, 4
    sbis PINA, PINA1
    ldi R16, 5
    sbis PINA, PINA2
    ldi R16, 6
    sbis PINA, PINA3
    ldi R16, 7

    ;trzecia linia kolumnowa w stanie niskim
    cbi PORTC, PORTC1
    sbi PORTC, PORTC2
    nop
    nop
    sbis PINA, PINA0
    ldi R16, 8
    sbis PINA, PINA1
    ldi R16, 9
    sbis PINA, PINA2
    ldi R16, 10
    sbis PINA, PINA3
    ldi R16, 11

    ;czwarta linia kolumnowa w stanie niskim
    cbi PORTC, PORTC2
    sbi PORTC, PORTC3
    nop
    nop
    sbis PINA, PINA0
    ldi R16, 12
    sbis PINA, PINA1
    ldi R16, 13
    sbis PINA, PINA2
    ldi R16, 14
    sbis PINA, PINA3
    ldi R16, 15

    ldi R17, 0b10110000
    cpse R16, R17
    rjmp Dalej
    rjmp Klawisz_nie_wcisniety ;instrukcja zostaje wykonana, gdy R16<>R17

    Dalej:
    ldi ZH, high(Kolejnosc_klawiszy<<1)
    ldi ZL, low(Kolejnosc_klawiszy<<1)
    clr R17
    add ZL, R16
    adc ZH, R17
    lpm R16, Z
    sbr R16, (1<<7)
    sts klawisz_inf, R16
    rjmp Odczyt_klawisza_koniec

    Klawisz_nie_wcisniety:
    lds R16, klawisz_inf
    cbr R16, 1<<7
    sts klawisz_inf, R16

    Odczyt_klawisza_koniec:
    pop R17
    out SREG, R17
    pop ZH
    pop ZL
    pop R17
    pop R16
    ret


    ;*** TABLICA KLAWISZY *************************************************************************
    Kolejnosc_klawiszy:
    .DB 15, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 10, 11, 12, 13, 14
  • Użytkownik usunął konto  
  • Poziom 10  
    Niestety dostałam tak wykonaną płytę z ATmega bez możliwości ingerowania w to jak jest wykonana (niestety).
    Mam wątpliwości co do poprawności fragmentów kodu związanych z pamięcią SRAM - umieszczenia w niej odczytanej wartości z klawiatury, bowiem jeżeli zmienię w kodzie
    Code:
    ...
    
    sbis PINA, PINA0
    ldi R16, 0
    ...
    na
    Code:
    ...
    
    sbis PINA, PINA0
    sbi PORTB, PORTB0
    ...
    dioda się zapala.