Ojeojeoje. Es ist eben immer schlecht, wenn man es nicht selbst testen kann. Beim Timer2 sollte man schon das Zählregister TCNT2 manipulieren, OCR2 ist hier völlig falsch.
Takt3 zählt die Aufrufe der Interruptroutine des Timer2. Solange Takt3 kleiner als 250 ist wird es erhöht. Bei 250 sollte eine halbe Sekunde vergangen sein. Es werden dann die Zählerstände von Taktx_temp nach Taktx kopiert und die Taktx_temp gelöscht. Takt3 wird wieder auf null gesetzt und das Spiel beginnt von vorne.
Gleichzeitig werden ca. alle 300ms die aktuellen Werte von Takt1 und 2 am LCD ausgegeben. Der Code mit dem richtigen TCNT2-Register sieht dann so aus:Code:If Takt3 < 250 Then 'solange Takt3 kleiner 250 Takt3 = Takt3 + 1 'Takt3 erhöhen Else 'die 1/2 Sek. ist vorbei Takt3 = 0 'Takt3 reseten Takt1 = Takt1_temp 'Zähler auslesen Takt1_temp = 0 'und reseten Takt2 = Takt2_temp Takt2_temp = 0 End If
Zum Debuggen könnte man im else-Zweig in der Timer2-ISR noch eine Led togglen. Die sollte dann mit 1 Hz blinken.Code:' Display an folgenden Ports ' Enable = Port C.4 ' RS = Port C.5 ' DB7 = Port C.7 ' DB6 = Port C.6 ' DB5 = Port C.3 ' DB4 = Port C.2 ' ' Leds an folgenden Ports ' Grün an A.0 ' $regfile "m32def.dat" 'Definiert den Atmega als Atmega 32 $crystal = 1000000 'Gibt die Quarzfrequenz an in Herz $hwstack = 32 'Default use 32 for the hardware stack $swstack = 10 'Default use 10 for the SW stack '------------------------------------------------------------------------------- ' Konfiguration fürs Display Config Lcd = 16 * 2 'definiert das LCD Display in Art und Größe Config Lcdpin = Pin , Db4 = Portc.2 , Db5 = Portc.3 , Db6 = Portc.6 , Db7 = Portc.7 , Rs = Portc.5 , E = Portc.4 '------------------------------------------------------------------------------ ' Variablen Dim Takt1 As Word Dim Takt2 As Word Dim Takt3 As Word Dim Takt1_temp As Word Dim Takt2_temp As Word '------------------------------------------------------------------------------ Portb = &B00011110 ' Pull Up setzen für Pin B1 Ddra = &B11111111 ' Pin A.7 als Ausgang setzen für blaue Led '------------------------------------------------------------------------------ ' Timer 0 Config Timer0 = Timer , Prescale = 1024 Enable Timer0 On Timer0 Timer_null '--------------------------------------- ' Timer 1 Config Timer1 = Timer , Prescale = 64 Enable Timer1 On Timer1 Timer_eins '--------------------------------------- ' Timer 2 Config Timer2 = Timer , Prescale = 8 Tcnt2 = 6 'nach 250 Zählschritten folgt der Interrupt Enable Timer2 On Timer2 Timer_zwei Enable Interrupts Takt3 = 0 Cls '------------------------- H A U P T P R O G R A M M -------------------------- Do Gosub Anzeige Waitms 300 Loop '------------------------------ D I S P L A Y - A N Z E I G E ----------------- Anzeige: Cls Locate 1 , 1 Lcd "Takt1: " ; Takt1 Lcd "Takt2: " ; Takt2 Return '--------------------------------- T I M E R - 0 ----------------------------- Timer_null: Toggle Porta.0 ' Led Grün Takt1_temp = Takt1_temp + 1 Return '--------------------------------- T I M E R - 1 ------------------------------ Timer_eins: Toggle Porta.7 ' Led Blau Takt2_temp = Takt2_temp + 1 Return '--------------------------------- T I M E R - 2 ------------------------------ 'Die Werte werden jede 1/2 Sekunde ausgelesen. Das Setup des Timers sieht so aus: '1MHz mit Prescaler/8 ergibt 125000 Timertakte pro Sekunde. Das Zählregister startet 'mit 6, nach 250 Schritten erfolgt der Interrupt. Das ergibt 125000/250=500 Interrupts 'pro Sekunde.Nach 250 Interrupts werden dann die Werte eingelesen und zurückgesetzt. 'Die Frequenzkorrektur berücksichtigt auch die Takte, die schon gezählt wurden und 'entfernt zusätzliche 3 Takte für Laden, Berechnen und Speichern des TCNT2-Wertes. Timer_zwei: Tcnt2 = Tcnt2 + 9 'Frequenzkorrektur (256-6-3) If Takt3 < 250 Then 'solange Takt3 kleiner 250 Takt3 = Takt3 + 1 'Takt3 erhöhen Else 'die 1/2 Sek. vorbei Takt3 = 0 'Takt3 reseten Takt1 = Takt1_temp 'Zähler auslesen Takt1_temp = 0 'und reseten Takt2 = Takt2_temp Takt2_temp = 0 End If Return '------------------------------------------------------------------------------
Hast du inzwischen die Takte1 und 2 mal nachgemessen? Viele Multimeter können auch Frequenzen messen.
Gruß
mic







Zitieren

Lesezeichen