PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Timer0



filth
17.05.2009, 12:10
Hallo,

Ich möchte 3 Sekunden lang Werte von einem Sensor sammeln und die dann weiter verarbeiten. Ist mein Programm dazu korrekt?


$regfile = "M8def.dat"
$crystal = 1000000
$hwstack = 100
$swstack = 100
$framesize = 100

Dim i as Integer


'1000000 (Systemtakt) / 1024 (Prescaler) = 976,5625 (Counts)
Config Timer0 = Timer , Prescale = 1024

'976,5625(Counts) / 256 (8-Bit Timer) = 3,814697265625 (Interrupts die Sekunde)
On OVF0 On_ovf0
Enable OVF0

Enable Interrupts


Do
!NOP
Loop

End



On_ovf0:
i = i + 1
If I = 9 Then
I = 0
' verarbeite Werte
End If

Return

Danke!

Jaecko
17.05.2009, 13:25
Soweit siehts richtig aus.
Nur würde ich die Auswertung _nicht_ in der ISR machen!

Dort nur eine Variable setzen (z.B. auswerten = 1) und in der Main-Loop, wo eh nur das NOP drin ist, abfragen:


If auswerten = 1 Then
(auswerten eben)
auswerten = 0
End If

Sollte das Auswerten nämlich mal länger dauern als die Zeit zwischen 2 ISRs, kanns Stress geben.

Dirk
17.05.2009, 13:27
Probier mal sowas (nicht geprüft):


$regfile = "M8def.dat"
$crystal = 1000000
$hwstack = 100
$swstack = 100
$framesize = 100

Dim I As Word
Dim Messen_an As Byte

Config Timer0 = Timer , Prescale = 8
Const Startwert = 138 'Für 1 ms
Timer0 = Startwert
On Timer0 Tim0_isr
Enable Interrupts

Messen_an = False
I = 0

Do
'Messung für 3 Sek. starten:
I = 0
Messen_an = True

While Messen_an = True
'Messwerte aufnehmen
Wend

'Messwerte verarbeiten
'Z.B. 10 s warten auf nächste Messung:
Wait 10

Loop
End



Tim0_isr: '1000 Hz (1 ms)
Timer0 = Startwert
I = I + 1
If I > 3000 Then 'nach 3 Sek.
Messen_an = False
End If
Return

Gruß Dirk