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

ATmega16 i LCD: problem z inicjalizacją w kodzie assemblera, działa w symulacji

slomek83 02 Maj 2007 15:33 1872 5
  • #1 3841701
    slomek83
    Poziom 12  
    Posty: 61
    Pomógł: 1
    Witam

    Mecze sie z inicjalizacja lcd juz troche czasu i za nic nie moge dojsc co jest nie tak w tym programie, na symulacji wszstko dziala jak powinno ale wyswietlacz nie jest zainicjalizowany po wrzuceniu programu. Moglbys ktos spojrzec i ewentualnie znalezc blad.

    Z gory dziekuje

    .include "m16def.inc"

    .EQU SYS_FREQ = 1 ; czŕstotliwoťŠ pracy w MHz


    .equ rs = 0
    .equ rw = 1
    .equ en = 2
    .equ d4 = 4
    .equ d5 = 5
    .equ d6 = 6
    .equ d7 = 7
    .equ k_lcd = ddra
    .equ wy_lcd = porta
    .equ znak_konca = 255


    .cseg
    .org 0
    jmp reset

    powitanie: .db "Inicjalizacja", znak_konca

    Reset:

    ldi r17, high(ramend)
    ldi r16, low(ramend)
    out sph, r17
    out spl, r16

    sbi ddra, rs
    sbi ddra, en
    sbi ddra, d4
    sbi ddra, d5
    sbi ddra, d6
    sbi ddra, d7

    cbi porta, rs
    cbi porta, en

    ldi r24, 45 ;czekaj 45ms
    ldi r25, 1
    rcall czekaj_ms

    sbi porta, en ;wyslanie 3 do wyswietlacza
    sbi porta, d4
    sbi porta, d5
    cbi porta, d6
    cbi porta, d7
    nop
    nop
    cbi porta, en

    ldi r24, 5 ;czekaj 5ms
    ldi r25, 1
    rcall czekaj_ms

    sbi porta, en ;wyslanie 3 do wyswietlacza
    nop
    nop
    cbi porta, en

    ldi r24, 5 ;czekja 5ms
    ldi r25, 1
    rcall czekaj_ms

    sbi porta, en ;wyslanie 3 do wyswietlacza
    nop
    nop
    cbi porta, en
    ldi r24, 5
    ldi r25, 1
    rcall czekaj_ms

    sbi porta, en
    cbi porta, d4 ;wyslanie 2 do wyswietlacza

    ldi r24, 1
    rcall czekaj_us

    cbi porta, en

    ldi r16, 0b00101000 ;interfejs 4 bitowy 2 linie znak 5x7
    rcall instrukcja_lcd

    ldi r16, 0b00001000 ;wylacz lcd, wlacz kursor, wylacz mruganie
    rcall instrukcja_lcd

    ldi r16, 0b00000001 ;czysc lcd
    rcall instrukcja_lcd
    ldi R24, 180
    rcall Czekaj_us ; opoznienie o 1,8 ms


    ldi r16, 0b00000110 ;bez przesuwania w prawo
    rcall instrukcja_lcd

    ldi r16, 0b00001111 ;wlacz lcd, kursor, mruganie
    rcall instrukcja_lcd

    rcall czysc_lcd

    ldi ZH, high(Powitanie<<1)
    ldi ZL, low(Powitanie<<1)
    rcall Pokaz_ciag_LCD ; wyťwietlenie powitania

    koniec:rcall koniec

    ;***************************************************************
    ; PROCEDURA CZYSZCZąCA WYîWIETLACZ LCD
    ;
    Czysc_LCD:
    push R16

    ldi R16, (1<<0)
    rcall Instrukcja_LCD ; czyszczenie wyťwietlacza i
    ; powrˇt kursora do pozycji
    ; pocz¦tkowej
    ldi R24, 180
    rcall Czekaj_us ; opˇčnienie o 1,8 ms

    pop R16
    ret


    Instrukcja_LCD:
    cbi porta, RS ; przesy-ane wartoťci bŕd¦ instrukcjami
    rcall Zapisz_LCD ; przeťlij instrukcjŕ zawart¦ w R16
    sbi porta, RS ; przesy-ane wartoťci bŕd¦ danymi

    ret


    ;***************************************************************
    ; PROCEDURA PRZESYLAJąCA BAJT
    ;
    ; Parametry:
    ; R16 - dane do wys-ania (np. kod wyťwietlanego znaku)
    ;
    Zapisz_LCD:
    sbi porta, EN ; linia EN w stanie wysokim
    cbi porta, D4
    cbi porta, D5
    cbi porta, D6
    cbi porta, D7 ; linie DB7..4 w stanie niskim
    sbrc R16, 7
    sbi porta, D7
    sbrc R16, 6
    sbi porta, D6
    sbrc R16, 5
    sbi porta, D5
    sbrc R16, 4
    sbi porta, D4 ; ustawianie tylko tych linii DB7..4,
    nop
    // sbi porta, en ; ktˇrym odpowiadaj¦ wysokie wartoťci
    nop ; bitˇw 7..4 z rejestru R16
    cbi porta, EN ; linia EN w stanie niskim - potwierdzenie
    ; (przes-anie starszego pˇ-bajtu)

    nop
    nop ; opˇčnienie o dwa takty zegarowe
    ldi r24,5
    rcall czekaj_us
    sbi porta, EN
    cbi porta, D4
    cbi porta, D5
    cbi porta, D6
    cbi porta, D7
    sbrc R16, 3
    sbi porta, D7
    sbrc R16, 2
    sbi porta, D6
    sbrc R16, 1
    sbi porta, D5
    sbrc R16, 0
    sbi porta, D4 ; ustawianie tylko tych linii DB7..4,
    nop ; ktˇrym odpowiadaj¦ wysokie wartoťci
    //sbi porta, en
    nop ; bitˇw 3..0 z rejestru R16
    cbi porta, EN ; linia EN w stanie niskim - potwierdzenie
    ; (przes-anie m-odszego pˇ-bajtu)

    ldi R24, 5
    rcall Czekaj_us ; opˇčnienie o 50 us

    ret


    Pokaz_ciag_LCD:
    push R16
    push R17

    Pok_c_LCD_1: ; pŕtla wyťwietlaj¦ca kolejne znaki -a˝cucha
    lpm R16, Z+ ; odczytaj znak z pamiŕci programu, spod adresu
    ; wskazywanego przez rejestr indeksowy Z
    cpi R16, ZNAK_KONCA
    breq Pok_c_LCD_2 ; jeťli znak jest znakiem ko˝ca, to zako˝cz,
    rcall Zapisz_LCD ; w przeciwnym razie wyťwietl go na LCD
    rjmp Pok_c_LCD_1 ; i przejdč do odczytywania kolejnego znaku

    Pok_c_LCD_2:
    pop R17
    pop R16
    ret

    .include "czekaj_ms.inc"
    .include "czekaj_us.inc"
  • #3 3842888
    Dr_DEAD
    Poziom 28  
    Posty: 829
    Pomógł: 126
    Ocena: 3
    Nie znam assemblera od AVR'ów ale sie dużo domyślam i wg mnie ta funkcja:
    slomek83 napisał:

    Zapisz_LCD:
    sbi porta, EN ; linia EN w stanie wysokim
    cbi porta, D4
    cbi porta, D5
    cbi porta, D6
    cbi porta, D7 ; linie DB7..4 w stanie niskim
    sbrc R16, 7
    sbi porta, D7
    sbrc R16, 6
    sbi porta, D6
    sbrc R16, 5
    sbi porta, D5
    sbrc R16, 4
    sbi porta, D4 ; ustawianie tylko tych linii DB7..4,
    nop
    // sbi porta, en ; ktˇrym odpowiadaj¦ wysokie wartoťci
    nop ; bitˇw 7..4 z rejestru R16
    cbi porta, EN ; linia EN w stanie niskim - potwierdzenie
    ; (przes-anie starszego pˇ-bajtu)

    nop
    nop ; opˇčnienie o dwa takty zegarowe
    ldi r24,5
    rcall czekaj_us
    sbi porta, EN
    cbi porta, D4
    cbi porta, D5
    cbi porta, D6
    cbi porta, D7
    sbrc R16, 3
    sbi porta, D7
    sbrc R16, 2
    sbi porta, D6
    sbrc R16, 1
    sbi porta, D5
    sbrc R16, 0
    sbi porta, D4 ; ustawianie tylko tych linii DB7..4,
    nop ; ktˇrym odpowiadaj¦ wysokie wartoťci
    //sbi porta, en
    nop ; bitˇw 3..0 z rejestru R16
    cbi porta, EN ; linia EN w stanie niskim - potwierdzenie
    ; (przes-anie m-odszego pˇ-bajtu)

    ldi R24, 5
    rcall Czekaj_us ; opˇčnienie o 50 us

    ret


    Powinna wyglądać tak:
    Zapisz_LCD:
    cbi porta, D4
    cbi porta, D5
    cbi porta, D6
    cbi porta, D7 ; linie DB7..4 w stanie niskim
    sbrc R16, 7
    sbi porta, D7
    sbrc R16, 6
    sbi porta, D6
    sbrc R16, 5
    sbi porta, D5
    sbrc R16, 4
    sbi porta, D4 ; ustawianie tylko tych linii DB7..4,
    nop
    sbi porta, EN ; linia EN w stanie wysokim
    nop
    nop
    nop
    nop
    cbi porta, EN ; linia EN w stanie niskim - potwierdzenie
    ; (przes-anie starszego pˇ-bajtu)

    ldi r24,5
    rcall czekaj_us
    cbi porta, D4
    cbi porta, D5
    cbi porta, D6
    cbi porta, D7
    sbrc R16, 3
    sbi porta, D7
    sbrc R16, 2
    sbi porta, D6
    sbrc R16, 1
    sbi porta, D5
    sbrc R16, 0
    sbi porta, D4 ; ustawianie tylko tych linii DB7..4,
    sbi porta, EN
    nop
    nop
    nop
    nop
    cbi porta, EN ; linia EN w stanie niskim - potwierdzenie
    ; (przes-anie m-odszego pˇ-bajtu)

    ldi R24, 5
    rcall Czekaj_us ; opˇčnienie o 50 us
    ret

    I według tego schematu przerobić trzeba pozostałe funkcje. Czyli najpierw ustawiamy linie D4-D7, następnie ustawiamy EN w stan wyskoki, czekamy te 4 Nopy (zależenie do zegara) i ustawiamy EN w stan niski, czekamy określony czas na wykonanie instrukcji w LCD przed podaniem kolejnej. I pamiętaj, jeżeli urzywasz interfejsu z 4 liniami danych to pozostałe linie w LCD zdaje sie że powinny być zwarte do masy.
  • #4 3843433
    slomek83
    Poziom 12  
    Posty: 61
    Pomógł: 1
    ta procedura jest przepsiana z ksiazki Baranowskiego o AVRach, program ktory tam jest napisany nie dziala poprawnie i wlasnie probuje znalezc blad, jak juz widac po komentarzach juz myslalem nad tym rozwiazaniem co Dr_DEAD
  • #5 3844268
    Linoge
    Poziom 27  
    Posty: 1093
    Pomógł: 54
    Ocena: 44
    Moze skorzystaj z gotowych plikow zrodlowych ze strony btc ;) mnie to dziala :)
  • #6 3845097
    slomek83
    Poziom 12  
    Posty: 61
    Pomógł: 1
    korzystalem z gotowych plikow zrodlowych z wydawnictwa btc i nie dzialalo, dziaisja wzialem sie za napisanie procedurek od nowa i dziala, mozliwe ze blad byl w opoznieniach. dzieki za chec pomocy. pozdrawiam
REKLAMA