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:
Code:'------------------------------------------------------------------------------- '------------------------------------------------------------------------------- '----------------------------- 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







Zitieren

Lesezeichen