-         

Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 25

Thema: Absturz bei seriellem Empfang

  1. #1
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.07.2006
    Alter
    87
    Beiträge
    627

    Absturz bei seriellem Empfang

    Anzeige

    SMARTPHONES & TABLETS-bis zu 77% RABATT-Kostenlose Lieferung-Aktuell | Cool | Unentbehrlich
    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

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    11.04.2005
    Beiträge
    1.469
    Hi,
    ohne Code ist das etwas schwierig zu sagen.
    Empfängst du per Interrupt, oder pollst du ?
    Kannst du die empfangenen Daten in ein größeres Array schieben und dann in einem Rutsch auf die Karte senden ?
    Wie schnell kommen denn die Daten an? Dauernd oder Blockweise ?

    Gruß
    Christopher

  3. #3
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.07.2006
    Alter
    87
    Beiträge
    627
    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

  4. #4
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.07.2006
    Alter
    87
    Beiträge
    627
    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

  5. #5
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    18.05.2007
    Ort
    Berlin
    Alter
    46
    Beiträge
    765
    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! \/

  6. #6
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.07.2006
    Alter
    87
    Beiträge
    627
    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.

    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
    aus dieser Routine dürfte er eigendlich nicht raus kommen und neustarten aber er schafft das...

  7. #7
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    11.04.2005
    Beiträge
    1.469
    Was ich damit sagen will: es wird nicht auf die Karte zugegriffen und trozdem hängt sich der µC auf.
    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).
    Irgendwann wird die dann zu groß und schreibt auf Speicherbereiche, wo sie nix zu suchen hat. -> Absturz.


    Gruß
    Christopher

  8. #8
    Erfahrener Benutzer Robotik Einstein Avatar von Vitis
    Registriert seit
    06.01.2005
    Ort
    Südpfalz
    Alter
    43
    Beiträge
    2.240
    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

  9. #9
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    18.05.2007
    Ort
    Berlin
    Alter
    46
    Beiträge
    765
    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! \/

  10. #10
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.07.2006
    Alter
    87
    Beiträge
    627
    @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

Seite 1 von 3 123 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •