So könntest du das machen. Timer1 zählt die Impulse. Mit Timer0 springst du 15 mal in der Sekunde in die Timer_irq Routine. Dort machst du einen Zähler. Wenn der Zähler 15 erreicht hat = 1 Sekunde, dann gibst du den Wehrte aus.
Code:
Dim Zahler_timer As Integer
Config Timer1 = Counter , Edge = Falling
'oder Edge = Rising
$regfile = "m16def.dat"
$crystal = 3686400
$baud = 9600
Config Timer0 = Timer , Prescale = 1024
On Timer0 Timer_irq
Const Timervorgabe = 16
Enable Timer0
Enable Timer1
Enable Interrupts
Do
Loop
End
Timer_irq:
Timer0 = Timervorgabe
Zahler_timer = Zahler_timer + 1
If Zahler_timer => 15 Then
Print Timer1
Timer1 = 0
Zahler_timer = 0
End If
Return
Eine andre Möglichkeit ist den Timer0 zum zählen der Impulse benutzen. Dann bei jedem Überlauf in eine Unterroutine springen und jedes mal 255 zu einer Variable rechnen. Bei 1 Sekunde diese Variable + den Timer0 ausgeben.
Am besten währe es wenn du einen Controller mit zwei 16 Bit Timern nimmst.
Um dir mal den Unterschied zwischen Timer und Counter zu erklären. Im Prinzip ist es sehr einfach. Jeder Timer ist nur ein Counter. Mit Config Timer1 = Counter oder Config Timer1 = Timer entscheidest du nur was der Counter Zählt. Interner Takt oder externer Takt.
@xanadu
Ob das jetzt an Bascom oder am AVR liegt kann ich auch nicht hundertprozentig sagen. Nur bei Bascom ist es mal so. Aber wenn das möglich ist aus einem INTERRUPT in einen andren zuspringen, dann muß man auch Prioritäten setzten können. Es ist ja nicht immer erwünscht wegen einen unwichtigen INTERRUPT einen wichtigen zu unterbrechen.
Lesezeichen