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
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 !!!
..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 :-)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.