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.

Problem z inicjalizacją wyświetlacza.

17 Sty 2005 18:34 1008 4
  • Poziom 15  
    Mam już dość!!! LCD zachowuje się dość przypadkowo. Czasami coś wyświetli, ale w innym miejscu niż chciałbym, po wyłączeniu zasilania pamięta co wyświetlał ostatnio ... jakaś dziwna sprawa.

    Chce na początek wyświetlić "0" na pierwszej pozycji wyświetlacza. Oto program:

    .nolist ;
    .include "2313def.inc" ;
    .list ;
    .listmac ;
    ;***********************
    .equ RS = 0 ; Register Select
    .equ RW = 1 ; Read/Write
    .equ E = 2 ; Enable
    .equ BUSY = 7 ; BUSY flag
    ;***********************
    ;-------------------- Początek segmentu kodu (Code Segment) -------------------
    .cseg ;
    .org 0 ;
    rjmp ResetProcessor ;
    ;----------------- Tabela wektorów przerwań (Interrupt Vectors)
    .org OVF0addr ; Overflow0 Interrupt
    rjmp Timer ; Vector Address
    ;---------------------------------------------------------------------------------------------
    ResetProcessor : ;
    ldi R16,LOW(RAMEND) ; inicjacja stosu
    out SPL,R16 ; programowego
    ldi R16,0xff
    out DDRB,R16 ; PORTB jako wyjcsie
    out DDRD,R16 ; PORTD jako wyjscie
    ldi r16,0x80
    out SREG,r16 ;odblokowanie przerwań
    ldi r16,0b00000101
    out TCCR0,r16 ;timer taktowany CK/1024 impuls=128us,start
    ldi r16,0x02
    out TIMSK,r16 ;odblokowanie przerwania od timera0
    ldi r19,2 ;trzy razy wysyłamy tą samą instrukcję

    Powtorz: ; odmierzam tutaj 3 razy dlugie odcinki czasu
    ; i przesyłam 0x3* do lcd
    ldi r16,177
    out TCNT0,r16 ; timer zliczał 79 impulsów ok 10ms
    ldi r17,10 ;10*10ms aby zainicjowac wyswietlacz
    rcall Czekaj
    ldi R16, 0b00110000 ;
    rcall ZapiszInstrukcje
    cpi R19,0;
    in r20,SREG ;do sprawdzenie znacznika Z
    sbrc r20,1 ;(zero) Z na drugiej pozycji SREG
    rjmp Omin ; jesli wykonales 3 razy to wyjdz z petli
    dec r19
    rjmp Powtorz
    Omin:
    ldi r17,1 ;10ms aby zainicjowac wyswietlacz
    rcall Czekaj ;nastepnym razem będzie sprawdzane BUSY
    ldi r16,0b00000000
    out TCCR0,r16 ;timer stop
    ldi r16, 0b00111000 ;8 bitow, dwie linie 5x7
    rcall ZapiszInstrukcje
    rcall WaitBusy

    ldi r16, 0b00001000 ;LCD off
    rcall ZapiszInstrukcje
    rcall WaitBusy

    ldi r16, 0b00000001 ;LCD clear
    rcall ZapiszInstrukcje
    rcall WaitBusy


    ldi r16, 0b00000110 ;autoinkremendacja położenie kursora
    rcall ZapiszInstrukcje
    rcall WaitBusy

    ldi r16, 0b00000010 ;ustawienie kursora na poczatku
    rcall ZapiszInstrukcje
    rcall WaitBusy


    ldi r16, 0b00001111 ;wł LCD z migającym kursorem
    rcall ZapiszInstrukcje
    rcall WaitBusy

    ;ldi r16, 0b10000001 ;ustawienie adresu Display Data RAM
    ;rcall ZapiszInstrukcje
    ;rcall WaitBusy

    ldi R16,0x30 ;czyli wyświetl zero
    rcall ZapiszDana
    rcall WaitBusy

    Loop: rjmp Loop ;tu się zatrzymaj


    ;***********************

    ;***************************************
    ZapiszInstrukcje:
    cbi PORTD,RS
    cbi PORTD,RW
    sbi PORTD,E
    out PORTB,R16
    nop
    nop
    cbi PORTD,E ;
    ret
    ;*********************************
    ZapiszDana: ; Write data to data register
    sbi PORTD, RS
    cbi PORTD, RW
    sbi PORTD, E ;
    out PORTB, r16 ; out data
    nop ;
    nop ;
    cbi PORTD, E ;
    ret
    ;***********************
    WaitBusy: ;CZEKA W PETLI DOPOKI BUSY = 0

    cbi PORTD, RS
    sbi PORTD, RW
    ldi R16,0x00
    out DDRB,R16 ; PORTB jako wejście
    sbi PORTD, E
    ReadBusy:
    in R16,PINB
    sbrc R16,BUSY ;jeśli BUSY=0 to przeskakuje jedną instrukcje
    rjmp ReadBusy
    cbi PORTD, E
    ldi R16,0xff
    out DDRB,R16 ; PORTB jako wyjscie
    ret
    ;***********************
    Czekaj: ;czeka aż licznik zmniejszy r17 do 0
    cpi R17,0;
    in r18,SREG ;do sprawdzenie znacznika Z
    sbrc r18,1 ;(zero) Z na drugiej pozycji SREG
    ret
    rjmp Czekaj
    ;************************
    Timer:
    out TCNT0,r16
    DEC R17
    reti

    .exit
  • Poziom 39  
    Witam.
    Tak na szybko 2 "byczki".
    Code:

    ZapiszInstrukcje:
    cbi PORTD,RS
    cbi PORTD,RW
    sbi PORTD,E
    out PORTB,R16
    nop
    nop
    cbi PORTD,E ;
    ret

    Powinno być:
    ZapiszInstrukcje:
    cbi PORTD,RS
    cbi PORTD,RW
    out PORTB,R16 ;najpierw dane do portu , a dopiero potem cykl UP/DOWN na ENA
    sbi PORTD,E
    nop
    nop
    cbi PORTD,E ;
    ret
    Code:

    Timer:
    out TCNT0,r16
    DEC R17
    reti

    Skąd wiadomo co w r16 "piszczy" :?: (jaka wartość znajduje się w rej. r16)

    Narazie tyle zerknąłem :wink:

    Pozdrawiam
    Piotrek
  • Poziom 15  
    W rejestrze R16 jest zawsze ta sama wartość wynikająca z instrukcji
    ldi r16,177. Dopisałem ją również po etykiecie "Timer:" ale to niczego nie zmieniło.
    Odnośnie sygnału Enable to ja się doszukałem że właśnie najpierw trzeba go ustawić w stan wysoki a dopiero później zmienić dane.
  • Poziom 39  
    LuznyTomasz napisał:

    ...
    Odnośnie sygnału Enable to ja się doszukałem że właśnie najpierw trzeba go ustawić w stan wysoki a dopiero później zmienić dane.


    To źle doszukałeś :(
    Spójrz poniżej na zależności dla HD44780 (chyba że masz inny sterownik)

    Pozdrawiam
    Piotrek
  • Poziom 15  
    Hmm... patrząc na te przebiegi dochodzę do wniosku że dane "podnierane" są w momencie obadającego zbocza na E. Możliwe że w złej kolejności ustawiam te sygnały. Gdy próbowałem ustawić je tak jak ty napisałeś nie zmieniła się sytuacja z moim wyświetlaczem :(
    Myśle że to jest problem z odczytywaniem znacznika BUSY (pin7 portu B). Wcześniej PORTB jest portem wyjściowym i ustawiłem go na wartość 0, potem zmieniam go na wejściowy - LCD powinien ustawić na nim jedynkę ale pewnie z jakiś względow nie może.

    To tylko moje domysły.... co o tym sądzisz?

    Edit: Taaaaakkkkkk!!!! To był ten problem!!!!!!!! Ale jestem szczęśliwy :D