Forum: Mikrocontroller und Digitale Elektronik LCD Display Problem bei ATTiny26


von Protector (Gast)


Lesenswert?

Hallo. ich wollte das lcd tutorial durcharbeiten und habe ein 20x4 
display bestellt. ist gestern gekommen und habe es mit folgendem code 
probiert:
1
; Bei 4Mhz ATTiny26
2
3
.include "tn26def.inc"       
4
5
.def temp1 = r16
6
.def temp2 = r17
7
.def temp3 = r18
8
 
9
 
10
           ldi temp1, RAMEND     ; LOW-Byte der obersten RAM-Adresse
11
12
 
13
           rcall lcd_init              ; Display initialisieren
14
           rcall lcd_clear             ; Display löschen
15
 
16
           ldi ZL, LOW(text*2)         ; Adresse des Strings in den
17
           ldi ZH, HIGH(text*2)        ; Z-Pointer laden
18
 
19
           rcall lcd_flash_string      ; Unterprogramm gibt String aus der
20
                                       ; durch den Z-Pointer adressiert wird
21
loop:
22
           rjmp loop
23
 
24
text:
25
           .db "Test",0                ; Stringkonstante, durch eine 0
26
                                       ; abgeschlossen  
27
 
28
.include "lcd-routines.asm"            ; LCD Funktionen

Läuft aber überhaupt nicht. Hab es an einem ATTiny26 am Port A - liegt 
der Fehler vielleicht hier drin!? Alles was ich auf dem LCD Display sehe 
sind 2 Balken in der 2 und 4 Zeile. Weder Schrift noch sonst irgendwas 
erscheint oder bewegt sich.... vielleicht kann mir ja jemand bei der 
Fehlerfindung helfen. Gruß Protector

von Frank (Gast)


Lesenswert?

ich kenn deine LCD Routinen nicht aber muss da nicht eventuell der 
Displaytyp angegeben werden um korrekt initialisieren zu können? Passt 
das Display überhaupt zu den LCD Routinen? Manche Displays sind zwar zu 
99% kompatibel zum Hitachi-Chipsatz aber das fehlende Prozent verhindert 
die korrekte Initialisierung.

bye

Frank

von Spess53 (Gast)


Lesenswert?

Hi

Du hast vegessen temp1 in das Stackpointerregister zu laden.

MfG Spess

von Protector (Gast)


Lesenswert?

Danke erstmal für die Antworten. Das mit den LCD-Routinen weiß ich 
nicht, aber ich habs über assembler und über bascom basic probiert und 
beides hat nicht funktioniert.

Zum Stackpointer: Beim ATTiny26 gibt es die SPL und SPH nicht, womit man 
doch normalerweise den Stackpointer initialiisiert. Was soll ich denn 
stattdessen hinschreiben? Habe auch schon probiert "per Hand", so wie es 
in der Bedienungsanleitung angegeben ist, nachzuprogrammieren, hat aber 
auch nicht funktioniert.

Ich habe das Display W204B von der Firma Assembly Design von Reichelt. 
Vielleicht hätte jemand von euch ein kleines Stück Code um zumindest die 
Funktionalität des Display festzustellen!?

Löschen "per Hand" ließ sich das LCD indem ich enable pin auf 5V gezogen 
habe, dann waren selbst die 2 Balken weg. Aber lässt sich nichts 
programmieren!?!?

von Frank (Gast)


Lesenswert?

ne Initialisierung in Assembler für ein EA204 findest du hier im Forum. 
Das ist z.B. so ein Display das eben nur zu 99% kompatibel ist. Wer 
suchet der findet...

bye
Frank

von Frank (Gast)


Lesenswert?

ach ja, wenn der SP nur 8bit hat wäre SPL und SPH ziemlich überflüssig.
RTFM

von Thomas (kosmos)


Lesenswert?

ldi temp, RAMEND     ;Stackpointer initialisieren
out SP, temp

so muss das beim ATTiny26 ausschauen.

von Thomas (kosmos)


Lesenswert?

und hier haste das Datenblatt für HD44780 kompatible Controller
http://www.mikrocontroller.net/articles/HD44780

also schau noch mal in die Routinen lcd_init und lcd_clear ob du da die 
richtigen Commandos übergibst.

