LCD-Display initialsieren (HD44780)

Gast #3386504
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
Angehängte Dateien:
Gast #3387415
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 !!!
Gast #3387519
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
#3388686
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 
:-)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren