Hallo,
Du könntest Dir beim Timer die ICP Funktion angucken, hier kann man den Timer, bzw. dann Counter, bis zur nächsten Flanke zählen lassen, der Counter schreibt automatisch den Wert in ein extra Register, damit man etwas Zeit hat, das auszulesen. Es kann auch ein IRQ ausgelöst werden, in dem man dann den Wert verarbeitet.
Ausschnitt mit Timer1 beim Mega32, so jetzt nicht getestet, nur zusammenkopiert :
Code:
$hwstack = 40
$swstack = 40
$framesize = 40
$regfile = "M32def.dat" ' the used chip
$crystal = 16000000 ' frequency used
$baud = 9600
Config Timer1 = Counter , Capture Edge = Falling , Prescale = 256
Config Portd.6 = Input ' ICP1 Eingang
Portd.6 = 1
' Array und zähler für Timerdaten
Const Maxcapt = 60
Dim Capt(maxcapt) As Word
Dim Ccnt As Byte
On Icp1 Icp_isr
Enable Icp1
' Reset IC IRQ
Tifr.icf1 = 1
Enable Interrupts
Do
' Reset IC IRQ
Stop Timer1
Timer1 = 0
Capture1 = 0
Tccr1b.ices1 = 0
Tifr.icf1 = 1
Ccnt = 0
Start Timer1
Enable Icp1
' warten bis array voll
While Ccnt < Maxcapt
Wend
Disable Icp1
' Ausgeben
For X = 1 To Maxcapt
Print Capt(x)
Next X
Wait 2
Loop
' Capture IRQ
Icp_isr:
Timer1 = 0
Toggle Tccr1b.ices1
' bis max. MaxCapt, dann nix mehr einlesen !
If Ccnt < Maxcapt Then
Incr Ccnt
Capt(ccnt) = Capture1
End If
Return
Das Programm sollte 60 Wechsel messen und in einem Array sammeln, danach per UART ausgeben.
Lesezeichen