www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Bascom Zeitrpoblem mit RS232 und SD Karte


Autor: Michi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Der Micha (steinadler)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bei welcher Taktfrequenz läuft denn dein µC?

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Michi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: willi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>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

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>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.

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>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.

Autor: nasowas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.