www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik LCD-Ansteuerung: ATmega32 + DEM16481


Autor: Jeremia (jeb) (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Ich bin noch ziemlich neu im Mikrocontrollerbereich, habe aber bereits 
Erfahrung im Programmieren. Ich versuche gerade, ein LCD-Display mit 
meinem ATmega32 anzusteuern. Leider funktioniert es nicht. Es handelt 
sich um ein DEM16481, gekauft bei csd-electronics. Es ist ein 
KS0070B-Chip drauf. Der Code entspricht ziemlich dem im AVR-Tutorial. 
Angepasst sind nur die Pins und die delay_5ms-Funktion. DB 4-7 sind an 
Port-C 4-7. Nachdem der Code nicht funktionierte, probierte ich es nach 
der Variante im Datenblatt aus: 
http://www.csd-electronics.de/data/pdf/DEM16481SYH-LY.pdf aber auch das 
ging nicht. Ich würde mich freuen, wenn sich jemand meinen Code angucken 
könnte. Mir ist bewusst, das es recht viele Zeilen sind. Im IRC hab ich 
auch schon nachgefragt.

Vielen Dank,

jeb

test.asm:
.include  "m32def.inc"
  rjmp  start
;; other includes
.include  "lcd.inc"

start:

;;  RAM-Setup
  ldi  r16,LOW(RAMEND)
  out  SPL,r16
  ldi  r16,HIGH(RAMEND)
  out  SPH,r16

;;  LCD-Setup
  ldi r16,0xFF
  out DDRC,r16
  out  PORTC,r16

;;  Checking LCD-Display
  rcall  lcd_init
  rcall  lcd_clear

  ldi    r16,'T'
  rcall  lcd_data

  ldi    r16,'e'
  rcall  lcd_data

  ldi    r16,'s'
  rcall  lcd_data

  ldi    r16,'t'
  rcall  lcd_data

  ldi    r16,'!'
  rcall  lcd_data

end:  rjmp end

lcd.inc:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;         LCD-Routines       ;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;  Functions for public access:  ;;
;;  ============================  ;;
;;                                ;;
;;  lcd_init:    inits the lcd ;;
;;          with needed   ;;
;;          data          ;;
;;  lcd_command:  sends a cmd   ;;
;;          to the lcd    ;;
;;  lcd_data:    sends a data  ;;
;;          byte to lcd    ;;
;;  lcd_clear:    clears lcd    ;;
;;  lcd_home:    moves cursor  ;;
;;          to beginning  ;;
;;                                ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

.equ  LCD_PORT  = PORTC
.equ  LCD_DDR    = DDRC
.equ  PIN_E    = 3
.equ  PIN_RS    = 2

.equ  DELAY_50US  = $42
.equ  DELAY_5MS  = 100


; Delay 50us
lcd_delay_50us:
  push  r16
  ldi    r16,DELAY_50US
lcd_delay_50us_:
  dec    r16
  brne  lcd_delay_50us_
  pop    r16
  ret

; Delay 5ms
lcd_delay_5ms:
  push  r16
  push  r17
  ldi    r17,DELAY_5MS
lcd_delay_5ms_:
  ldi    r16,DELAY_50US
lcd_delay_5ms__:
  dec    r16
  brne  lcd_delay_5ms__
  dec    r17
  brne  lcd_delay_5ms_
  pop    r17
  pop    r16
  ret

; Enable ON -> store data in LCD
lcd_enable:
  sbi  LCD_PORT,PIN_E
  nop
  nop
  nop
  cbi  LCD_PORT,PIN_E
  ret

; Send command to LCD
lcd_command:
  push  r17
  push  r16
  mov    r17,r16
  andi  r16,0b11110000
  out    LCD_PORT,r16
  rcall  lcd_enable
  swap  r17
  andi  r17,0b11110000
  out    LCD_PORT,r17
  rcall  lcd_enable
  rcall  lcd_delay_50us
  pop    r16
  pop    r17
  ret

; Send data to LCD (rs=1)
lcd_data:
  push  r17
  push  r16
  mov    r17,r16
  andi  r16,0b11110000
  sbr    r16,1<<PIN_RS
  out    LCD_PORT,r16
  rcall  lcd_enable
  swap  r17
  andi  r17,0b11110000
  sbr    r17,1<<PIN_RS
  out    LCD_PORT,r17
  rcall  lcd_enable
  rcall  lcd_delay_50us
  pop    r16
  pop    r17
  ret

; Initialize LCD
lcd_init:
  push  r16          ; Setting data direction
  ldi    r16,0xFF
  out    LCD_DDR,r16

  ldi    r16,6        ; Wait for lcd power-up
lcd_powerup:
  rcall  lcd_delay_5ms
  dec    r16
  brne  lcd_powerup

;  ldi    r16,0b00000011    ; Send init-msg 3x
;  out    LCD_PORT,r16
;  rcall  lcd_enable
;  rcall  lcd_delay_5ms
;  rcall  lcd_enable
;  rcall  lcd_delay_5ms
;  rcall  lcd_enable
;  rcall  lcd_delay_5ms
;  ldi    r16,0b00000010    ; 4-bit mode
;  out    LCD_PORT,r16
;  rcall  lcd_enable
;  rcall  lcd_delay_5ms
;  ldi    r16,0b00101000    ; 4-bit,2/4 lines
;  rcall  lcd_command
;  ldi    r16,0b00001100    ; display=on,cursor=off,blink=off
;  rcall  lcd_command
;  ldi    r16,0b00000100    ; dec,no scroll
;  rcall  lcd_command

; init like in datasheet for dem16481
  ldi    r16,0b00100000
  rcall  lcd_command
  rcall  lcd_command
  ldi    r16,0b10000000
  rcall  lcd_command
  ldi    r16,0b00000000
  rcall  lcd_command
  ldi    r16,0b11000000
  rcall  lcd_command
  ldi    r16,0b00000000
  rcall  lcd_command
  ldi    r16,0b00010000
  rcall  lcd_command
  rcall  lcd_delay_5ms
  ldi    r16,0b00000000
  rcall  lcd_command
  ldi    r16,0b01000000
  rcall  lcd_command

  pop    r16
  ret

; Clear LCD
lcd_clear:
  push  r16
  ldi    r16,0b00000001
  rcall  lcd_command
  rcall  lcd_delay_5ms
  pop    r16
  ret

; Cursor @ home position
lcd_home:
  push  r16
  ldi    r16,0b00000010
  rcall  lcd_command
  rcall  lcd_delay_5ms
  pop    r16
  ret

Autor: Otto (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Jeremia,

für meinen Geschmack sind sowohl die
"Delays" im "LCD-Init" als auch das
"LCD-enable" sehr kurz....

Gruss Otto

Autor: Jeremia (jeb) (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi!

Würden 5ms genügen? Probiere das mit den nops mal aus. Laut Datenblatt 
genügen 220ns.

mfg, jeb

Autor: Jeremia (jeb) (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Folgendes ist mir aufgefallen: Wenn ich die Stromversorgung einschalte, 
dann sind für etwa 1s alle Zeichen auf dem Display scwarz, dann nur noch 
die 1. und 3. Reihe. Trenne ich das Display vom Netz und schliesse ich 
es wieder an, so sind es direkt 1 und 3. Könnte das am Programm oder 
daran liegen, dass Programmer, Controller und Display gleichzeitig 
anfangen zu arbeiten?

Autor: Otto (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Jeremia,

dann wird generell nur die 2. Reihe initialisiert
ggf. gehen daher Deine Buchstaben ins Nirvana
(in die erste nicht initialisierte Zeile)

Versuche mal, 120 Zeichen auszugeben, dann siehst
Du ob die 2. Zeile richtig initialisiert ist.

Und überprüfe bitte Dein "Init"

Gruss Otto

Autor: Jeremia (jeb) (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi!

Also ich habe noch zwei Fehler gefunden (1x falscher pin, einige labels 
falsch) und jetzt funktioniert es. Vielen Dank.

mfg, jeb

Autor: arthur (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
habe auch so ein Display heute gekauft.

hast am Display Änderungen an den Jumpers vornehmen müssen oder sonst 
was am Display?
Danke Arthur

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.