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

AVR i LCD - brak efektu na wyświetlaczu, analiza kodu i ustawień

grzesio14 29 Lis 2005 13:49 1782 6
REKLAMA
  • #1 2037164
    grzesio14
    Poziom 14  
    Posty: 138
    Witam.
    Proszę o pomoc.
    Napisałem prosty program do obsługi LCD.
    Sprawdzałem przy różnych ustawieniach i nie mam żadnego efektu na wyświetlaczu.

    Grzegorz.

    
    .include "8515def.inc"
    .equ dane = PORTD
    .equ ster = PORTC
    .equ E = 7
    .equ RW = 6
    .equ RS = 5
    
    .def acc = r16
    .def licznik = r17
    .def czas = r19
    
    
    .cseg
    .org 0x00
    rjmp Start
    .org 0x07
    rjmp Timer
    .org 0x0B
    
    ;    8-BITÓW DANYCH 1 WIERSZ
    Start:
    
    
    ldi acc, 127 ;
    out SPL, r16 ; ustawienie wskaˇnika stosu na 127
    
    ldi acc, 3
    out TCCR0, acc		; ustaw preskaler na 64 i wystartuj timer
    ldi acc, 2
    out TIMSK,acc		;włączenie przerwania przepełnienia licznika T0(TOIE0)
    sei
    
    ldi czas, 11
    
    Lcdini:
    ldi acc,0b11111111
    out ster, acc
    ldi acc,0
    rcall sek
    ldi acc, 0xff
    out DDRC, acc
    ldi acc,0x00
    out PORTC, acc
    ldi acc,0xff
    out DDRD, acc
    ldi acc, 0b00110000		;POCZĄTEK INICJACJI
    out dane, acc
    rcall Wykom
    ldi acc,252
    out TCNT0, acc
    ldi czas, 2
    rcall sek
    ldi acc, 0b00110000
    out dane, acc
    rcall Wykom
    ldi acc,252
    out TCNT0, acc
    ldi czas, 2
    rcall sek
    ldi acc, 0b00110000
    out dane, acc
    rcall Wykom
    ldi acc,252
    out TCNT0, acc
    ldi czas, 2
    rcall sek
    cli
    ldi acc, 0b00111000	;function set
    out dane, acc
    rcall Wykom
    ldi acc, 0b00001000	;display off
    out dane, acc
    rcall Wykom
    ldi acc, 0b00000001	;display clear
    out dane, acc
    rcall Wykom
    ldi acc, 0b00000110	;entry mode set
    out dane, acc
    rcall Wykom
    ldi acc, 0b00001111	;display on
    out PORTD, acc
    rcall Wykom			;KONIEC INICJACJI
    Busy:
    ldi acc,0xff
    out dane,acc
    sbi ster,RW
    cbi ster,RS
    sbi ster,E
    sbic PIND, 7
    rcall Busy
    cbi ster,E
    cbi ster, RW
    ldi acc,0x41
    out dane,acc
    rcall Wydane
    ldi acc,0b11111100
    out ster, acc
    Petla:
    rjmp Petla
    
    Wykom:
    sbi ster, E
    cbi ster,RS
    cbi ster, E
    ret
    
    Wydane:
    sbi ster, E
    sbi ster,RS
    cbi ster, E
    cbi ster,RS
    ret
    
    sek:
    out TCNT0, acc		; wartość początkowa licznika
    ldi acc, 2
    out TIMSK, acc 		;odblokuj przerwanie od T0
    ldi acc, 3
    out TCCR0, acc		; ustaw preskaler na 64 i wystartuj timer
    Odlicz:
    cp licznik, czas	; odmierza czas 1/244s
    brne Odlicz
    clr licznik			; zeruj licznik
    ret
    
    Timer:
    inc licznik			; zwiększa o 1 licznik przepełnień timera T0
    ldi acc, 2
    out TIFR, acc
    reti				;powrót z przerwania
    
  • REKLAMA
  • #2 2037553
    GienekS
    Poziom 32  
    Posty: 1971
    Pomógł: 139
    Ocena: 15
    Według mnie robisz podstawowy błąd w sterowaniu LCD Jest tak:
    Wykom: 
    sbi ster, E 
    cbi ster,RS 
    cbi ster, E 
    ret 
    
    powinno być tak:
    Wykom: 
    cbi ster,RS 
    sbi ster, E 
    //tu powinien być interwał czasowy
    cbi ster, E 
    ret 
    
    to też jest źle:
    Wydane: 
    sbi ster, E 
    sbi ster,RS 
    cbi ster, E 
    cbi ster,RS 
    ret 
    
  • REKLAMA
  • #3 2039138
    michalko12
    Specjalista - Mikrokontrolery
    Posty: 3394
    Pomógł: 462
    Ocena: 321
    grzesio14 napisał:

    
    ldi acc, 0b00111000	;function set
    out dane, acc
    rcall Wykom
    ldi acc, 0b00001000	;display off
    out dane, acc
    rcall Wykom
    ldi acc, 0b00000001	;display clear
    out dane, acc
    rcall Wykom
    ldi acc, 0b00000110	;entry mode set
    out dane, acc
    rcall Wykom
    ldi acc, 0b00001111	;display on
    out PORTD, acc
    rcall Wykom			;KONIEC INICJACJI
    
    



    Chyba podstawowym błędem jest to że nie robisz timeoutów, zdaje się że powinny mieć conajmiej 40µs lub powinieneś sprawdzać bit BUSY wyswietlacza zanim wyslesz kolejny rozkaz.
  • REKLAMA
  • #4 2040581
    grzesio14
    Poziom 14  
    Posty: 138
    Witam ponownie.
    Dalej walczę z programem.
    Po zastosowaniu się do instrukcji nadal ten sam efekt.
    Może coś znajdziecie czego ja się nie dopatrzyłem (oczopląsu dostaje :-(( ).
    Grzegorz
    
    .include "8515def.inc"
    .equ dane = PORTD
    .equ ster = PORTC
    .equ E = 7
    .equ RW = 6
    .equ RS = 5
    
    .def acc = r16
    .def licznik = r17
    .def czas = r19
    
    
    .cseg
    .org 0x00
    rjmp Start
    .org 0x07
    rjmp Timer
    .org 0x0B
    
    ;    8-BITÓW DANYCH 1 WIERSZ
    Start:
    cbi ster,RS
    
    ldi acc, 127 ;
    out SPL, r16 ; ustawienie wskaˇnika stosu na 127
    
    ldi acc, 3
    out TCCR0, acc		; ustaw preskaler na 64 i wystartuj timer
    ldi acc, 2
    out TIMSK,acc		;włączenie przerwania przepełnienia licznika T0(TOIE0)
    sei
    
    ldi czas, 11
    
    Lcdini:
    ldi acc,0
    rcall sek
    ldi acc, 0xff
    out DDRC, acc
    ldi acc,0x00
    out PORTC, acc
    ldi acc,0xff
    out DDRD, acc
    ldi acc, 0b00110000		;POCZĄTEK INICJACJI
    out dane, acc
    rcall Wykom
    ldi czas, 2
    ldi acc,252
    out TCNT0, acc
    rcall sek
    ldi acc, 0b00110000
    out dane, acc
    rcall Wykom
    ldi czas, 2
    ldi acc,252
    out TCNT0, acc
    rcall sek
    ldi acc, 0b00110000
    out dane, acc
    rcall Wykom
    ldi czas, 2
    ldi acc,252
    out TCNT0, acc
    rcall sek
    ldi acc, 0b00111000	;function set
    out dane, acc
    rcall Wykom
    ldi acc, 0b00001000	;display off
    out dane, acc
    rcall Wykom
    ldi acc, 0b00000001	;display clear
    out dane, acc
    rcall Wykom
    ldi acc, 0b00000110	;entry mode set
    out dane, acc
    rcall Wykom
    ldi acc, 0b00001111	;display on
    out PORTD, acc
    rcall Wykom			;KONIEC INICJACJI
    Busy:
    ldi acc,0xff
    out dane,acc
    sbi ster,RW
    cbi ster,RS
    sbi ster,E
    ldi czas, 2
    ldi acc,250
    out TCNT0, acc
    rcall sek
    sbic PIND, 7
    rcall Busy
    cbi ster,E
    cbi ster, RW
    ldi acc,0x41
    out dane,acc
    rcall Wydane
    Petla:
    rjmp Petla
    
    Wykom:
    cbi ster,RS
    sbi ster, E
    ldi czas, 1
    ldi acc,250
    out TCNT0, acc
    rcall sek
    cbi ster, E
    ret
    
    Wydane:
    sbi ster,RS
    sbi ster, E
    ldi czas, 1
    ldi acc,250
    out TCNT0, acc
    rcall sek
    cbi ster, E
    cbi ster,RS
    ret
    
    sek:
    out TCNT0, acc		; wartość początkowa licznika
    ldi acc, 2
    out TIMSK, acc 		;odblokuj przerwanie od T0
    ldi acc, 3
    out TCCR0, acc		; ustaw preskaler na 64 i wystartuj timer
    Odlicz:
    cp licznik, czas	; odmierza czas 1/244s
    brne Odlicz
    clr licznik			; zeruj licznik
    ret
    
    Timer:
    inc licznik			; zwiększa o 1 licznik przepełnień timera T0
    ldi acc, 2
    out TIFR, acc
    reti				;powrót z przerwania
    
    
  • REKLAMA
  • #5 2046596
    grzesio14
    Poziom 14  
    Posty: 138
    Witam.
    W końcu działa już program.
    Posłużyłem się napisanym kiedyś podobnym programem na '51.
    Dzięki za pomoc w załączniku pliczek, który może posłużyć początkującym.
    Załączniki:
    • avr i lcd.txt (2.5 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #6 2047063
    shootky
    Poziom 15  
    Posty: 131
    Pomógł: 11
    Ocena: 20
    Witam

    ldi acc,0x00
    out DDRD, acc
    ldi acc, 0x00	
    out dane, acc
    *sbi ster,RW
    *cbi ster,RS
    *sbi ster,E
    *sbis PIND, 7
    *cbi ster,E
    *ldi acc,0xff
    out DDRD, acc
    ldi acc,0x41
    out dane,acc
    cbi ster, RW
    sbi ster,RS
    ldi czas, 2
    ldi acc,252
    out TCNT0, acc
    rcall sek
    sbi ster, E
    cbi ster, E


    Ja tez jestem na etapie LCD i w nocy mi nie dzialala czesc z obsługą busy flag, pozniej ktos mnie teoretycznie naprowadzil i po przeczytaniu powyzszego znow mam metlik w glowie. Czy powyzszy kod (szczegolnie ten zaznaczony gwiazdkami) sprawdza poprawnie busy flag? Szczegolnie interesuje mnie "sbis PIND, 7" i to co po niej nastepuje.
  • #7 2054974
    grzesio14
    Poziom 14  
    Posty: 138
    To jest tylko kawałek procedury obsługi flagi zajętości.
    zmodyfikowałem napisany wcześniej program.
    Można zrezygnować z sprawdzania flagi zajetości jeśli dasz odpowiednio dłuższe przerwy między kolejnymi rozkazami lub danymi które wysyłasz do wyświetlacza.
    Zamieszczam zmodyfikowany plik wyświetlający literkę A na wyświetlaczu.
    Grzegorz.
    Załączniki:
    • avr i lcd.txt (1.92 KB) Musisz być zalogowany, aby pobrać ten załącznik.

Podsumowanie tematu

✨ Dyskusja dotyczy problemu braku efektu na wyświetlaczu LCD sterowanym przez mikrokontroler AVR (ATmega8515). Autor zamieścił fragmenty kodu asemblerowego do inicjalizacji i obsługi wyświetlacza LCD, jednak nie uzyskiwał żadnej reakcji na ekranie. Wskazano błędy w sekwencji sterowania sygnałem E i RS, gdzie poprawna kolejność to najpierw ustawienie RS, potem impuls na E z odpowiednim opóźnieniem, a następnie jego wyzerowanie. Zwrócono uwagę na konieczność stosowania opóźnień (timeoutów) rzędu co najmniej 40 µs lub sprawdzania flagi BUSY wyświetlacza przed wysłaniem kolejnego rozkazu. W dyskusji pojawił się fragment kodu obsługującego flagę BUSY, wykorzystujący odczyt pinu PIND7. Autor po kolejnych poprawkach i zastosowaniu odpowiednich przerw oraz wzorcowego programu na mikrokontroler 8051 uzyskał poprawne działanie i wyświetlenie znaku na LCD. W efekcie udostępnił zmodyfikowany kod, który może służyć jako przykład dla początkujących.
Wygenerowane przez model językowy.
REKLAMA