PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Seriell daten mit Timeout empfangen



sato
21.07.2007, 22:47
Hallo Bascom programmierer

Wie kann ich in Bascom so was verwirklichen? Bin in Bascom ein neuling

Beim Spannung anschliessen an Atmega128 möchte ich das während etwa 8 sekunden seriell etwa 20 bytes empfangen werden, fals diese Zeit "Timeout" vergeht ohne das die daten ankommen sollte das programm zum Hauptprogram springen

Also 2 Situationen
1) daten empfangen und auswerten und speichern und dann weiter zum main springen

2) Timeout - 8 sekunden vergangen ohne das daten empfangen wurden
dann zum main springen

Main

Do
'weiter programm verarbeitung
Loop
end


Kann mir jemand bitte ein Tip geben?

Danke

Gruss

Sato

Dirk
22.07.2007, 02:48
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:


'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

chr-mt
22.07.2007, 08:33
$Timeout = 100000
Input irgendwas

Den Wert für Timeout musst du ausprobieren.
Ob man da bis zu 8 Sekunden machen kann, weiß ich jetzt nicht.

Gruß
Christopher