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:
Viel Erfolg!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 '###########################################################################
Gruß Dirk






Zitieren


Lesezeichen