von Protector (Gast)


Lesenswert?

Hallo nochmal,
habe mittlerweile das halbe Forum durchsucht und auch einiges gefunden. 
Die Initfunktionen, die ich gefunden habe, habe ich auch alle (!) 
ausprobiert. Aber das Display zeigt immer noch in der 2 und 4 Zeile 
Balken an und es tut sich nichts. habe mich bereits vergewissert ( mit 
einer blinkenden LED), dass der Controller nicht stecken geblieben ist!
Hier meine Anschlussbelegung:

1. VSS    ->    GND
2. VDD    ->    +5V
3. VEE    ->    Poti (klappt auch!)
4. RS     ->    PortA 4
5. R/W    ->    GND
6. E      ->    PortA 5
7. D0     ->    GND
8. D1     ->    GND
9. D2     ->    GND
10.D3     ->    GND
11.D4     ->    PortA 0
12.D5     ->    PortA 1
13.D6     ->    PortA 2
14.D7     ->    PortA 3
15.LED+   ->    Vorwiderstand +5V
16.LED-   ->    GND

Und hier mein aktueller Code:
1
; Bei 4Mhz ATTiny26
2
3
.include "tn26def.inc"       
4
5
.def temp1 = r20
6
.def temp2 = r21
7
.def temp3 = r22
8
 
9
           ldi temp1, RAMEND     ; LOW-Byte der obersten RAM-Adresse
10
       out SP, temp1
11
 
12
        ; PortA als Ausgang definieren
13
        ldi temp3, 0xFF
14
        out DDRA, temp1
15
16
17
           rcall lcd_init              ; Display initialisieren
18
19
20
 
21
loop:
22
23
rjmp loop
24
 
25
26
 ; sendet einen Befehl an das LCD
27
lcd_command:                            ; wie lcd_data, nur ohne RS zu setzen
28
           mov temp2, temp1
29
           swap temp1
30
           andi temp1, 0b00001111
31
           out PORTA, temp1
32
           rcall enable
33
34
           andi temp2, 0b00001111
35
           out PORTA, temp2
36
           rcall enable
37
38
           rcall delay50us
39
           ret
40
41
42
 ; Initialisierung: muss ganz am Anfang des Programms aufgerufen werden
43
lcd_init:
44
           ldi  temp3,50
45
wait250ms:
46
           rcall  delay5ms
47
           dec  temp3
48
           brne wait250ms
49
50
           ldi temp1, 0b00000010        ; 4bit-Modus einstellen
51
           out PORTA, temp1
52
           rcall enable
53
54
           rcall delay5ms
55
           ldi temp1, 0b00100100        ; 4Bit / 2 Zeilen / 5x8
56
           rcall lcd_command
57
           ldi temp1, 0b00001110        ; Display ein / Cursor ein / Blinken
58
           rcall lcd_command
59
           ldi temp1, 0b00000001        ; Display Löschen
60
           rcall lcd_command
61
       rcall delay5ms
62
           ret
63
64
ret
65
66
67
; Enable Ausgang schalten
68
enable:
69
      sbi PORTA, 5
70
      nop
71
      nop
72
      nop
73
      cbi PORTA, 5
74
ret               
75
76
77
 ;Pause nach jeder ?bertragung
78
delay50us:                              ;50us Pause
79
           ldi  temp1, $42
80
delay50us_:dec  temp1
81
           brne delay50us_
82
           ret                          ;wieder zur?ck
83
84
85
 ;L?ngere Pause f?r manche Befehle
86
delay5ms:                               ;5ms Pause
87
           ldi  temp1, $21
88
WGLOOP0:   ldi  temp2, $C9
89
WGLOOP1:   dec  temp2
90
           brne WGLOOP1
91
           dec  temp1
92
           brne WGLOOP0
93
           ret                          ;wieder zur?ck

von Michael U. (Gast)


Lesenswert?

Hallo,


        ; PortA als Ausgang definieren
        ldi temp3, 0xFF
        out DDRA, temp1


Es macht wenig Sinn, temp3 mit 0xFF zu laden und dann temp1 in das 
Richtungsregister zu schreiben... :)

Ansonsten sieht Init eigentlich ok aus, da ist ein KS0073 auf dem 
Display?

Gruß aus Berlin
Michael

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.