LCD-Display initialsieren (HD44780)

Gast #3386504
Moin,

ich habe mein 2x16-Display mit C-Code initalisiert und ein (char)'A' 
anzeigen lassen.
Das klappt ohne Probleme(C-Program im Anhang).

Jetzt will ich mit Assembler das Display initialisieren und ein 
(char)'A'
anzeigen lassen.
Das klappt nicht        (Assembler-Program im Anhang).


Habe jede Funktion vom C-Prog in Assembler geschrieben.
Im C-Prog nutze ich die Wartefunktio _delay_ms() , _delay_us
In Assembler nutze ich wait50 , wait4100
Habe auch mit Oszi die Funktionen wait50 und wait4100 überprüft.


Könnt ihr bitte mal nachschauen ob euch ein Fehler auffällt.



Nutze Externen Quarz mit 8MHZ . Beachte das auch bei den FUSE-BITs
Thx
Angehängte Dateien:
Gast
So habe meinen Fehler gefunden ;)

Habe die Funktion SendData umgeschrieben:
1
SendData:
2
    push   r16
3
    push   r17
4
    push   r18
5
    
6
    cbi  PORTD,7
7
    cbi  PORTD,6
8
    cbi  PORTD,5
9
    cbi  PORTD,4
10
  
11
    mov    r16,r20        //R20 = Originalzeichen
12
    andi  r16 , 0b11110000      //HIGH NIBBLE in R16
13
  
14
    out    PORTD,r16
15
    sbi    PORTD,2       //RS Bit setzen
16
    rcall  ENABLE
17
  
18
    cbi    PORTD,7
19
    cbi    PORTD,6
20
    cbi    PORTD,5
21
      cbi    PORTD,4
22
    
23
    mov  r17 , r20
24
    rol  r17
25
    rol  r17
26
    rol  r17
27
    rol  r17
28
    
29
    andi  r17,0b11110000
30
    out  PORTD,r17
31
    sbi  PORTD,2     //RS Bit setzen
32
    rcall  ENABLE
33

34
    cbi    PORTD,2
35

36
    pop   r18
37
    pop   r17
38
    pop   r16
39
    ret
So funktoniert es !!!
Gast
..Warst schneller;-)
Für alle Mitleser:
SendData:

    sbi    PORTD,2        //RS-BIT setzen
    rcall  SendCommand

-->Hier wurde RS richtigerweise auf High gesetzt, um dem Controller 
mitzuteilen, dass jetzt Daten gesendet werden sollen

...



//FUNCTION SendCommand: Zeichen -> R20
//Beschreibung:        Setzt HIGH-Nibble von R20 an PD7...PD4 -> Enable
//            Setzt LOW -Nibble von R20 an PD7...PD4 -> Enable
//**********************************************************************
SendCommand:
    push r16
    push r17
    push r18


    mov   r16 , r20        //R20 -> OriginalZeichen
    andi  r16 , 0b11110000  //HIGH NIBBLE in R16


-->Die Maske und das nachfolgende "out" löschen das RS Bit wieder, so 
dass der Controller die eintreffenden Daten nicht als "Daten", sondern 
als "Command" interpretiert.
    out    PORTD,r16


    rcall  ENABLE
Die beiden Codes (C - Assembler)sind immer noch nicht identisch. Denn 
das hier
1
void Send_Command(uint8_t zeichen)
2
{
3
  
4
  PORTD = PORTD & 0x0F;                  //Löscht PD7...PD4
5
  
6
                                                          //Speichert 4-Bit des Zeichens
7
  PORTD =PORTD | (zeichen & 0xF0);                        //Setzt PD7...PD4 ,je nach Zeichencode
8
    
9
  Process();
10

11
  PORTD = PORTD & 0x0F;                   //Löscht PD7...PD4  
12

13
  PORTD = PORTD | (zeichen << 4);        //Setzt die zweiten 4-Bit des Zeichens, an PD7...PD4
14
  
15
  Process();
16
  
17
}
gibt darauf acht, nur die am PORTD vorhandenen Bits zu verändern, die 
auch tatsächlich mit der LCD Steuerung zu tun haben.

Während das hier
1
SendData:
2
    push   r16
3
    push   r17
4
    push   r18
5
    
6
    cbi  PORTD,7
7
    cbi  PORTD,6
8
    cbi  PORTD,5
9
    cbi  PORTD,4
10
  
11
    mov    r16,r20        //R20 = Originalzeichen
12
    andi  r16 , 0b11110000      //HIGH NIBBLE in R16
13
  
14
    out    PORTD,r16
15
    sbi    PORTD,2       //RS Bit setzen
rundumschlagmässig den kompletten PORTD verändert.

Solltest du jemals in die Situation kommen, die beiden noch 
verbleibenden Bits am Port D auch tatsächlich für irgendetwas zu 
benötigen, dann wird dir dieser Assembler-Code noch viel Freude bereiten 
:-)

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 13 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.