PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Denkfehler?



Feratu
04.02.2008, 15:05
Hi
Bin grade dabei eine Art Zeitschaltuhr mit LCD zu bauen.
Ist im Grunde fertig nur ein kleines Problem besteht:

Es ist wie folg aufgebaut:

So sieht die Anzeige aus
00:00:00
01:29:01 z.b.
usw

die Variablen sind so aufgebaut:
hms = hour minute sec so nebenbei ^^
Lcd Hms(1) ; Hms(2) ; ":" ; Hms(3) ; Hms(4) ; ":" ; Hms(5) ; Hms(6)

Das Problem sieht so aus:
Ich drücke auf OK dann sollte eigentlich umgehend der Timer anfangen runter zu zählen,... tut er aber nicht.
Es dauert jedesmal rellativ genau 5 sec bis angezeigt wird das der wert abgezogen wurde.
Aber der angezeigte wert stimmt also es wird keine Sekunde vergessen oder übersprungen.
Nur das LCD Display zeigt es 5 sec verzögert an.

Hat jemand eine erklärung/Lösung hierfür? oder ein Vorschlag wie man soetwas einfacher realisiert?

Hier der Code:


Do
Locate 2 , 7 'Cursor auf 1 Zeile, 1 Spalte
Lcd Hms(1) ; Hms(2) ; ":" ; Hms(3) ; Hms(4) ; ":" ; Hms(5) ; Hms(6) 'String auf Display anzeigen
Waitms 100
If Bumm = 1 Then
Portb.2 = 1
Bumm = 1
End If

Loop

'-------------------------------------------------------------------------------
'------- Timer 1 ISR
'-------------------------------------------------------------------------------
Isr_von_timer1: 'ISR von Timer1
Dim Nr_z(2) As Byte 'zusammenzähl Variable
Timer1 = 34285 'Timer auf 1 Sec einstellen
If Hms_frg = 1 Then 'freigaben Abfrage

If Hms(6) = 0 Then 'fang von hinten an
Hms(6) = Hms_max(6)

If Hms(5) = 0 Then 'Ziffer 5 = 0 => auf max(5) setzen
Hms(5) = Hms_max(5)
If Hms(4) = 0 Then 'Ziffer 4 = 0 => auf max(4) setzen
Hms(4) = Hms_max(4)
If Hms(3) = 0 Then
Hms(3) = Hms_max(3) 'Ziffer 3 = 0 => auf max(3) setzen

If Hms(2) = 0 Then 'Ziffer 2 = 0 => auf max(2) setzen
Hms(2) = Hms_max(2)
If Hms(1) = 0 Then 'Ziffer 1 = 0 => auf max(1) setzen
Hms_frg = 0
Bumm = 1 'Alles 0 Ende Verlauf
Cls

Else
Decr Hms(1)
End If

Else
Decr Hms(2)
End If
Else
Decr Hms(3)
End If
Else
Decr Hms(4)
End If

Else
Decr Hms(5)
End If

Else
Decr Hms(6)
End If


If Zuend(1) < 3 Then
If Zuend(1) = 1 Then
Portb.1 = 1
Waitms 200
Portb.1 = 0
Else
Nr_z(2) = 0
For Nr_z(1) = 1 To 5
Nr_z(2) = Nr_z(2) + Hms(nr_z(1))
Next Nr_z(1)
If Nr_z(2) = 0 Then
Portb.1 = 1
Waitms 200
Portb.1 = 0
End If
End If
End If

End If



Return
End

mfg

linux_80
04.02.2008, 19:17
Hallo,

zeig mal den Rest vom Programm, man sieht hier keine Timer und ISR- Initialisierung.
Und ein Wait in der ISR geht schon garnicht, da erreicht man alles, aber nicht unbedingt was man meint !
Eine ISR muss so schnell wie möglich verlassen werden, damit der Rest weiterarbeiten kann, und keine IRQ-Aufrufe verloren gehen.

stefan_Z
04.02.2008, 19:22
Ja, insgesamt 400ms Wartezeit sind viel zuviel in ner ISR!
Die IF/THENs alleine erscheinen mir schon fast zu lang...

Feratu
04.02.2008, 20:21
Also die Wait Schleifen sind mit einem If,.. getrennt also maximal 200mS Wartezeit.
Die ISR des Timers ist auf 1 sec eingestellt. Heißt der AVR hat noch 800mS zum rechnen der Hauptschleife übrig.
Sagen wir dank der vielen If schleifen 780 rum.
Das dumme ist jez halt das ich meine Hauptschleife wie eine Schrittkette verwenden will, was auch hervorragend funktioniert.

Heist alles was mit der Zeit also der "Uhr" zu tun hat muss in diese ISR rein.
Oder hat jemand eine bessere Idee ? wäre super ^^

