So hab mal durchgeschaut... und das ein oder andere wurde schon angesprochen wie z.B. der Stack oder die Init.
test3.txt
Wenn du das LCD richtig angeschlossen hast solltest du mal den Kontrast so einstellen das man die Dots 5x7 ein wenig sieht. Kommt hier mit Erhöhung des KOntrastet nur die erste Zeile zum vorscheinen ist die Init des LCD nicht komplett oder unterbrochen worden.
Sag mal wie fit bist du eigentlich im ASM beim AVR ?
1.
In die Initialisierung gehören alle Inits interner sowei externe Peripherie. Ebenso sollten alle Ints, also die gesamte Vectortabelle aufegführt werden entweder.
OderCode:.org $0000 rjmp INIT reti reti reti reti reti . . . . .
Denn wenn der SEI aktiv ist und man vllt sich mal vertan hat und der zugehörige Int wird ausgelöst und diese Tabelle fehlt kann es sein das dein Controller mitten in der Startinit wieder loslegt....Code:.org $0000 rjmp INIT .org $0001 rjmp ??? .org $0002 rjmp ???? . . . .
1.1
es steht zwar dahinter aber wenn man doch mal fix was ändern möchte istCode:ldi lcdd,0x28 ;cd_function_set_std: 4Bit,2Zeilen,5*7 Font rcall lcd_cmd4 ; Enthält bereits eine Zeitschleife
folgendes übersichtlicher
Die LCD -Deklarationen sollten ebenfalls im Hauptprogramm ganz oben stehenCode:;SET Function .equ F = 2 ;1 = 5x10 0 = 5x7 .equ N = 3 ;1 = 2line(4line) 0 = 1line .equ DL = 4 ;1 = 8bit int 0 = 4bit interface .equ HSF = 5 ;immer 1 setzen Symbolisiert das Ende ldi temp1,(1<<HSF|0<<DL|1<<N|0<<F) ;funktionset rcall lcd_command ;DatenLine1=8bit, N=1 2zeilig á 40 Zeichen d.h. 4zeilig á 20Zeichen ret
1.2
Zu den Registern sei gesagt die sollten nur einen allgm. Namen bekommen und haben nicht wirklich was mit den einzelnen Programmteilen, in textlicher Form, was zu tun. Ob es nun lcdd, tempx oder sonst wie benannt wird spielt keine Rolle da diese wirklich meist die absoluten temproären Daten sind und meist nur für die jeweilige Unterroutine wichtig sind.
Daten die über mehrere Funktionen z.B. Sekunden/Minuten einer Uhr von Interesse sind werden im SRAM vorgehalten.
Warum spreche ich das an ?
Hier hats dich ein wenig erwischt, Daten wurden in XL geschrieben obwohl du genau lcdd dafür vorgesehen hast somit wurde erst gar keine LCD-Daten ausgegeben.Code:; ldi XL,0x03 ;clr DSP, Curs > home (01) ; rcall lcd_cmd4 ; Erst wenn die komplette Init fertig ist Cursor Home schicken mit 0x01 ;woher also 0x03 ; rcall lcd_dlys ;dito ; ldi XL,0x06 ;also entry_mode DSP fest, Curs auto-inc ldi lcdd,0x06 ; Und warum plötzlich in XL und nicht in lcdd ? rcall lcd_cmd4 ; ; rcall lcd_dlys ;dito pop XL ret
Der Befehl 0x01 ist LCD löschen und setzen auf Cursorpostition 0 in Zeile 1, würde ich erst immer nach der fertigen Initialisierung des LCD aufrufen.
Das hier sollten die Hauptfehler gewesen sein, Wenn die Verkabelung stimmt ...
Kleine Hausaufgaben
1. Warum kannst du ohne weitere Deklarationen XL/ Z direkt nutzen ?
2. Welche Register können nicht direkt mit Konstanten geladen werden ?
2.
Datenbanken so wie die dazugehörigen Textausgaben inklusive der Adressen, sollten in einer Include gepackt werden siehe hier
https://www.roboternetz.de/community...Seriel-ATMega8 unter DbTxt_LCD.asm
3.
An Manchen Stellen hast du in der Unterroutine zum Schluss eine Zeitschleife und nachdem du diese Unterroutine verlassen hast folgt auf den Fuße wieder eine.
Warum ? Entweder du entwickelst die Unterroutinen so das diese in und ansich voll funktionsfahig aus sich heraus sind. Zumindest solltest du dich nur auf einen Weg festlegen.
puuhhhh jjaaaa das wars was mir erstmal aufgefallen war/ist...







Zitieren

Lesezeichen