Liste der Anhänge anzeigen (Anzahl: 1)
Willkommen im Neuen Jahr!
Ich wollte mir zum Jahresbeginn eine Freude machen und hab den Test mit dem T24 versucht.
Leider kein guter Jahresbeginn :(
Den Code mehrfach überprüft, auch den Testaufbau. ICH kann keinen Fehler entdecken.
Möglicherweise ist mein LCD defekt. Hab es mittlerweile ein paar Jahre rum liegen. War zwar immer verpackt, aber ???
Egal ob der µC in der Schaltung steckt oder nicht, das LCD bleibt finster. Nur wenn ich das Kontrastpoti fast auf GND drehe, ist die zweite Zeile voll mit 5x7 Blöcken.
Die obere Zeile bleibt ganz finster. Kann das normal sein?
Vielleicht hat jemand Zeit und Muße und schaut mal über meinen Code, ob ich da einen Fehler übersehen hab bzw. mir dessen gar nicht bewusst bin.
Liste der Anhänge anzeigen (Anzahl: 1)
So hab mal durchgeschaut... und das ein oder andere wurde schon angesprochen wie z.B. der Stack oder die Init.
Anhang 33900
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.
Code:
.org $0000
rjmp INIT
reti
reti
reti
reti
reti
.
.
.
.
.
Oder
Code:
.org $0000
rjmp INIT
.org $0001
rjmp ???
.org $0002
rjmp ????
.
.
.
.
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....
1.1
Code:
ldi lcdd,0x28 ;cd_function_set_std: 4Bit,2Zeilen,5*7 Font
rcall lcd_cmd4 ; Enthält bereits eine Zeitschleife
es steht zwar dahinter aber wenn man doch mal fix was ändern möchte ist
folgendes übersichtlicher
Code:
;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
Die LCD -Deklarationen sollten ebenfalls im Hauptprogramm ganz oben stehen
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 ?
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
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.
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...