Das Wait 200ms hat den Sinn einen Port blinken zu lassen unabhängig davon was die Hauptschleife macht.
Deswegen sind ja noch mehr if schleifen drin um festzulegen wann dieser Port Blinkt.
200ms müssen min sein da an diesem Port ein kleiner Pieper hängt und unter dieser Zeit macht der keinen Mucks.

Bin am überlegen das ganze ding nochmal neu zu schreiben aber hoffe einfach das momentane Programm zu "retten" ^^.

Also das komplette Programm braucht man nicht das ist etwas länger ^^
(81% des AVR)
Aber ok hier der Relevante Programm Teil das eigentliche ist viel länger:




'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------
'----------------------------- LCD "Eieruhr" -----------------------------------
'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------
'------- Voreinstellungen
'-------------------------------------------------------------------------------
$lib "lcd4busy.lib" 'ersetzt die Standard LCD Bibliothek
$regfile = "m8535.dat" 'ATMega8535
$crystal = 8000000 'Quarz: 8.0000 MHz
'-------------------------------------------------------------------------------
Config Timer1 = Timer , Prescale = 256 'Konfiguriere Timer1
Enable Timer1 'schalte den Timer1 ein
On Timer1 Isr_von_timer1 'verzweige bei Timer1 überlauf zu Isr_von_Timer1
Enable Interrupts
Timer1 = 34285
Wait 1
'-------------------------------------------------------------------------------
'------- LCD Config
'-------------------------------------------------------------------------------
Config Lcd = 20 * 4 'wir verwenden ein 4 x 20 Zeichen Display
Const _lcdport = Portd
Const _lcdddr = Ddrd
Const _lcdin = Pind
Const _lcd_e = 3
Const _lcd_rw = 2
Const _lcd_rs = 1
Cls
Display On
Cursor Off
Initlcd
Delay
Initlcd
Restart:

'-------------------------------------------------------------------------------
'------- Port Config
'-------------------------------------------------------------------------------
'------- Output
'-------------------------------------------------------------------------------
Config Porta.7 = Output
Config Portc.4 = Output
Config Portc.0 = Output
Config Portb.1 = Output
Config Portb.2 = Output
Portb.1 = 0
Portb.2 = 0
Portc.4 = 0 'PC5
Portc.0 = 0 'PC6
Porta.7 = 0 'PC7
'-------------------------------------------------------------------------------
'------- Input
'-------------------------------------------------------------------------------
Config Pinc.1 = Input
Config Pinc.2 = Input
Config Pinc.3 = Input
Config Pinc.5 = Input
Config Pinc.6 = Input
Config Pinc.7 = Input

'-------------------------------------------------------------------------------
'------- Variablen Config
'-------------------------------------------------------------------------------
'------- Spiel Start Optionen
Dim Hms(7) As Byte
Dim Hms_max(6) As Byte
Dim Hms_frg As Bit
'------- Ensch. Optionen
Dim Entsch(4) As Byte
Entsch(1) = 74
Entsch(2) = 74
Entsch(3) = 74
Entsch(4) = 78
'------- Zünder Optionen
Dim Zuend(3) As Byte
Zuend(1) = 2 '1 = immer 2 = 10sec 3= nie Blink Port
Zuend(2) = 74 '74 = J 78 = N
Zuend(3) = 1 '1 =zünden 2=Warnen 3=Nichts
'------- Karten Optionen
Dim Karten(12) As Byte


'------- Variablen Wert verteilen
For Nr = 1 To 6
Hms(nr) = 0
Karten(nr) = Nr
Next Nr
Hms(2) = 1
Hms(7) = 9

Hms_max(1) = 2
Hms_max(2) = 4
Hms_max(3) = 5
Hms_max(4) = 9
Hms_max(5) = 5
Hms_max(6) = 9


Karten(11) = 74
Karten(12) = 0
Entsch(1) = 74
Entsch(2) = 74
Entsch(3) = 74
Entsch(4) = 78

