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 :
Das Programm sollte 60 Wechsel messen und in einem Array sammeln, danach per UART ausgeben.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






Zitieren

Lesezeichen