Hallo sato,
es gibt da sicher mehrere Möglichkeiten.
Man könnte mit einem Timer und der zugehörigen ISR (Interrupt Service Routine) z.B. einen "1ms-Ticker" realisieren. Damit kann man 8 Sekunden (System_timer = 8000) gut erfassen. Diesen "Ticker" kannst du auch für andere Zwecke (Code-Laufzeit oder Timeouts) verwenden:
Code:
'Timer1 für genaue Zeitmessungen konfigurieren:
Config Timer1 = Timer , Prescale = 1 'Timer 1000Hz
'Startwerte für die Tim1_isr (Register werden mit 15 Takten gesichert):
'Const Startwert = 64551 'Für 1MHz
'Const Startwert = 61551 'Für 4MHz
Const Startwert = 57551 'Für 8MHz
'Const Startwert = 49551 'Für 16MHz
'Const Startwert = 45551 'Für 20MHz
Timer1 = Startwert
On Timer1 Tim1_isr Nosave 'Überlauf 1000x/s
Dim System_timer As Word '1ms Zählvariable
Enable Interrupts
Enable Timer1 '1ms Interrupt
'Weitere Definitionen
System_timer = 0
Do
' Hier serieller Empfang (nicht blockierend!)
If "Empfang der 20 Bytes erfolgreich" Then Exit While
While System_timer <= 8000
If "Empfang der 20 Bytes erfolgreich" Then
' Verwenden der 20 Bytes
Else ' Timeout!
' Standardwerte einsetzen
End If
Do
'weiter programm verarbeitung
Loop
end
'###########################################################################
'Spezielle kurze Timer1-ISR (1000Hz/1ms) für Zeitmessungen:
Tim1_isr: 'gesamt ISR: 60 Takte
$asm
push r24 'gesamt PUSHs: 15 Takte
push r25
push r26
push r27
push r30
push r31
in r24 , SREG
push r24
$end Asm
Timer1 = Startwert 'Bascom-Code: 26 Takte
Incr System_timer 'Word-Variable!
$asm
pop r24 'gesamt POPs: 15 Takte
Out Sreg , R24
pop r31
pop r30
pop r27
pop r26
pop r25
pop r24
$end Asm
Return 'RETI: 4 Takte
'###########################################################################
Viel Erfolg!
Gruß Dirk
Lesezeichen