Karten(5) = 1
Karten(6) = 2
Karten(7) = 3
Karten(8) = 4
Karten(9) = 1
Karten(10) = 2
'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------
'------- Bomben STart
'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------
Cls 'loesche das LCD Display
Delay
Locate 1 , 5
Lcd "Simulation's"
Locate 2 , 8
Lcd "Bombe"
Locate 3 , 6
Lcd "beliebige"
Locate 4 , 4
Lcd "Taste drücken"
Cursor Off
'-------------------------------------------------------------------------------
'------- Tasten Abfrage
Gosub Tast_a
'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------
'------- Start Optionen
'-------------------------------------------------------------------------------
Menu:
Hms_frg = 0
'-------------------------------------------------------------------------------
Cls 'loesche das LCD Display
Delay
Locate 1 , 1
Lcd "-1- Start"
Locate 2 , 1
Lcd "-2- Entschärfung Opt"
Locate 3 , 1
Lcd "-3- Zünder Opt"
Locate 4 , 1
Lcd "-4- Karten Opt"
Cursor Off
'-------------------------------------------------------------------------------
'------- Tasten Abfrage
Gosub Tast_a
'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------
'------- 1 = Start Optioenn => Zeit Einstellen
'-------------------------------------------------------------------------------
If Tstaa = 1 Then
Cls
Locate 1 , 4
Lcd "Start Optionen"
Locate 2 , 3
Lcd "Zeit:"
Locate 4 , 1
Lcd "*=Start"
Locate 4 , 16
Lcd "#=ESC"
Cursor Blink
Nr = 0
Hms(7) = 9
Do
Locate 2 , 9
Lcd Hms(1) ; Hms(2) ; ":" ; Hms(3) ; Hms(4) ; ":" ; Hms(5) ; Hms(6) 'String auf Display anzeigen
Locate 2 , Hms(7)

Incr Nr
Hms(7) = 9 + Nr
If Nr > 1 Then Incr Hms(7)
If Nr > 3 Then Incr Hms(7)
Gosub Tast_a
If Tstaa = 11 Then Tstaa = 0
If Tstaa = 12 Then Goto Menu


'-------------------------------------------------------------------------------
'------- Eigentliche Hauptschleife
'------- Untermenu von Taster 1
'-------------------------------------------------------------------------------
If Tstaa = 10 Then
Dim Bod_counter As Word 'dauert des rellativ genauesn wertes UNWICHTIG
Cursor Noblink
Cls
Locate 1 , 6
Lcd "Rest Zeit:"
Locate 2 , 7
Lcd Hms(1) ; Hms(2) ; ":" ; Hms(3) ; Hms(4) ; ":" ; Hms(5) ; Hms(6) 'ANZEIGE der HMS Werte
Locate 3 , 4 'Cursor weg

'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------
Do


If Tstaa = 11 Then 'hier ADV Wert Abfrage
Incr Bod_counter
Waitms 1

'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------
If Bod_counter > 500 Then
'-------------------------------------------------------------------------------
Locate 3 , 4 'Cursor auf 1 Zeile, 1 Spalte
Lcd " <1> Taste " 'String auf Display anzeigen
Locate 4 , 4 'Cursor auf 1 Zeile, 1 Spalte
Lcd " drücken! " 'String auf Display anzeigen
'-------------------------------------------------------------------------------
Do
'Avr Abfrage wegen Hochheben des Kastens
Loop Until Pinc.7 = 1
'-------------------------------------------------------------------------------


Locate 3 , 4 'Cursor auf 1 Zeile, 1 Spalte
Lcd "Metall Taster " 'String auf Display anzeigen
Locate 4 , 4 'Cursor auf 1 Zeile, 1 Spalte
Lcd " drücken! " 'String auf Display anzeigen
Hms_frg = 1
Wait 5
Do
Locate 2 , 7 'Cursor auf 1 Zeile, 1 Spalte
Lcd Hms(1) ; Hms(2) ; ":" ; Hms(3) ; Hms(4) ; ":" ; Hms(5) ; Hms(6) 'String auf Display anzeigen
Waitms 100

If Bumm = 1 Then
Portb.2 = 1
Bumm = 1
End If

Loop
Goto Memmory

End If
'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------

Else


Locate 3 , 5 'Cursor auf 1 Zeile, 1 Spalte
Lcd "warte auf" 'String auf Display anzeigen
Locate 4 , 5 'Cursor auf 1 Zeile, 1 Spalte
Lcd "Bodentaster" 'String auf Display anzeigen
Bod_counter = 0
Hms_frg = 0
Gosub Tast_a
End If
Loop
'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------

Goto Menu
'-------------------------------------------------------------------------------
End If
'-------------------------------------------------------------------------------
Hms(nr) = Tstaa
If Hms(nr) > Hms_max(nr) Then Hms(nr) = Hms_max(nr)
If Nr = 6 Then
Nr = 0
Hms(7) = 9
End If
Loop
End If




'-------------------------------------------------------------------------------
'------- Taste über 4 gedrückt => zurück zum Menu
'-------------------------------------------------------------------------------
If Tstaa > 4 Then Goto Menu
Goto Menu

Loop
'-------------------------------------------------------------------------------
'------- Timer 1 ISR
'-------------------------------------------------------------------------------
Isr_von_timer1: 'ISR von Timer1
Dim Nr_z(2) As Byte 'zusammenzähl Variable
Timer1 = 34285 'Timer auf 1 Sec einstellen
If Hms_frg = 1 Then 'freigaben Abfrage

