PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Unerklärliches Zurücksetzen von Variablen im SRAM



autoguider
03.10.2007, 13:36
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

SIGINT
03.10.2007, 15:16
@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

recycle
03.10.2007, 15:50
@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?

autoguider
03.10.2007, 16:05
@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

Stromi
03.10.2007, 17:17
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?

peterfido
03.10.2007, 19:23
Jo, tippe auch auf den Stack.

autoguider
03.10.2007, 23:37
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]

Stromi
04.10.2007, 14:50
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?

autoguider
04.10.2007, 15:04
@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

Stromi
04.10.2007, 16:07
Man müste sich im Ram den verwendeten Puffer "ausmalen", wo liegen die festgesetzten Bereiche und wo funkt der Stack dazwischen.