mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik LCD Display Problem bei ATTiny26


Autor: Protector (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo. ich wollte das lcd tutorial durcharbeiten und habe ein 20x4 
display bestellt. ist gestern gekommen und habe es mit folgendem code 
probiert:
; Bei 4Mhz ATTiny26

.include "tn26def.inc"       

.def temp1 = r16
.def temp2 = r17
.def temp3 = r18
 
 
           ldi temp1, RAMEND     ; LOW-Byte der obersten RAM-Adresse

 
           rcall lcd_init              ; Display initialisieren
           rcall lcd_clear             ; Display löschen
 
           ldi ZL, LOW(text*2)         ; Adresse des Strings in den
           ldi ZH, HIGH(text*2)        ; Z-Pointer laden
 
           rcall lcd_flash_string      ; Unterprogramm gibt String aus der
                                       ; durch den Z-Pointer adressiert wird
loop:
           rjmp loop
 
text:
           .db "Test",0                ; Stringkonstante, durch eine 0
                                       ; abgeschlossen  
 
.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

Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Du hast vegessen temp1 in das Stackpointerregister zu laden.

MfG Spess

Autor: Protector (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!?!?

Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Frank (Gast)
Datum:

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

Autor: Thomas O. (kosmos)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ldi temp, RAMEND     ;Stackpointer initialisieren
out SP, temp

so muss das beim ATTiny26 ausschauen.

Autor: Thomas O. (kosmos)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Protector (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
; Bei 4Mhz ATTiny26

.include "tn26def.inc"       

.def temp1 = r20
.def temp2 = r21
.def temp3 = r22
 
           ldi temp1, RAMEND     ; LOW-Byte der obersten RAM-Adresse
       out SP, temp1
 
        ; PortA als Ausgang definieren
        ldi temp3, 0xFF
        out DDRA, temp1


           rcall lcd_init              ; Display initialisieren


 
loop:

rjmp loop
 

 ; sendet einen Befehl an das LCD
lcd_command:                            ; wie lcd_data, nur ohne RS zu setzen
           mov temp2, temp1
           swap temp1
           andi temp1, 0b00001111
           out PORTA, temp1
           rcall enable

           andi temp2, 0b00001111
           out PORTA, temp2
           rcall enable

           rcall delay50us
           ret


 ; Initialisierung: muss ganz am Anfang des Programms aufgerufen werden
lcd_init:
           ldi  temp3,50
wait250ms:
           rcall  delay5ms
           dec  temp3
           brne wait250ms

           ldi temp1, 0b00000010        ; 4bit-Modus einstellen
           out PORTA, temp1
           rcall enable

           rcall delay5ms
           ldi temp1, 0b00100100        ; 4Bit / 2 Zeilen / 5x8
           rcall lcd_command
           ldi temp1, 0b00001110        ; Display ein / Cursor ein / Blinken
           rcall lcd_command
           ldi temp1, 0b00000001        ; Display Löschen
           rcall lcd_command
       rcall delay5ms
           ret

ret


; Enable Ausgang schalten
enable:
      sbi PORTA, 5
      nop
      nop
      nop
      cbi PORTA, 5
ret               


 ;Pause nach jeder ?bertragung
delay50us:                              ;50us Pause
           ldi  temp1, $42
delay50us_:dec  temp1
           brne delay50us_
           ret                          ;wieder zur?ck


 ;L?ngere Pause f?r manche Befehle
delay5ms:                               ;5ms Pause
           ldi  temp1, $21
WGLOOP0:   ldi  temp2, $C9
WGLOOP1:   dec  temp2
           brne WGLOOP1
           dec  temp1
           brne WGLOOP0
           ret                          ;wieder zur?ck

 


Autor: Michael U. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.