Hallo,
mein Problem ist das open, print, flush und close mehr zeit brauchen
als ein neues Zeichen ankommt.
Wärend die Karte beschrieben wird kommen weitere Zeichen an,
die leider ignoriert werden.
Ich habe bereits Probiert das mit einem Interupt zu lösen,
das Problem ist das selbe.
Gibt es denoch eine Möglichkeit Daten auf die SD Karte zu schreiben
ohne das der Buffer voll wird?
Bascom, Atmega32, RS232 mit 9600 Baud.
Do
Akey = Waitkey()
Chrx = Chr(akey)
If Len(buff) < Max_buf_len Then
Buff = Buff + Chrx
Else
If Sdpresent = 1 Then
Buff = Buff + Chrx
Open Tfile For Append As #3
Print #3 , Buff
Flush #3
Close #3
Buff = ""
Toggle Portc.7
End If
End If
Loop
Vielen Dank
Nimm das Open mal nach oben aus der Schleife raus.
Flush und Close machst du hinter die Schleife.
Halte die Datei offen solange du schreibst.
Damit sollte es schon mal ein wenig besser werden.
Open Tfile For Append As #3
Do
Akey = Waitkey()
Chrx = Chr(akey)
If Len(buff) < Max_buf_len Then
Buff = Buff + Chrx
Else
If Sdpresent = 1 Then
Buff = Buff + Chrx
Print #3 , Buff
Buff = ""
Toggle Portc.7
End If
End If
Loop
Flush #3
Close #3
Da habe ich aber das problem wann ich Flush ausführe. Ich schreibe ja permanent über RS232 auf die SD Karte, wenn ich dann die spannung weg nehme ohne einem flush/close verliere ich Daten. Eventuell ein Timer der in gewissen abstaenden ein flush durchfuehrt aber auch da wieder das problem, wenn in diesem moment Daten ankommen stoert das die sache.
>Ich schreibe ja permanent über RS232 auf die SD Karte, wenn ich dann >die spannung weg nehme ohne einem flush/close verliere ich Daten. dann erkenn doch das weg nehmen der spannung und führe dann flush/close aus. brown-out-detection und interrupt
>Ich schreibe ja permanent über RS232 auf die SD Karte, wenn ich dann >die spannung weg nehme ohne einem flush/close verliere ich Daten. Genau das sollte man nicht machen. Also Spannung einfach wegnehmen. Was du brauchst ist ein Taster mit dem du die Karte gezielt runterfährst. Lies da mal ein bißchen: Beitrag "SD card: FAT Integrität und power-down / "elektrischem" Ausschalten?" >Eventuell ein Timer der in gewissen abstaenden ein flush durchfuehrt >aber auch da wieder das problem, wenn in diesem moment Daten ankommen >stoert das die sache. Wenn Flush zu langsam ist, dann wirst du dir wohl eine andere Pufferstrategie einfallen lassen müssen.
>dann erkenn doch das weg nehmen der spannung und führe dann flush/close >aus. brown-out-detection und interrupt Dann kannst du die Karte auch ohne die Spannung wegzunehmen einfach rausziehen während geschrieben wird. Interrupt ist hier völlig daneben.
also ich gehe mal davon aus, daß das CLOSE+FLUSH länger dauert als der
Abstand zwischen 2 empfangenen Zeichen. Dann ist die Frage, ob ein
Interrupt den CLOSE / FLUSH-Befehl unterbrechen darf. Wenn nein, geht es
nicht, wenn ja machst Du
im Hauptprogramm:
do
if buffer_voll then ... 'close+flush!, buffer_voll=false
loop
in der UART-ISR
'Zeichen in den Puffer
buffer(index) = udr
incr index
'Signal and Hauptprogramm, falls Puffer voll
if index > (buf_max) then
buffer_voll=true
index=1
endif
return
Besser noch abwechselnd 2 Puffer, damit der eine in Ruhe geschrieben
werden kann, während sich der andere füllt.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.