-         

Ergebnis 1 bis 10 von 10

Thema: Unerklärliches Zurücksetzen von Variablen im SRAM

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    31.08.2007
    Beiträge
    17

    Unerklärliches Zurücksetzen von Variablen im SRAM

    Anzeige

    Hallo Zusammen,

    ich habe ein Phänomen beobachtet welches mich Nerven gekostet hat und Zweifel an der Zuverlässigkeit von Prozessor /Programmcode aufkommen lässt.

    Ich programmiere eine Schrittmotorsteuerung welche vom PC aus über RS232 bedienbar ist. Prozessor AT Mega 8. Programmierung Bascom 1.11.88.001
    Das Software Interface welches auf dem PC läuft ist eigentlich gut dokumentiert. Bisher habe ich nur einen Fehler gefunden. Um zu verstehen was nun über den COM-Port des PC übertragen wird habe ich das Programm Portmonitor laufen. Damit sehe ich auch auf Binärebene was hin und her geschickt wird.

    In dem Software interface gibt es einen Button mit der Bezeichnung des COM Ports. Aktiviere ich zum ersten Mal das Interface durch Drücken des Buttons dann schickt der PC einige Strings welche dann von der Schrittmotorsteuerung interpretiert werden. Als Antwort kommen dann die entsprechen Antwortstrings zurück. Beim ersten Mal funktioniert das reibungslos.
    Die zurückgeschickten Parameter sind in der Steuerung im EEPROM gespeichert und werden nur beim Kaltstart ! der Schrittmotorsteuerung durch eine Init- Routine in Variable geschreiben. Diese Variablen liegen im SRAM.
    Betätige ich nun im Software Interface den COM Button erneut, dann wird die Verbindung zur Schrittmotorteuerung abgebrochen. Es werden keine Nachrichten an die Motorsteuerung geschickt. Deshalb kann (nach meinem Weltbild) die Software nicht wissen das keine Verbindung mehr besteht.

    Nun betätige ich wieder den COM Button. Es werden die üblichen Strings geschickt und es kommen die entsprechenden Antworten.

    ABER:

    Bei 3 Variablen vom Typ Byte ( SRAM) wird der Wert &H0 zurückgegeben.
    Diese Variablen waren in den Adressen &H08D- &H08F gespeichert.

    Ich habe nun die Reihenfolge der Deklaration der Variablen geändert. Damit kommen diese Bytes woanders zur Speicherung. Seitdem werden sie nicht mehr verändert.


    Grundsätzlich bleibt bei mir nun der Zweifel an der Zuverlässigkeit des Systems. Es kann nicht sein dass Variablen reproduzierbar auf 0 gesetzt werden ohne dass es eine Ursache dafür gibt.

    Es gibt keine weiteren Unterprogramme welche auf diese drei Variablen zugreifen. ( Nur Init und die Auswerteroutine).

    Ich könnte natürlich immer vor dem Lesen der "Arbeitsvariablen" die Werte aus dem EEPROM lesen und in die Arbeitsvariablen übertragen. Nur das ist nach meiner Ansicht ein Behelf. Kann es sein dass mache Speicherzellen Halluzinationen bekommen ? Ich weigere mich aber zunächst daran zu glauben.

    Es wird bei mindestens 3 Variablen im SRAM der Wert auf Wert 0 gesetzt. Ich konnte bisher aber nicht beobachten dass andere Variablen verändert werden.

    Habt ihr auch schon solche Erfahrungen mit Bascom und einem AT MEga 8 gemacht ? Läuft da etwas auf der Hardwareebene ab ? Fängt der MAX232 an zu spinnen und lässt den Stack überlaufen ?

    Ich bin ratlos und bitte um Ratschläge.

    beste Grüße
    Christian

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    19.01.2006
    Ort
    Mönchengladbach
    Beiträge
    544
    @autoguider:
    Ich hab noch nicht viel mit Bascom gemacht und generell auch noch keine Hardwarefehler bei den AVRs gefunden.... aber denkbar ist es schon, daß ein paar Speicherstellen defekt sind.
    Ich halte diese Wahrscheinlichkeit allerdings für so gering, daß Software- oder Schaltungsfehler eher in betracht gezogen werden sollten.
    Gerade bei Motoren gibt es gerne Fehler, die unerklärlich scheinen. (ich hab darin allerdings noch nicht viel erfahrung gesammelt)
    Die typischen Abblockkondensatoren und Freilaufdioden hast du drin, oder?
    Eventuell kannst du noch nen Snubber für jede Motorspule spendieren... sollte auch was bringen.

    Gruß,
    SIGINT

  3. #3
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    29.01.2004
    Beiträge
    2.441
    @autoguider

    In Bascom gibt es für die Übergabe von Variablen in Funktionen die Parameter ByVal und ByRef.
    Ich weiss nicht genau wie die in Bascom arbeiten, es dürfte aber irgendetwas damit zu tun haben, dass einmal der Wert der Variablen übergeben wird und das andere mal nur eine Referenz (Adresse) auf die Variable übergeben wird.

    Könnte es da etwas mit zu tun haben?

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    31.08.2007
    Beiträge
    17
    @sigint

    Ich glaube nicht dass die Prameterübergabe etwas damit zu tun hat.
    Das Unterprogramm wird zwar angesprungen aber arbeitet nur auf globalen Variablen. Das Unterprogramm bekommt keine Variablen übergeben.

    dank und Gruß
    Christian

  5. #5
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    19.08.2004
    Beiträge
    197
    Com-Port einmal drücken, Verbinden. Com-Port nochmal drücken, Verbindung lösen. Com-Port wieder drücken, Verbinden... erscheint logisch....
    Aber ohne den Quellcode zu kennen, schwierig.
    Stack ist eingerichtet? Standartwerte?

  6. #6
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    18.05.2007
    Ort
    Berlin
    Alter
    46
    Beiträge
    765
    Jo, tippe auch auf den Stack.
    Wenn das Herz involviert ist, steht die Logik außen vor! \/

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    31.08.2007
    Beiträge
    17
    Hallo zusammen,

    hier mal ein Teil des Quellcodes:

    Zunächst die Einstellungen:

    $lib "mcsbyteint.lbx"
    $regfile = "m8def.dat" ' AZ Mega 8
    $crystal = 6000000 ' Quarzfrequenz
    $baud = 19200 ' Baudrate RS232
    $hwstack = 40 ' hardware stack
    $swstack = 20 ' SW stack ausreichen ?



    Hier die Deklaration:

    Dim Dutycycle As Byte ' Tastverhältnis Motorstrom
    Dim Step_delay As Byte
    Dim Step_size As Byte
    Dim Zeichen As String * 9
    Dim Zeichen_byte(10) As Byte At Zeichen Overlay

    Und hier der Code der Prozedur

    Wenn im String Zeichen die Bytes 3 -5 das Ascii Zeichen 0 haben dann werden nur die Einstellungen zurückgegeben. Ansonsten werden die Parameter aus den jeweiligen Bytes extrahiert, in die Variablen übergeben und danach ins EEPROM geschrieben. ( Hard_xxxx)
    Zeichen


    Sub Set_config()



    If Zeichen_byte(3) <> 48 Or Zeichen_byte(4) <> 48 Or Zeichen_byte(5) <> 48 Then

    Dummybyte = Zeichen_byte(3) ' DutyCycle
    If Dummybyte > 100 Then Dummybyte = 100 ' Begrenzung


    If Dummybyte <> Dutycycle Then ' Neuer Wert

    Dutycycle = Dummybyte
    Hard_dutycycle = Dutycycle
    End If



    If Dummybyte < 50 Then ' Wenn Dutycyle <50% -> Strom abschalten
    297_enable = 0
    Status297_enable = 0 ' Enable =0 -> Strom abgeschaltet
    'Zeichen_byte(6) = 1
    Else
    297_enable = 1
    Status297_enable = 1
    'Zeichen_byte(6) = 253
    End If


    If Step_delay <> Zeichen_byte(4) Then 'nur wenn geändert ins EEPROM schreiben

    Step_delay = Zeichen_byte(4)
    Hard_step_delay = Step_delay
    End If



    If Step_size <> Zeichen_byte(5) Then

    Step_size = Zeichen_byte(5)
    Hard_step_size = Step_size
    End If


    End If 'Number <> 0

    #if Testmodus = 1

    Zeichen = ""

    #endif


    For I = 1 To 8 'Ausgabestring mit "0" füllen
    Zeichen = Zeichen + "0"
    Next I



    Zeichen_byte(1) = "F" ' Ausgabestring vprbereiten
    Zeichen_byte(2) = "C"
    Zeichen_byte(3) = Dutycycle ' Diese Werte sind dann &H00
    Zeichen_byte(4) = Step_delay
    Zeichen_byte(5) = Step_size


    Dummybyte = 0
    For I = 1 To 8 ' Erzeugung Checksumme
    Dummybyte = Dummybyte + Zeichen_byte(i)
    Next I
    Zeichen_byte(9) = Dummybyte
    Zeichen_byte(10) = 0

    Printbin Zeichen
    Return



    beste Grüsse
    Christian





    [/code]

  8. #8
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    19.08.2004
    Beiträge
    197
    Zitat:
    Dim Zeichen_byte(10) As Byte At Zeichen Overlay
    laut Hilfe:
    DIM var AS [XRAM/SRAM/ERAM]type [AT location/variable] [OVERLAY]
    zB. auf der Ram-Adresse Hex62 ein Byte speichern:
    Dim W as Word at &H62 OVERLAY
    Das würde ich mal ausprobieren, ist die Eingabe im ser. Interupt?

  9. #9
    Neuer Benutzer Öfters hier
    Registriert seit
    31.08.2007
    Beiträge
    17
    @stromi,

    danke für den Ratschlag. Ich werde es so programmieren.
    Zum Thema Eingabe:
    Die Eingabe efolgt gepuffert über Interrupt.
    Der Puffer liegt an Adresse &H60 und ist 20 Zeichen gross

    beste grüße
    Christian

  10. #10
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    19.08.2004
    Beiträge
    197
    Man müste sich im Ram den verwendeten Puffer "ausmalen", wo liegen die festgesetzten Bereiche und wo funkt der Stack dazwischen.

Berechtigungen

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