Hallo liebes Forum,
nach einem schönen Sonntag an meinem Nemo habe ich ein paar neue Erkenntnisse und würde euch gerne um Rat fragen.
Ich hab heute meinen kompletten Code aufgeräumt und ein paar Fehler ausgemerzt. Beim testen ist mir mit dem Oszi aufgefallen das mein Controller ab einem gewissen
Initialisierung's punkt nicht weiter macht oder ihn eher überspringt. Ich habe dann (auch wenn jetzt vielleicht jemand schreien wird) mit dem Simulator ein paar mal das Programm durch gefahren
und es klappte immer dort aber halt auf der Platine nicht. Nun zum Problem:
Das Datenbit 5 nehme ich als Referenz weil es in fast allen Initialisierung's Codes vorkommt. Alle anderen Datenbit's machen auch was sie sollen das habe ich auch schon nach geprüft.
Das Datenbit DB 5 wird High und der Enable impuls kommt drei mal danach wird das Datenbit wieder low (entspricht ja dem Binärcode 00100000 zur Initialisierung) . Alle anderen Port's für die DB sind auch wirklich low.
Danach kommen 2 Enable impulse das erste mal ist das DB 5 High und das zweite mal low ( entspricht dem Binärcode 00101000 um das Display auf 4-Bit,2 Zeilig und 5*7 Punkte einzustellen).
Dann kommen wieder 2 Enable impulse das erste mal ist das DB 5 low das zweite mal High ( entspricht dem Binärcode 00001111 um das Display einzuschalten, Cursor ein und Cursor Blinken)
Dann kommt nichts mehr wenn ich jetzt in mein Hauptprogramm noch ein Buchstabe eingebe denn das LCD ausgeben soll macht es das auch aber alles kein Problem aber die Initialisierung bricht quasi ab.
Ich würde ja gerne nen Bild meines Oszis hochladen damit ihr das seht aber 1. funktioniert die PC Software wohl nicht unter W7 und zum zweiten wird mein USB-Stick nicht erkannt wahrscheinlich zu groß denke ich.
Vielen danke schon mal im voraus echt klasse Forum hier kann man nur weiter empfehlen
PS: Der aufgeräumte Code
nach einem schönen Sonntag an meinem Nemo habe ich ein paar neue Erkenntnisse und würde euch gerne um Rat fragen.
Ich hab heute meinen kompletten Code aufgeräumt und ein paar Fehler ausgemerzt. Beim testen ist mir mit dem Oszi aufgefallen das mein Controller ab einem gewissen
Initialisierung's punkt nicht weiter macht oder ihn eher überspringt. Ich habe dann (auch wenn jetzt vielleicht jemand schreien wird) mit dem Simulator ein paar mal das Programm durch gefahren
und es klappte immer dort aber halt auf der Platine nicht. Nun zum Problem:
Das Datenbit 5 nehme ich als Referenz weil es in fast allen Initialisierung's Codes vorkommt. Alle anderen Datenbit's machen auch was sie sollen das habe ich auch schon nach geprüft.
Das Datenbit DB 5 wird High und der Enable impuls kommt drei mal danach wird das Datenbit wieder low (entspricht ja dem Binärcode 00100000 zur Initialisierung) . Alle anderen Port's für die DB sind auch wirklich low.
Danach kommen 2 Enable impulse das erste mal ist das DB 5 High und das zweite mal low ( entspricht dem Binärcode 00101000 um das Display auf 4-Bit,2 Zeilig und 5*7 Punkte einzustellen).
Dann kommen wieder 2 Enable impulse das erste mal ist das DB 5 low das zweite mal High ( entspricht dem Binärcode 00001111 um das Display einzuschalten, Cursor ein und Cursor Blinken)
Dann kommt nichts mehr wenn ich jetzt in mein Hauptprogramm noch ein Buchstabe eingebe denn das LCD ausgeben soll macht es das auch aber alles kein Problem aber die Initialisierung bricht quasi ab.
Ich würde ja gerne nen Bild meines Oszis hochladen damit ihr das seht aber 1. funktioniert die PC Software wohl nicht unter W7 und zum zweiten wird mein USB-Stick nicht erkannt wahrscheinlich zu groß denke ich.
Vielen danke schon mal im voraus echt klasse Forum hier kann man nur weiter empfehlen
PS: Der aufgeräumte Code
Code:
; Aquariencontroller V0.1
; Steuerung von 8 Relais, integrierte Uhr zum Steuern per Zeit, Messung der Platinen Temperatur.Steuerung über ein PC-Prog.
.include "m32def.inc"
;Register definieren
.def temp1 = r16
.def temp2 = r17
.def temp3 = r18
.def Taster_neu = r19
.def Taster_alt = r20
.def Taster_jetzt = r21
;Pins anpassen, Frei wählbar
.equ F_CPU = 4000000
.equ BAUD = 9600
.equ SchiebeDDR = DDRA
.equ SchiebePort = PORTA
.equ SchiebePin = PINA
.equ Clock_In = PA2
.equ SH_LD = PA0
.equ SER_In = PA1
.equ Clock_out = PA3
.equ RCK = PA4
.equ SER_Out = PA5
.equ LCD_DDR = DDRC
.equ LCD_Port = PORTC
.equ LCD_RS = PC1
.equ LCD_E = PC2
.equ LCD_DB7 = PC7
.equ LCD_DB6 = PC6
.equ LCD_DB5 = PC5
.equ LCD_DB4 = PC4
;Datensegment im Ram
.dseg
.org 0x60
;Programmsegment im Flash
Neustart:
.cseg
ldi temp1, HIGH(RAMEND) ; Stackpointer initialisieren
out SPH, temp1
ldi temp1, LOW(RAMEND)
out SPL, temp1
;Eingänge und Ausgänge Initialisieren
ldi temp1,(1<<Clock_In) | (1<<SH_LD) | (1<<Clock_Out) | (1<<RCK) | (1<<SER_Out)
out SchiebeDDR, temp1
sbi SchiebePort,Clock_In ;Takt beim 74xx165 im Ruhezustand auf 1
ldi temp1,(1<<LCD_RS) | (1<<LCD_E) | (1<<LCD_DB7) | (1<<LCD_DB6) | (1<<LCD_DB5) | (1<<LCD_DB4)
out LCD_DDR,temp1
;LCD Initialisieren im 4 Bit-Modus
rcall LCD_Init
Hauptprogramm:
ldi temp1,'u'
rcall LCD_Daten
Hauptprogramm1:
rjmp Hauptprogramm1
.include "Zeiten"
.include "LCD-Routinen"
Code:
LCD_Enable:
nop
nop
nop
sbi LCD_Port,LCD_E
rcall Warte_1ms
cbi LCD_Port,LCD_E
nop
nop
ret
LCD_Befehl:
mov temp2,temp1
andi temp1,0b11110000
out LCD_Port,temp1
rcall warte_1ms
rcall LCD_Enable
swap temp2
andi temp2,0b11110000
out LCD_Port,temp2
rcall LCD_Enable
rcall Warte_5ms
ret
LCD_Daten:
mov temp2,temp1
andi temp1,0b11110000
sbr temp1, (1<<LCD_RS)
out LCD_Port,temp1
rcall LCD_Enable
swap temp2
andi temp2,0b11110000
sbr temp2, (1<<LCD_RS)
out LCD_Port,temp2
rcall LCD_Enable
rcall Warte_5ms
cbi LCD_port,LCD_RS
ret
LCD_Init:
rcall Warte_5ms
ldi temp1,0b00100000 ; 4-Bit Modus einstellen
out LCD_Port,temp1
rcall warte_1ms
rcall LCD_Enable ; 1 mal
rcall Warte_1ms
rcall LCD_Enable ; 2 mal
rcall Warte_1ms
rcall LCD_Enable ; 3 mal
rcall Warte_1ms
ldi temp1,0b00101000 ; 4-Bit,2 zeilen, 5x7 Dot's
rcall LCD_Befehl
ldi temp1,0b00001111 ; Display ein,Cursor ein,Cursor blinken
rcall LCD_Befehl
ldi temp1,0b00000001 ; Display löschen
rcall LCD_Befehl
ldi temp1,0b00000110 ; Autoinkrement ein, Cursor schieben
rcall LCD_Befehl
ret
Code:
;Zeitroutinen für 1ms,5ms,15ms
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Warte_1ms:
push r16
push r17
ldi r16,0x1F
W1ms_1:
ldi r17,0x2A
W1ms_2:
dec r17
brne W1ms_2
dec r16
brne W1ms_1
pop r17
pop r16
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Warte_5ms:
push temp1
push temp2
ldi temp1,0x21
W5ms_1:
ldi temp2,0xc9
W5ms_2:
dec temp2
brne W5ms_2
dec temp1
brne W5ms_1
pop temp2
pop temp1
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Warte_15ms:
push r16
push r17
ldi R16,0x63
W15ms_1:
ldi r17,0xC9
W15ms_2:
dec r17
brne W15ms_2
dec r16
brne W15ms_1
W15ms_3:
ldi r16,0x02
dec r16
brne W15ms_3
pop r17
pop r16
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;