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
..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
voidSend_Command(uint8_tzeichen)
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
:-)