mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik LCD Hängt immer Datenmüll an


Autor: Sören T. (stimmy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich hatte mir vor ein paar Wochen 2 von diesen 8x2 Displays(C0802-04) 
von Pollin gekauft und habe sie gestern einmal angeschlossen.

Wenn das Display initialisiert und gecleart ist sind beide total leer.
Sobald ich ein Zeichen ausgebe hängt er wieder diese Zeichen an.

Bild: Ausgabe <SPACE>1 war gedacht und was bei raus gekommen ist, ist ja 
zu sehen.

Es war mir erst auf den beiden Kleinen von Pollin aufgefallen und 
deswegen habe ich mein 20x4 Display parallel dazu angeschlossen.

Hat jemand eine Idee was das soll?

MfG

Autor: Floh (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sören Timm schrieb:
> ist ja zu sehen.
äh nein.

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Weder Code noch Bild.  Und die Kristallkugeln sind in diesen Tagen voll 
von Schneegestöber.

Autor: Sören T. (stimmy)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Das BIld

Autor: Sören T. (stimmy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe die Standard LCD-Routines.asm von dieser Seite genommen und an 
den AVR angepasst.

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Routinen funktionieren ja wohl sonst, die LCDs auch.  Bleibt nicht 
viel über.

Kein Code.  Keine Kekse.

Autor: Thomas Horn (flaretom)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich weiß jetzt nicht konkret, wie bei der LCD-Routines.asm die String 
Terminierung aussehen muss.
Es sieht aber so aus, als ob du die \0 am Ende vergessen oder die 
Stringlänge falsch übergeben hast.
Stell doch mal den Aufruf der LCD Routine rein.

Autor: Spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Ich habe die Standard LCD-Routines.asm von dieser Seite genommen und an
>den AVR angepasst.

Da scheint etwas dabei schief gegangen zu sein. Also zeig mal deinen 
aktuellen Code.

MfG Spess

Autor: Sören T. (stimmy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
.include "m8def.inc"

 

.def temp1 = r16



 

Stack: 

           ldi temp1, LOW(RAMEND)

           out SPL, temp1

       ldi temp1, HIGH(RAMEND)

           out SPH, temp1



Display1: 

           rcall lcd_init

           rcall lcd_clear

 

           ldi ZL, LOW(text*2)

           ldi ZH, HIGH(text*2)

 

           rcall lcd_flash_string



loop:

           rjmp loop

 

text:

          .db " 1"





 

.include "lcd-routines.asm"
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;                 LCD-Routinen                ;;

;;                 ============                ;;

;;              (c)andreas-s@web.de            ;;

;;                                             ;;

;; 4bit-Interface                              ;;

;; DB4-DB7:       PD0-PD3                      ;;

;; RS:            PD4                          ;;

;; E:             PD5                          ;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

 

.def temp2 = r22

.def temp3 = r23

 

.equ LCD_PORT = PORTC

.equ LCD_DDR  = DDRC

.equ PIN_RS   = 4

.equ PIN_E    = 5



.ifndef XTAL

.equ XTAL = 1000000

.endif



 ;sendet ein Datenbyte an das LCD

lcd_data:

           push  temp2

           push  temp3

           mov   temp2, temp1            ; "Sicherungskopie" für

                                         ; die Übertragung des 2.Nibbles

           swap  temp1                   ; Vertauschen

           andi  temp1, 0b00001111       ; oberes Nibble auf Null setzen

           sbr   temp1, 1<<PIN_RS        ; entspricht 0b00010000

           in    temp3, LCD_PORT

           andi  temp3, 0x80

           or    temp1, temp3

           out   LCD_PORT, temp1         ; ausgeben

           rcall lcd_enable              ; Enable-Routine aufrufen

                                         ; 2. Nibble, kein swap da es schon

                                         ; an der richtigen stelle ist

           andi  temp2, 0b00001111       ; obere Hälfte auf Null setzen 

           sbr   temp2, 1<<PIN_RS        ; entspricht 0b00010000

           or    temp2, temp3

           out   LCD_PORT, temp2         ; ausgeben

           rcall lcd_enable              ; Enable-Routine aufrufen

           rcall delay50us               ; Delay-Routine aufrufen



           pop   temp3

           pop   temp2

           ret                           ; zurück zum Hauptprogramm

 

 ; sendet einen Befehl an das LCD

lcd_command:                            ; wie lcd_data, nur ohne RS zu setzen

           push  temp2

           push  temp3



           mov   temp2, temp1

           swap  temp1

           andi  temp1, 0b00001111

           in    temp3, LCD_PORT

           andi  temp3, 0x80

           or    temp1, temp3

           out   LCD_PORT, temp1

           rcall lcd_enable

           andi  temp2, 0b00001111

           or    temp2, temp3

           out   LCD_PORT, temp2

           rcall lcd_enable

           rcall delay50us

 

           pop   temp3

           pop   temp2

           ret

 

 ; erzeugt den Enable-Puls

lcd_enable:

           sbi LCD_PORT, PIN_E          ; Enable high

           nop                          ; 3 Taktzyklen warten

           nop

           nop

           cbi LCD_PORT, PIN_E          ; Enable wieder low

           ret                          ; Und wieder zurück                     

 

 ; Pause nach jeder Übertragung

delay50us:                              ; 50us Pause

           ldi  temp1, ( XTAL * 50 / 3 ) / 1000000

delay50us_:

           dec  temp1

           brne delay50us_

           ret                          ; wieder zurück

 

 ; Längere Pause für manche Befehle

delay5ms:                               ; 5ms Pause

           ldi  temp1, ( XTAL * 5 / 607 ) / 1000

WGLOOP0:   ldi  temp2, $C9

WGLOOP1:   dec  temp2

           brne WGLOOP1

           dec  temp1

           brne WGLOOP0

           ret                          ; wieder zurück

 

 ; Initialisierung: muss ganz am Anfang des Programms aufgerufen werden

lcd_init:

           push  temp1

           in    temp1, LCD_DDR

           ori   temp1, (1<<PIN_E) | (1<<PIN_RS) | 0x0F

           out   LCD_DDR, temp1



           ldi   temp3,6

powerupwait:

           rcall delay5ms

           dec   temp3

           brne  powerupwait

           ldi   temp1,    0b00000011   ; muss 3mal hintereinander gesendet

           out   LCD_PORT, temp1        ; werden zur Initialisierung

           rcall lcd_enable             ; 1

           rcall delay5ms

           rcall lcd_enable             ; 2

           rcall delay5ms

           rcall lcd_enable             ; und 3!

           rcall delay5ms

           ldi   temp1,    0b00000010   ; 4bit-Modus einstellen

           out   LCD_PORT, temp1

           rcall lcd_enable

           rcall delay5ms

           ldi   temp1,    0b00101000   ; 4 Bot, 2 Zeilen

           rcall lcd_command

           ldi   temp1,    0b00001100   ; Display on, Cursor off

           rcall lcd_command

           ldi   temp1,    0b00000100   ; endlich fertig

           rcall lcd_command



           pop   temp1

           ret

 

 ; Sendet den Befehl zur Löschung des Displays

lcd_clear:

           push  temp1

           ldi   temp1,    0b00000001   ; Display löschen

           rcall lcd_command

           rcall delay5ms

           pop   temp1

           ret



 ; Cursor Home

lcd_home:

           push  temp1

           ldi   temp1,    0b00000010   ; Cursor Home

           rcall lcd_command

           rcall delay5ms

           pop   temp1

           ret



 ; Einen konstanten Text aus dem Flash Speicher

 ; ausgeben. Der Text wird mit einer 0 beendet

lcd_flash_string:

           push  temp1



lcd_flash_string_1:

           lpm   temp1, Z+

           cpi   temp1, 0

           breq  lcd_flash_string_2

           rcall  lcd_data

           rjmp  lcd_flash_string_1



lcd_flash_string_2:

           pop   temp1

           ret



 ; Eine Zahl aus dem Register temp1 dezimal ausgeben

lcd_number:

           push  temp1

           push  temp2

           push  temp3



           mov   temp2, temp1

                                  ; abzählen wieviele Hunderter

                                          ; in der Zahl enthalten sind

           ldi   temp1, '0'

lcd_number_1:

           subi  temp2, 100

           brcs  lcd_number_2

           inc   temp1

           rjmp  lcd_number_1

                                          ;

                                          ; die Hunderterstelle ausgeben

lcd_number_2:

           rcall lcd_data

           subi  temp2, -100              ; 100 wieder dazuzählen, da die

                                          ; vorherhgehende Schleife 100 zuviel

                                          ; abgezogen hat



                                          ; abzählen wieviele Zehner in

                                          ; der Zahl enthalten sind

           ldi   temp1, '0'

lcd_number_3:

           subi  temp2, 10

           brcs  lcd_number_4

           inc   temp1

           rjmp  lcd_number_3



                                          ; die Zehnerstelle ausgeben

lcd_number_4:

           rcall lcd_data

           subi  temp2, -10               ; 10 wieder dazuzählen, da die

                                          ; vorhergehende Schleife 10 zuviel

                                          ; abgezogen hat



                                          ; die übrig gebliebenen Einer

                                          ; noch ausgeben

           ldi   temp1, '0'

           add   temp1, temp2

           rcall lcd_data



           pop   temp3

           pop   temp2

           pop   temp1

           ret



; eine Zahl aus dem Register temp1 hexadezimal ausgeben

lcd_number_hex:

           push  temp1



           swap  temp1

           andi  temp1, $0F

           rcall lcd_number_hex_digit



           pop   temp1

           push  temp1



           andi  temp1, $0F

           rcall lcd_number_hex_digit



           pop   temp1

           ret



lcd_number_hex_digit:

           cpi   temp1, 10

           brlt  lcd_number_hex_digit_1

           subi  temp1, -( 'A' - '9' - 1 )

lcd_number_hex_digit_1:

           subi  temp1, -'0'

           rcall  lcd_data

           ret




Autor: Thomas Horn (flaretom)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie wäre es damit:
text:
          .db " 1"
          .db 0

Autor: thisamplifierisloud (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sind alle statischen Steuerleitungen ordentlich festgenagelt
und evtl. erforderliche Pullups-Widerstände bestückt ?

Hatte mal ein I2C-Display, das ein ähnliches Eigenleben hatte,
bis ich die \CS-Leitung auf GND genagelt habe.

Laut Datenblatt hätte man die auch offenlassen können...

Autor: Spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>        .db " 1"

Und wo ist die Null

        .db " 1",0

MfG Spess

Autor: Sören T. (stimmy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bringt diese ,0 den String zum erliegen?
Kann man einen Zeilenumbruch dadurch erreichen?

Autor: Floh (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sören Timm schrieb:
> Bringt diese ,0 den String zum erliegen?

0 ist das definierte Ende einer Zeichenkette.

> Kann man einen Zeilenumbruch dadurch erreichen?

nein.

Autor: Thomas Horn (flaretom)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Null beendet nur den String:

lcd_flash_string_1:
           lpm   temp1, Z+
           cpi   temp1, 0
           breq  lcd_flash_string_2  ; ende


Also kein Zeilenvorschub dadurch.

Autor: Spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Bringt diese ,0 den String zum erliegen?
lcd_flash_string_1:
           lpm   temp1, Z+
           cpi   temp1, 0
           ....

Beim Erreichen der '0' wird die Ausgabe beendet.

>Kann man einen Zeilenumbruch dadurch erreichen?

Nein.

MfG Spess

Autor: Sören T. (stimmy)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Jetzt gehts!

Danke!

Autor: Wampus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Was ist denn das für ein 20x4 Display? Die Zeichen sind wunderbar 
kontrastreich und deutlich lesbar. Das gefällt mir = will auch haben ;)

Gruß Wampus

Autor: Sören T. (stimmy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ist ein YM2004A.
Ich hatte es von einem Polen bei Ebay gekauft.
Musste mal unter dem Begriff "HD44780" bei Ebay suchen.

Autor: Wampus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo und vielen Dank!

Autor: Sören T. (stimmy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wampus schrieb:
> Hallo und vielen Dank!

Ebay-Artikel Nr. 170459060245

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Sören Timm (stimmy)

>      DSCI1467.JPG
>      1.7 MB, 49 Downloads

>Jetzt gehts!

Ja, jetzt geht's mal wieder los. Hirn aus, Spass rein. Ohje!

Lies mal was über Bildformate! Und Netiquette, lange Quelltexte 
gehören in den Anhang!

MfG
Falk

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.