Forum: Compiler & IDEs LCD-Display initialsieren (HD44780)


von Sven B. (Gast)


Angehängte Dateien:

Lesenswert?

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

von Sven B. (Gast)


Lesenswert?

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 !!!

von ASM (Gast)


Lesenswert?

..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

von Karl H. (kbuchegg)


Lesenswert?

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 
:-)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.