Forum: Mikrocontroller und Digitale Elektronik LCD und AVR


von DeltaEx (Gast)


Lesenswert?

also ich habe alle nach dem Tutorial der hier auf der seite ist gemacht
das anschliessen. hab einen 2x16 LCD und ein AT90S231. Wenn ich es
anmache geht das LCD auch und der AVR auch habe die software genauso
wie die ist Assembliert und in Hex umwandelt dann mit PonyProg2000
Write Device das programm draufgeschrieben. Geht aber nix :-( Die
balken auf dem Display bleiben.

Dann habe ich gedacht muss die "2313def.inc" reintun und nicht
"m8def.inc" doch bei Assemblieren krieg ich jetzt den Fehler:

lcd.asm(11) : error : Undefined variable referenced

Der Code ist genau so geblieben nur die include datei nicht:

include ""2313def.inc"

.def temp1 = r16
.def temp2 = r17
.def temp3 = r18


           ldi temp1, LOW(RAMEND)      ; LOW-Byte der obersten
RAM-Adresse
           out SPL, temp1
           ldi temp1, HIGH(RAMEND)     ; HIGH-Byte der obersten
RAM-Adresse
           out SPH, temp1

           ldi temp1, 0xFF    ;Port D = Ausgang
           out DDRD, temp1

           rcall lcd_init     ;Display initialisieren
           rcall lcd_clear    ;Display löschen

           ldi temp1, 'T'     ;Zeichen anzeigen
           rcall lcd_data

           ldi temp1, 'e'     ;Zeichen anzeigen
           rcall lcd_data

           ldi temp1, 's'     ;Zeichen anzeigen
           rcall lcd_data

           ldi temp1, 't'     ;Zeichen anzeigen
           rcall lcd_data

loop:
           rjmp loop

.include "lcd-routines.asm"            ;LCD-Routinen werden hier
eingefügt


Bitte helft mir ich komme nicht weiter. danke im voraus

von Wolfram Hildebrandt (Gast)


Lesenswert?

soweit ich das als PIC-User sehe, hat der 2313 nur 128 Bytes SRAM.
D.h. ein Byte reicht aus, um den SRAM richtig einzustellen.
Mit AVRs bis 255 Byte SRAM musst du wohl nur den Lowramend laden.

...

.def temp3 = r18

ldi temp1, LOW(RAMEND)
out SPL, temp1

ldi temp1, 0xFF    ;Port D = Ausgang

...

Genau dies meckert des AVR-Studio ja auch an. Das SPH-Register
existiert im 2313 nicht, da dies nicht benötigt wird.

von Merle (Gast)


Lesenswert?

@DeltaEX

Fast alle älteren AVR's brauchen nur Low(RAMEND)
also alle AT90S.... aber wie schon gesagt es gibt
unter den AT90S.... Typen auch ausnahmen.

Bei den neuen AVR's--> ATmega.... muss High(RAMEND)
immer dazugeschrieben werden.

Ich hoffe meine kleine
Aufklärung hat dir n
Bisschen geholgen

Mfg. Merle

von DeltaEx (Gast)


Lesenswert?

Ja danke schön es ging jetzt zu Assemblieren, doch am LCD tut sich nix
:-( Der Schwarze balken bleibt. Wie kann ich jetzt vorgehen um den
Fehler rauszufinden?

von Merle (Gast)


Lesenswert?

@DeltaEX

Hast schon nachgeprüft ob alle
Verbindungen zum LCD richtig
angeschlossen sind ??

Poste mal den codewie du ihn
jetzt im AVR Studio stehen hast.

Mfg. Merle

von DeltaEx (Gast)


Lesenswert?

Ich Assebliere lcd.asm mit avrasm32.exe -fG LCD.asm so bekomme ich die
.hex datei

.include "2313def.inc"

.def temp1 = r16
.def temp2 = r17
.def temp3 = r18


           ldi temp1, LOW(RAMEND)      ; LOW-Byte der obersten
RAM-Adresse
           out SPL, temp1

           ldi temp1, 0xFF    ;Port D = Ausgang
           out DDRD, temp1

           rcall lcd_init     ;Display initialisieren
           rcall lcd_clear    ;Display löschen

           ldi temp1, 'T'     ;Zeichen anzeigen
           rcall lcd_data

           ldi temp1, 'e'     ;Zeichen anzeigen
           rcall lcd_data

           ldi temp1, 's'     ;Zeichen anzeigen
           rcall lcd_data

           ldi temp1, 't'     ;Zeichen anzeigen
           rcall lcd_data

loop:
           rjmp loop

.include "lcd-routines.asm"            ;LCD-Routinen werden hier
eingefügt





;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;                 LCD-Routinen                ;;
;;                 ============                ;;
;;              (c)andreas-s@web.de            ;;
;;                                             ;;
;; 4bit-Interface                              ;;
;; DB4-DB7:       PD0-PD3                      ;;
;; RS:            PD4                          ;;
;; E:             PD5                          ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;



 ;sendet ein Datenbyte an das LCD
lcd_data:
           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<<4              ;entspricht 0b00010000
           out PORTD, 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<<4              ;entspricht 0b00010000
           out PORTD, temp2             ;ausgeben
           rcall lcd_enable             ;Enable-Routine aufrufen
           rcall delay50us              ;Delay-Routine aufrufen
           ret                          ;zurück zum Hauptprogramm

 ;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 PORTD, temp1
           rcall lcd_enable
           andi temp2, 0b00001111
           out PORTD, temp2
           rcall lcd_enable
           rcall delay50us
           ret

 ;erzeugt den Enable-Puls
lcd_enable:
           sbi PORTD, 5                 ;Enable high
           nop                          ;3 Taktzyklen warten
           nop
           nop
           cbi PORTD, 5                 ;Enable wieder low
           ret                          ;Und wieder zurück


 ;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

 ;Initialisierung: muss ganz am Anfang des Programms aufgerufen werden
lcd_init:
           ldi  temp3,50
powerupwait:
           rcall  delay5ms
           dec  temp3
           brne  powerupwait
           ldi temp1, 0b00000011        ;muss 3mal hintereinander
gesendet
           out PORTD, 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 PORTD, temp1
           rcall lcd_enable
           rcall delay5ms
           ldi temp1, 0b00101000        ;noch was einstellen...
           rcall lcd_command
           ldi temp1, 0b00001100        ;...nochwas...
           rcall lcd_command
           ldi temp1, 0b00000100        ;endlich fertig
           rcall lcd_command
           ret

 ;Sendet den Befehl zur Löschung des Displays
lcd_clear:
           ldi temp1, 0b00000001   ;Display löschen
           rcall lcd_command
           rcall delay5ms
           ret

von Merle (Gast)


Lesenswert?

@DeltaEx

Entferne folgende zeilen aus deinem code:
-------------------------------------------------------------------
.include "lcd-routines.asm"            ;LCD-Routinen werden hier
eingefügt.
-------------------------------------------------------------------
Vileicht sind die schuld daran
das es nicht funzt.

Mfg. Merle

von DeltaEx (Gast)


Lesenswert?

Aber ohne include gehen dann die Befehle rcall lcd-clear und lcd_data
nicht

von DeltaEx (Gast)


Lesenswert?

das sind zwei dateien bis .include "lcd-routines.asm" ist es lcd.asm
und das andere ist lcd-routines.asm

von Merle (Gast)


Lesenswert?

@DeltaEx

Doch bei mir funzt es ohne .include "lcd-routines.asm"
Lass doch mal folgendes weg in deinem code:

-------------------------------------------------------------------
.include "lcd-routines.asm"            ;LCD-Routinen werden hier
eingefügt


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;                 LCD-Routinen                ;;
;;                 ============                ;;
;;              (c)andreas-s@web.de            ;;
;;                                             ;;
;; 4bit-Interface                              ;;
;; DB4-DB7:       PD0-PD3                      ;;
;; RS:            PD4                          ;;
;; E:             PD5                          ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-------------------------------------------------------------------

Vileicht geht es dann.
Und überprüfe nochmal ob die Verbindungen
zwischen AVR und LCD an der richtigen stelle
sind und nicht unterbrochen sind.

Mfg. Merle

von DeltaEx (Gast)


Lesenswert?

so ich dann die beiden datei in eine tuen??

von Merle (Gast)


Lesenswert?

ne lösche sie aus deinem
Assemblertext.

Mfg. merle

von DeltaEx (Gast)


Lesenswert?

Wie ich befürchtet habe:

Assembling 'C:\WINDOWS\Desktop\elektronik\LCD source\lcd.asm'
Including  '2313def.inc'
C:\WINDOWS\Desktop\elektronik\LCD source\lcd.asm(14) : error :
Undefined variable referenced
C:\WINDOWS\Desktop\elektronik\LCD source\lcd.asm(15) : error :
Undefined variable referenced
C:\WINDOWS\Desktop\elektronik\LCD source\lcd.asm(18) : error :
Undefined variable referenced
C:\WINDOWS\Desktop\elektronik\LCD source\lcd.asm(21) : error :
Undefined variable referenced
C:\WINDOWS\Desktop\elektronik\LCD source\lcd.asm(24) : error :
Undefined variable referenced
C:\WINDOWS\Desktop\elektronik\LCD source\lcd.asm(27) : error :
Undefined variable referenced

Assembly complete with 6 errors

von DeltaEx (Gast)


Lesenswert?

Ich habe eben in BASCOM reingeguckt und da sieht es viel einfacher aus.
Kann hier einer BASIC?? Weil bei Assembler kann ich nicht alles
nachvollziehen deshalb fählt mir die Fehlersuche schwer

von Merle (Gast)


Lesenswert?

Lade dir von www.atmel.com
das Programm AVRStudio
runter und assembliere es.
Dann lädst du es mit Yaap
in den AVR.

Mfg. Merle

von DeltaEx (Gast)


Lesenswert?

Wenn ich mit AVRStudio assembliere erstellt er keine Hex datei!!

von DeltaEx (Gast)


Lesenswert?

Merle kann du mir vieleicht einen Code geben der nur einen Clear macht
damit die Balken verschwinden. Dann kann ich sicher sein das alles
eichtig funktioniert

von Merle (Gast)


Lesenswert?

Doch klar erstellt es die.
Musst nur einen neuen ordner erstellen
und sie dort hinein speichern.

Mfg. Merle

von Merle (Gast)


Lesenswert?

Du musst das Lcd erst initialisieren
bevor du das clear durchführen kannst.

Mfg. Merle

von DeltaEx (Gast)


Angehängte Dateien:

Lesenswert?

Wieso bekomm ich bei E-LAB den Fehler???

Das Bild mit dem Fehler ist im Inhang

von Merle (Gast)


Lesenswert?

Lass das (test.) weg.
Also nur das end stehen lassen.

Mfg. Merle

von DeltaEx (Gast)


Lesenswert?

Wie gross darf der StackSize bei einem AT90S2313 sein??

von Ronny Schulz (Gast)


Lesenswert?

Mal ne dumme Frage. Liegt dein Takt von 4MHz an? Sonst stimmen die
Timings, wie im Tuturial natürlich nicht.

von Wolfram Hildebrandt (Gast)


Angehängte Dateien:

Lesenswert?

Hallo

Dieser Beitrag scheint etwas wirr und unkoordieniert.

1. Musst du die richtige Software haben. Ich habe den Tutorialteil und
den angepassten Teil für den 2313 angehängt. Das ist bis auf ein paar
minimale Änderungen der, den du schon gepostet hast.
Assembliere diesen z.B mit AvrStudio. Brenne den resultieren Hex-File
dann in deinen Controller.
Frage: Hast du schon mal einen Code in deinen AVR gebrannt, oder ist
dies dein erster Versuch? Evtl. brennst du den hex-File nicht richtig
in den µC?
Ich würde nicht an Assembler zweifeln, und direkt auf Basic wechseln,
nur wenn es mal Problem gibt.

es gibt folgende prinzipielle Fehlerquellen:

-Überprüfe, ob alle Verbindungen vom Display zum Controller so sind,
wie im Tutorial angegeben.
-Liegt ein Pullup-Widerstand am Reset-in des µC?
-( Drehe während des Betriebs des Displays mal am Poti für den
Kontrast. Obwohl dann auch die Balken nicht zu sehen sein sollten.)
- Ist der µC mit weniger als 4Mhz getaktet?
- Sind die Kondensatoren richtig mit dem Quarz verschaltet? Oder
Quarzoszillator?
- Hast du beim brennen die Fuse-Bits o.ä. beachtet?
- Hast du beim Brennen spezeill auf Watchdog, Oszillatortyp etc.
geachtet?

Diese ganzen Möglickeiten sollen sich nicht abschrecken, sondern nur
mögliche Fehlerquellen aufzeigen.

Wichtig zu wissen ist, ob du AVRs schon gebrannt hast. Wenn nicht,
liegt es sehr nahe, dass du den Code nicht richtig zum AVR überträgst.

Der Code im Anhang sollte meiner Meinung nach so funktionieren.

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.