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
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.
@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
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?
@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
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
@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
das sind zwei dateien bis .include "lcd-routines.asm" ist es lcd.asm und das andere ist lcd-routines.asm
@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
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
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
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
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
Doch klar erstellt es die. Musst nur einen neuen ordner erstellen und sie dort hinein speichern. Mfg. Merle
Du musst das Lcd erst initialisieren bevor du das clear durchführen kannst. Mfg. Merle
Mal ne dumme Frage. Liegt dein Takt von 4MHz an? Sonst stimmen die Timings, wie im Tuturial natürlich nicht.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.