Werbung
Hallo,
ich habe 2 µC über RS232 verbunden(Abstand 20cm Kabel).
Der eine ließt Daten ein und sendet diese - der andere empfängt und Speichert die Daten auf einer SD-Card. Als Kontrolle sendet dieser alle Daten an den PC. Dabei ist mir aufgefallen, dass der µC, der alles auf SD speichern soll, abstürzt, wenn der erste sendet.
Wenn weniger Daten gesendet werden läuft alles. Wenn die serielle Verbindung getrennt wird stürzt er nicht ab.
Gibt es eine Möglichkeit das zu ändern(außer weniger zu senden![]()
Woran liegt es, dass der µC abstürzt?
Der µC hat relativ(?) wenig Zeit für alles:
Takt 20Mhz
Empfang und speicherung auf SD 10 mal pro Sekunde
Tobias
Hallo,
also der Empfang läuft über Interrupt:
Der Empfänger arbeitet etwa so:
On Urxc Onrxd
Onrxd:
E_byte = Udr
Select Case E_byte
Case 35 : E_flag = 1 '"#" = Slave wird gesendet
Case 58 : E_flag = 3 '":" =
Case 13 : E_flag = 4 '"13 / ENTER" = Empfang komplett
Case Else : If E_flag = 1 Then Slave = Slave + Chr(e_byte)
If E_flag = 2 Then Parameter = Parameter + Chr(e_byte)
If E_flag = 3 Then Wert = Wert + Chr(e_byte)
End Select
Return
Später werden alle Daten in einen String geschoben und dieser wird auf die Karte geschrieben.
Wie meinst du dass, wie die Daten ankommen?
Es wird ca 11 mal pro Sekunde mit einem Printbefehl gesendet.
Print "#S1:" ; Strom11 ; ";" ; Spannung2 ; ";;X"
Das ;;X am Ende ist, weil ich manchmal 1-2 Zeichen verlohren habe
Code:'SENDER RS232 '------------------------------------------------------------------------------- 'Konfiguration µC: $regfile = "m8def.dat" 'AT-Mega8 $crystal = 14745600 'Quarz: 14,7456 MHz $baud = 38400 'Baudrate der UART '------------------------------------------------------------------------------- 'Ein- Ausgänge: 'Ddrb = &B10000001 '1 Ausgang, 0 Eingang = Pin PB7-0 als Ausgang Ddrc = &B0000000 '1 Ausgang, 0 Eingang = Pin PC6-0 als Eingang 'Ddrd = &B11100000 '1 Ausgang, 0 Eingang = Pin PD7-0 als Ausgang; 0 als Eingang (Freigabe) 'Portc = &B11111111 'PC0...PC7 auf High setzen '------------------------------------------------------------------------------- 'Konfiguration LCD Config Pinb.2 = Output Pinb.2 = 0 '= Read / Write Config Lcd = 16 * 2 Config Lcdpin = Pin , Db4 = Portd.5 , Db5 = Portd.6 , Db6 = Portd.7 , Db7 = Portb.0 , E = Portb.1 , Rs = Portd.4 'neues LCD mit Quarz Cursor Off Noblink ' Cursor aus '------------------------------------------------------------------------------- 'Analogmessung Config Adc = Single , Prescaler = Auto , Reference = Avcc '------------------------------------------------------------------------------- 'Timer Config Timer1 = Timer , Prescale = 1024 Timer1 = 36736 'Überlauf alle 2 Sekunden Enable Timer1 Enable Interrupts On Timer1 Ontimer1overflow 'Timer1-Interruptroutine deklarieren '------------------------------------------------------------------------------- ' Variablen Dim Ani_1 As Byte 'Zähler für startannimation Dim Ende As Byte 'zum Animation beenden Dim Analog1 As Word '=0-1023 vom Analogeingang (für Strommessung) Dim Strom1 As Single 'Stromwert 0 Dim Strom11 As Byte 'Ergebnis Strom1 Dim Strom11_old As Word 'LCD aktualisieren, wenn Wert sich geändert hat Dim Max0 As Byte 'warte zeit für max1wert Dim Max1 As Byte 'MAX Strom1 Dim Max2 As Byte 'MAX_MAX Strom1 Dim Analog5 As Word '=0-1023 vom Analogeingang (für Spannungsmessung) Dim Anzahl_rs232 As Word 'Abstand RS232 senden Dim Spannung1 As Single Dim Spannung2 As Word 'für RS232 Dim Stelle0 As Byte 'um die richtige Stelle anzuwählen - VORZEICHEN Dim Stelle1 As Byte 'um die richtige Stelle anzuwählen - Strom aktuell Dim Stelle2 As Byte 'um die richtige Stelle anzuwählen - Strom MAX1 Dim Stelle3 As Byte 'um die richtige Stelle anzuwählen - Strom MAX2 Dim Stelle_v As Byte 'um die richtige Stelle anzuwählen - Analogeingang 5 Dim Vorzeichen As String * 1 'Vorzeichen + / - Dim Lcd_z As Word 'LCD Zähler zum Anzeige aktualisieren Dim Zyklus As Long 'Anzahl der Do...Loop Durchgänge in 2 Sekunden '------------------------------------------------------------------------------- 'Do - Looproutiene: '------------------------------------------------------------------------------- Start Adc 'Starte analog Messung Max1 = 0 'Max Stromspeicher1 löschen Do ' _______________________________________________________________ '| ___________________________________________________________ | '| |Stromberechnung: | | '| | | | '| |Analogeingang - Vref also 512 Stufen = Stromwert in Stufen | | '| |Stromwert in Stufen * 1,5625 = Stromwert in A | | '| |___________________________________________________________| | '|_______________________________________________________________| 'Analogeingänge Auslesen: Analog1 = Getadc(1) 'Wert aus Analogeingang laden (Stromsensor) Analog5 = Getadc(5) 'Wert aus Analogeingang laden (Spannung) Strom1 = Analog1 - 510 'von 512 auf 510 geändert, weil 0A bei 510 liegt...Messtoleranz... If Strom1 < 0 Then 'wenn Strom negativ Strom1 = Strom1 * -1 Vorzeichen = "-" Else Vorzeichen = " " End If Strom1 = Strom1 * 1.5625 'Strom1 = Strom in Amperé If Strom1 > 0 Then 'damit bei negativen Strömen kein Blödsinn angezeigt wird!! Strom11 = Round(strom1) Else Strom11 = 0 End If 'Max1 Strom speichern If Strom11 > Max1 Then Max1 = Strom11 End If 'Max2 Strom speichern If Strom11 > Max2 Then Max2 = Strom11 End If 'Spannung errechnen Spannung1 = Analog5 * 45.1319648093842 'Widerstände gemessen 9,9k & 81,5k-> 46,17V Spannung2 = Round(spannung1) Spannung1 = Spannung1 / 1000 'für LCD anpassen 'Maxspeicher zurücksetzen If Max0 > 4 Then Max0 = 0 Max2 = 0 End If '------------------------------------------------------------------------------- 'Stellen für LCD anwählen '------------------------------------------------------------------------------- 'richtige Stelle anwählen! If Strom11 < 10 Then Stelle1 = 4 Stelle0 = 3 'Anzeige für negatives Vorzeichen Else Stelle1 = 3 Stelle0 = 2 'Anzeige für negatives Vorzeichen End If If Strom11 > 99 Then Stelle1 = 2 Stelle0 = 1 'Anzeige für negatives Vorzeichen End If 'richtige Stelle anwählen! If Max1 < 10 Then Stelle2 = 3 '14 für großes LCD Else Stelle2 = 2 '13 End If If Max1 > 99 Then Stelle2 = 1 '12 End If 'richtige Stelle anwählen! If Max2 < 10 Then Stelle3 = 7 Else Stelle3 = 6 End If If Max2 > 99 Then Stelle3 = 5 End If 'richtige Stelle anwählen! If Analog5 < 10 Then Stelle_v = 8 Else Stelle_v = 7 End If If Analog5 > 99 Then Stelle_v = 6 End If If Analog5 > 999 Then Stelle_v = 5 End If 'LCD aufrufen Incr Lcd_z If Lcd_z > 300 Then '300 = 5 RS232 Werte pro Sekunde empfangen!!! Lcd_z = 0 Gosub Lcd_klein End If '_______________________________________________________________________________ '_______________________________________________________________________________ 'RS232 senden Incr Anzahl_rs232 'Variable für Zeitabstand If Anzahl_rs232 > 90 Then 'ca. 11 Werteausgaben pro Sekunde Anzahl_rs232 = 0 Print "#S1:" ; Strom11 ; ";" ; Spannung2 ; ";;X" End If Incr Zyklus Loop '------------------------------------------------------------------------------- '------------------------------------------------------------------------------- 'Sprungmarken: '------------------------------------------------------------------------------- '------------------------------------------------------------------------------- Ontimer1overflow: Timer1 = 36736 Max1 = 0 Incr Max0 'Print Zyklus 'Zyklus = 0 Return '------------------------------------------------------------------------------- Lcd_klein: Cls 'Locate 1 , Stelle0 'Lcd Vorzeichen Locate 1 , Stelle0 Lcd Strom11 ; "A" Locate 1 , 5 Lcd Fusing(spannung1 , "#.&") ; "V" 'Lcd Spannung3 'Locate 1 , Stelle_v 'Lcd Analog5 Locate 2 , Stelle2 Lcd Max1 ; "A" Locate 2 , Stelle3 Lcd Max2 ; "A" Return '=============================================================================== 'Pinbelegung µC Strommessung LEM 200-P '=============================================================================== ' AT MEGA 8 ' +---U---+ ' Reset PC6 +1 28+ PC5 ' PD0 +2 27+ PC4 ' PD1 +3 26+ PC3 ' PD2 +4 25+ PC2 ' PD3 +5 24+ PC1 ' PD4 +6 23+ PC0 Analogeingang0 ' Vcc +7--- 22+ GND | / Reset | ' GND +8 |-21+ AREF | / GND | ' RS PB6 +9 |-20+ AVCC | / +5V | ' E PB7 +10 19+ PB5 Taster5 | / SCK | ' / LCD / DB4 PD5 +11 18+ PB4 Taster4 | / MISO | ' / LCD / DB5 PD6 +12 17+ PB3 Taster3 | / MOSI | ' / LCD / DB6 PD7 +13 16+ PB2 Taster2 ___________ ' / LCD / DB7 PB0 +14 15+ PB1 Taster1 ' +-------+ '=============================================================================== 'Pinbelegung AM LCD '=============================================================================== 'Pin 1: GND 'Pin 2: +5V 'Pin 3: Kontrast (0-5V) 'Pin 4: RS -> AVR 'Pin 5: R/W -> GND (read/write mode, nur writen) 'Pin 6: E -> AVR 'Pin 7-10: -> GND 'Pin 11-14: -> AVR -> 11=DB4 / 12=DB5 / 13=DB6 / 14=DB7
und hier noch das komplette Programm vom Empfänger:
Code:'Empfänger $regfile = "M644def.dat" $crystal = 20000000 $hwstack = 250 $swstack = 250 $framesize = 450 $baud = 38400 '------------------------------------------------------------------------------- 'Ein- Ausgänge: Ddra = &B00000000 '1 Ausgang, 0 Eingang = Pin PA7-0 'Ddrb = &B00000000 '1 Ausgang, 0 Eingang = Pin PB7-0 Ddrc = &B00000000 '1 Ausgang, 0 Eingang = Pin PC7-0 Ddrd = &B11000000 '1 Ausgang, 0 Eingang = Pin PD7-0 Config Pinb.4 = Output 'CS Config Pinb.6 = Input 'MISO / DO $include "config_mmc.bas" $include "config_avr-dos.bas" '------------------------------------------------------------------------------- 'ALIAS J1 Alias Pinc.2 'Schalter logging J2 Alias Pinc.1 J3 Alias Pinc.0 'LogZeit Led1 Alias Portd.6 'unten links Led2 Alias Portd.7 'unten rechts '------------------------------------------------------------------------------- Print "POWER ON..." Led2 = 1 'LED rechts '------------------------------------------------------------------------------- 'Für RS232: On Urxc Onrxd 'Interrupt-Routine setzen Enable Urxc 'Interrupt URXC einschalten Enable Interrupts 'Interrupts global zulassen '------------------------------------------------------------------------------- 'Analogmessung: Config Adc = Single , Prescaler = Auto , Reference = Avcc Start Adc 'Starte analog Messung '------------------------------------------------------------------------------- 'EEPROM Variablen: Dim Lognummer_ee As Eram Word 'Anzahl der Loggings Dim Lognummer As Word '------------------------------------------------------------------------------- 'Timer1 = 16 Bit 10 mal pro Sek @ 20MHz Config Timer1 = Timer , Prescale = 64 'Teiler 1/8/64/256/1024 On Timer1 Ontimer1overflow 'Unteprogramm aufrufen Const Timer1vorgabe = 34286 '34286=10x/sek 49911=5x/sek Timer1 = Timer1vorgabe '------------------------------------------------------------------------------- '------------------------------------------------------------------------------- 'Variablen: 'SD Dim Tmpbyte As Byte 'zum initialisieren Dim Btemp1 As Byte 'zum initialisieren 'Analogeingänge Dim K0 As Integer 'Spannung Empfänger Dim K1 As Integer 'Spannung Akku Dim K2 As Integer 'Strom Akku Shunt Dim K3 As Integer 'Strom Akku Hallsensor Dim K4 As Integer 'RES Dim K5 As Integer 'RES Dim K6 As Integer 'RES Dim K7 As Integer 'Temp. Dim Anzahl As Long 'Zähler für schreiben Dim Anzahl_str As String * 6 Dim Zu_schreiben As String * 70 Dim Rec As Bit 'wird von J1 oder Empfänger(Pulsein) gesetzt Dim Rec_z As Word 'wird von Timer 1 hochgezählt 5*/sec Dim Rec_sd As Bit 'Datei öffnen schließen Dim Led As Word Dim Led_wert As Word 'Wert für blinken Dim Logzeit As Word 'Einstellung wie oft loggen Dim Loginfo As String * 20 'Text in txt Datei wie oft/sec geloggt wurde 'RC-Empfänger auswerten Dim Pulsbreite1 As Word 'Knüppelstellung Knüppel 1 Dim Pulsbreite11 As String * 3 Dim Pulsbreite2 As Word 'Knüppelstellung Knüppel 2 Dim Pulsbreite22 As String * 3 'Drehzahlmessung Dim T01 As Byte 'Wert Timer0 Dim T02 As Integer 'Wert Timer0 Anzahl Überläufe Dim Drehzahl_t01 As Byte Dim Drehzahl_t02 As Integer Dim Drehzahl As Single 'Drehzahl umgerechnet Dim Drehzahl1 As Word 'gerundeter Wert Dim Drehzahl_s As String * 6 'Drehzahl für Ausgabe 'RS232 Empfang Dim Slave As String * 3 Dim Parameter As String * 10 Dim Wert As String * 10 Dim S1_rs As String * 8 'von der RS 232 Schnittstelle Dim E_byte As Byte , E_flag As Byte Dim Zyklus As Word 'incr bei jeder Do...Loop! '------------------------------------------------------------------------------- 'Variablen belegen: Lognummer = Lognummer_ee 'Wert von EEPROM auslesen Print "lognummer: " ; Lognummer Waitms 500 '_______________________________________________________________________________ 'LogZeit Festlegen If J1 = 1 Then 'Aufnahme Jumper gesteckt, bevor Spannung da ist -> Fehler2 Goto Fehler1 End If Print "START SD-Test..." '_______________________________________________________________________________ 'Init MMC/SD Card Tmpbyte = Driveinit() Print "Init: " ; Str(tmpbyte) Print "Trying to read File system..." Btemp1 = Initfilesystem(1) ' Partition 1 Print "Btemp1: " ; Btemp1 ; " 0=ok" If Btemp1 <> 0 Then 'Wenn Fehler Print "Error: " ; Btemp1 ; " beim Initialisieren des Dateisystems" Waitms 500 Print "SD - FEHLER" Goto Fehler2 Else Print "SD-Card OK" End If '_______________________________________________________________________________ 'LogZeit Festlegen If J3 = 0 Then Logzeit = 1 '10 mal pro Sek. loggen Loginfo = " (Log 10x / sek)" 'Text in txt Datei Else Logzeit = 10 '1 mal pro Sek. loggen Loginfo = " (Log 1x / sek)" 'Text in txt Datei End If Print Loginfo ''Enable Int0 'Drehzahlmessung 1 aktiv Enable Interrupts 'Interrupts global ''Enable Timer0 'timer0 einschalten Enable Timer1 'timer1 einschalten '------------------------------------------------------------------------------- '------------------------------------------------------------------------------- 'Hauptprogramm Do...Loop '------------------------------------------------------------------------------- '------------------------------------------------------------------------------- Led1 = 1 'LED unten links an Led2 = 0 'LED unten rechts aus Do 'Incr Led 'led hochzählen Toggle Led1 'Aufnahme Rec = J1 'Jumper zum Aufzeichnen 'Steuerung LED2(rechts) für "logging ON/OFF" If J1 = 1 And Rec_sd = 1 Then Led2 = 1 'LED unten rechts an 'langsam Else Led2 = 0 'LED unten rechts aus End If '------------------------------------------------------------------------------- 'Datei öffnen und schließen If Rec = 1 And Rec_sd = 0 Then Open "LOG.txt" For Append As #1 Print #1 , "#Lognummer: " ; Lognummer ; Loginfo Print #1 , "#Nr. ;K0 RC mV;K1 BATT mV;K2 SHUNT A;K3;K7 Temp;Drehzahl;A&mV_RS" Incr Lognummer 'LogNummer hochzählen und Lognummer_ee = Lognummer 'in EEPROM übertragen Rec_sd = 1 End If If Rec = 0 And Rec_sd = 1 Then Close #1 Print "SD geschlossen" Rec_sd = 0 End If '=============================================================================== 'Eingänge Auswerten: 'Analogkanäle einlesen K0 = Getadc(0) 'Wert aus Analogeingang laden K1 = Getadc(1) 'Wert aus Analogeingang laden 'ENDE Eingänge auswerten 'RS232 Empfang If E_flag = 4 Then 'Empfangsstring komplett If Slave = "S1" Then 'wenn Daten für Slave1 S1_rs = Wert 'Print "S1: " ; S1_rs 'Select Case Parameter ' Case "Ampere" : Ampere_rs = Wert ' Print "#S1,Strom:" ; Wert ' 'Case "Volt" : Volt_rs = Wert ' Print "#S1,Strom:" ; Wert ' Case Else : Print "Err. RS232 Empfang" 'wenn nicht definiert dann Err. anzeigen 'End Select End If 'Daten auf jedenfall löschen Slave = "" 'Slave löschen 'Parameter = "" 'Parameter löschen Wert = "" 'Wert löschen E_flag = 0 'Empfang neu setzen End If '=============================================================================== 'Logging If Rec = 1 And Rec_z => Logzeit Then Incr Anzahl Anzahl_str = Str(anzahl) Anzahl_str = Format(anzahl_str , "000000") Zu_schreiben = Anzahl_str + ";" + Str(k0) + ";" + Str(k1) + ";" + S1_rs S1_rs = "?;?" 'wenn keine Daten mehr kommen!!! Gosub Sd_schreiben 'Print Rec_z 'Kontrolle: wenn > 1 dann Zykluszeit zu groß d.h. kein Loggen 10x/sec möglich! Rec_z = 0 'Variable von Timer zurücksetzen End If 'Datensatznummer zurücksetzen If J1 = 0 Then 'Schalter logging = 0 Anzahl = 0 End If 'Zyklus Incr Zyklus Loop '------------------------------------------------------------------------------- '------------------------------------------------------------------------------- 'Hauptprogramm Do...Loop ENDE - ENDE - ENDE - ENDE - ENDE - ENDE '------------------------------------------------------------------------------- '------------------------------------------------------------------------------- '_______________________________________________________________________________ 'Daten auf SD - Card schreiben: Sd_schreiben: 'Datei öffnen / erstellen wenn nicht vorhanden! 'Open "LOG.txt" For Append As #1 Print #1 , Zu_schreiben 'Variable auf SD schreiben ''Print Zu_schreiben 'Variable auf COM / PC anzeigen 'Close #1 Return '_______________________________________________________________________________ 'bei J1 Fehler1 Led1 = 0 'Do...Loop Led aus Fehler1: Print "Fehler1 J1 gesteckt Aufnahme vor Spannung!!!" Led2 = 1 'Grüne LED blinken für FEHLER Waitms 1000 Led2 = 0 'Grüne LED blinken für FEHLER Waitms 1000 Goto Fehler1 '_______________________________________________________________________________ 'bei SD Fehler2 Led1 = 0 'Do...Loop Led aus Fehler2: Print "Fehler2 - SD nicht gefunden!!!" Led2 = 1 'Grüne LED blinken für FEHLER Waitms 500 Led2 = 0 'Grüne LED blinken für FEHLER Waitms 500 Goto Fehler2 '_______________________________________________________________________________ Ontimer1overflow: '10 mal pro Sekunde Timer1 = Timer1vorgabe Incr Rec_z ''Print Zyklus Zyklus = 0 Return 'RS232 - Empfang - Strom von LEM 400 Onrxd: E_byte = Udr Select Case E_byte Case 35 : E_flag = 1 '"#" = Slave wird gesendet Case 58 : E_flag = 3 '":" = Case 13 : E_flag = 4 '"13 / ENTER" = Empfang komplett Case Else : If E_flag = 1 Then Slave = Slave + Chr(e_byte) If E_flag = 2 Then Parameter = Parameter + Chr(e_byte) If E_flag = 3 Then Wert = Wert + Chr(e_byte) End Select Return
SD-Karte benötigt etwas mehr Rechenzeit. Ich würde mit Handshaking arbeiten. Wenn der empfänger gerade was auf die Karte schreibt, dem Sender dieses Mitteilen, sodass dieser seine Daten solange behält, bis "grünes Licht" zum senden gegeben wurde. Dies kann über einen extra PIN erfolgen, oder über XON / XOFF.
Wenn das Herz involviert ist, steht die Logik außen vor! \/
d.h. der µC stürzt ab wenn auf die Karte zugegriffen wird und über den Interrupt die serielle Routine ausgelöst wird.
Der Fehler ist aber noch etwas anders:
Aufgefallen ist mir dass, als die Karte nicht richtig drinn steckte und so nicht gefunden wurde. Das Programm ist in eine Endlosschleife gekommen um den Fehler über eine LED anzuzeigen und immerwieder den Fehler seriell zu senden. Auf dem PC(über RS232) hatte ich dann den Fehler 5 mal hinter einander und plötzlich kamen die Meldungen wie bei einem Neustart: also initialisieren, Karte suchen, usw. Eigendlich hätte ich erwartet das die Fehlermeldung: "SD nicht gefunden" endlos hintereinander gesendet wird...
Was ich damit sagen will: es wird nicht auf die Karte zugegriffen und trozdem hängt sich der µC auf.
aus dieser Routine dürfte er eigendlich nicht raus kommen und neustarten aber er schafft das...Code:'_______________________________________________________________________________ 'bei SD Fehler2 Fehler2: Print "Fehler2 - SD nicht gefunden!!!" Led2 = 1 'Grüne LED blinken für FEHLER Waitms 500 Led2 = 0 'Grüne LED blinken für FEHLER Waitms 500 Goto Fehler2
Habe es mir nicht so genau durchgesehen, was mir aber aufgefallen ist, daß du zwar im Fehlerfall in deiner Goto-Fehler-Schleife bleibst, aber im Interrupt trotzdem die Variable "Incr Rec_z" weiter hochgezählt wird. Die wird nie zurückgesetzt. (außer in deiner Do Loop Schleife, aber da kommst du ja im Fehlerfall gar nicht mehr hin).Was ich damit sagen will: es wird nicht auf die Karte zugegriffen und trozdem hängt sich der µC auf.
Irgendwann wird die dann zu groß und schreibt auf Speicherbereiche, wo sie nix zu suchen hat. -> Absturz.
Gruß
Christopher
uargh ... und wieder goto ... komm mir schon wie ein Prediger vor
den Befehl zu meiden.
Der Reset wird ziemlich sicher dadurch ausgelöst, dass Du per Goto über das Progrrammende hinausspringst, der µC die nops dahinter durch läuft und dann an den Programmanfang springt ... faktisch ein Reset.
verwende while, wend, do loop until, subroutinen und call, bzw. gosub und return für Programmverzweigungen
Vor den Erfolg haben die Götter den Schweiß gesetzt
Da geht aber jemand auf Nummer sicher:
Code:$hwstack = 250 $swstack = 250 $framesize = 450
Wenn das Herz involviert ist, steht die Logik außen vor! \/
@chr-mt:
Rec_Z wird tatsächlich im Fehlerfall nicht mehr zurück gesetzt. Werde ich ändern. Allerdings ist Rec_Z als "Word" deklariert, dh. incr-Befehl 10x/sekunde ergibt 36000 pro Stunde und bei 65000 läuft die Variable erst über ich habe den Absturz nach ein paar Sekunden.
@Vitis & Peterfido:
Das kam aus reiner Verzweiflung... Der µC ist aus der Fehler Do...Loop rausgekommen und deshalb hab ich goto benutzt. Nun hat Christopher mir ja erklärt das die Do...Loop in Ordnung war und der µC über den Interrupt von der seriellen Schnittstelle rausgekommen ist. Auch diese Werte
$hwstack = 250
$swstack = 250
$framesize = 450
sind aus reiner Verzweiflung, um es sicher auszuschließen.
Kann man den Empfang irgendwie optimieren, falls der µC an der Datenmenge scheitert und so zuviel Zeit benötigt?
Wie kann ich den Fehler eingrenzen?
Meine Idee:
ich zähle die Variable Zyklus in der haupt Do...Loop hoch und 10 mal pro Sekunde(eben wenn der Timer die Variable zum schreiben auf SD setzt) gebe ich diese Variable seriell aus:
Es sind 267 egal ob der µC zum senden angeschlossen ist oder nicht!
Wenn ich auf SD schreibe sind es 270 und jeder 28.te Wert ist 151 ohne den sende µC!
Mit sende µC sind es auch 270 aber jeder 20.te Wert ist 152 manchmal nur 146!
Kann man daraus etwas ableiten oder gehe ich in die falsch Richtung?
Tobias
Lesezeichen