Hallo
Seltsam, mein Bascom (Demo 1.11.9.8) schluckt das anstandslos. TCNT2 funktioniert bei dir ja auch. Hier eine Variante in der TCNT1 durch TIMER1 ersetzt ist:
Ich bin halt leider nicht so sehr der Bascom-Profi :(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 Timer1 = 65280 '16Bit! 65536-256 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: Timer1 = Timer1 + 65283 '16Bit! 65536-256+3 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 '------------------------------------------------------------------------------
Gruß
mic







Zitieren

Lesezeichen