If Hms(6) = 0 Then 'fang von hinten an
Hms(6) = Hms_max(6)

If Hms(5) = 0 Then 'Ziffer 5 = 0 => auf max(5) setzen
Hms(5) = Hms_max(5)
If Hms(4) = 0 Then 'Ziffer 4 = 0 => auf max(4) setzen
Hms(4) = Hms_max(4)
If Hms(3) = 0 Then
Hms(3) = Hms_max(3) 'Ziffer 3 = 0 => auf max(3) setzen

If Hms(2) = 0 Then 'Ziffer 2 = 0 => auf max(2) setzen
Hms(2) = Hms_max(2)
If Hms(1) = 0 Then 'Ziffer 1 = 0 => auf max(1) setzen
Hms_frg = 0
Bumm = 1 'Alles 0 Ende Verlauf
Cls

Else
Decr Hms(1)
End If

Else
Decr Hms(2)
End If
Else
Decr Hms(3)
End If
Else
Decr Hms(4)
End If

Else
Decr Hms(5)
End If

Else
Decr Hms(6)
End If


If Zuend(1) < 3 Then
If Zuend(1) = 1 Then
Portb.1 = 1
Waitms 200
Portb.1 = 0
Else
Nr_z(2) = 0
For Nr_z(1) = 1 To 5
Nr_z(2) = Nr_z(2) + Hms(nr_z(1))
Next Nr_z(1)
If Nr_z(2) = 0 Then
Portb.1 = 1
Waitms 200
Portb.1 = 0
End If
End If
End If

End If



Return
End





'-------------------------------------------------------------------------------
'------- Tastatur Auswertung
'-------------------------------------------------------------------------------
Tast_a:
'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------
Dim Freigabe As Bit
Freigabe = 0
Tsta = 13
'-------------------------------------------------------------------------------
Do
'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------
Do
'-------------------------------------------------------------------------------
Tsta = 13
If Pinc.7 = 1 Then

Tsta = 1
Tstaa_z = 1
Tstaa_nr = 8
End If
If Pinc.6 = 1 Then
Tsta = 2
Tstaa_z = 1
Tstaa_nr = 10
End If
If Pinc.5 = 1 Then
Tsta = 3
Tstaa_z = 1
Tstaa_nr = 12
End If
'-------------------------------------------------------------------------------
Porta.7 = 1
'-------------------------------------------------------------------------------
If Pinc.3 = 1 Then
Tsta = 4
Tstaa_z = 2
Tstaa_nr = 8
End If
If Pinc.2 = 1 Then
Tsta = 7
Tstaa_z = 3
Tstaa_nr = 8
End If
If Pinc.1 = 1 Then
Tsta = 10
Tstaa_z = 4
Tstaa_nr = 8
End If
'-------------------------------------------------------------------------------
Porta.7 = 0
'-------------------------------------------------------------------------------
Portc.0 = 1
'-------------------------------------------------------------------------------
If Pinc.3 = 1 Then
Tsta = 5
Tstaa_z = 2
Tstaa_nr = 10
End If
If Pinc.2 = 1 Then
Tsta = 8
Tstaa_z = 3
Tstaa_nr = 10
End If
If Pinc.1 = 1 Then
Tsta = 11
Tstaa_z = 4
Tstaa_nr = 10
End If
'-------------------------------------------------------------------------------
Portc.0 = 0
'-------------------------------------------------------------------------------
Portc.4 = 1
'-------------------------------------------------------------------------------
If Pinc.3 = 1 Then
Tsta = 6
Tstaa_z = 2
Tstaa_nr = 12
End If
If Pinc.2 = 1 Then
Tsta = 9
Tstaa_z = 3
Tstaa_nr = 12
End If
If Pinc.1 = 1 Then
Tsta = 12
Tstaa_z = 4
Tstaa_nr = 12
End If
'-------------------------------------------------------------------------------
Portc.4 = 0 'PC5
Portc.0 = 0 'PC6
Porta.7 = 0 'PC7
'-------------------------------------------------------------------------------
Loop Until Tsta = 13 Or Freigabe = 1
Freigabe = 1
'-------------------------------------------------------------------------------
Incr Random
If Random > 6 Then Random = 1
Loop Until Tsta < 13
Tstaa = Tsta
Return

Feratu
04.02.2008, 21:00
WAAA bin ich doof ](*,)
Habe soeben das Problem gefunden.
Da stand weiter rechts geschrieben (irgentwie tabulator Taste bekommen)
ein Wait 5 -_-
Das erklärt die 5 sec ^^

Kann geschlossen werden
danke für die antworten ^^

](*,) ](*,)