PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [ERLEDIGT] Programm wird nicht korrekt übernommen ???!!!



Ritchie
19.12.2011, 20:22
Hallo Zusammen,

ich habe einen seltsamen Effekt und weiß mir nicht zu helfen.

Wenn ich ein Programm in meinem ATMega32 via ISP lade, arbeitet es korrekt und ich kann meine Daten abrufen.
(Daten via I2C Bus).

Schalte ich die Schaltung aus, so wird nach dem Einschalten der vorletzte Stand wieder geladen.
(Ich habe eine Variable erst mit 100 und danach mit 101 beschrieben.)
Nach dem Aus/Einschalten hat die Variabel wieder den Wert 100

Was kann man hier falsch machen ?

Gruss R.

Che Guevara
19.12.2011, 20:55
Die Variable ist deshalb wieder 100, weil du mit verändern deiner Variable das nicht fest im Programm ablegst. Beim Neustart des µCs beginnt aber das Programm wieder von vorne. Um Variablen dauerhaft verändert abzuspeichern, müsstest du sie im EEProm ablegen.

Gruß
Chris

Ritchie
19.12.2011, 21:21
Hi,

ich habe am Anfang des Programmes fest:

variable = 100; oder Variable = 101; stehen

Das sollte immer korrekt arbeiten, da die Variable programmtecnisch gesetzt wird.

Kampi
19.12.2011, 21:26
Poste doch mal bitte dein Programm damit man mal gucken kann wo der Fehler ist

Ritchie
20.12.2011, 11:44
Hi,

kann ich heute abend gerne machen. Ist aber was größer ...

Eine mögliche Variante für mich wäre die Tatsache, das ich alle Variablen in einer Datei (variablen.c) deklariert habe und die jeweils verwendete Variable in der entsprechenden Datei als "extern" deklariert habe.

Variablen, welche in Interruptroutinen behandelt werden, sind mit "volatile" deklariert. Das habe ich auch nochmals geprüft.

Das Auslesen der besagten Variable erfolgt via I2C- SLAVE im Interruptverfahren. Änderungen der Variable erfolgen aber nicht zu diesem Zeitpunkt (erst später). Hierbei wird diese variable per I2C geändert.

Aber wieso sollte das nach einem Neustart anders sein, wenn ich



main()
{
Variable = 100;

while(true)
{
...
}
}


schreibe. In der While() Schleife wird nur lesend auf diese variable zugegriffen. Der Interrupt Händer des Slaves wäre noch eine Variante. (Aber wieso erst nach einem Neustart und nicht immer ????)

Gruss R.

Ritchie
20.12.2011, 16:41
So, anbei die beiden entsprechenden Dateien (fürs erste).

In der Interruptroutine wäre die einzige Möglichkeit, wo schreiben auf diese variablen zugegriffen wird.

Diese Variable ist am Anfang mit 101 gesetzt


extern unsigned char m_TargetSpeedLeft; // Speed to drive for the left wheel
extern unsigned char m_TargetSpeedRight; // Speed to drive for the right wheel


Wenn ich das Programm neu lade und die Variablen direkt über I2C Bus abfrage, haben sie den Wert 101.

Nachdem ich das Gerät ausgeschaltet habe und nochmals einschalte, stehen in diesen Variablen wieder 100.



typedef struct _Coordiante
{
unsigned int x,y; // Coordinate position
} Coordiante;


extern volatile Coordiante m_StartPosition;
extern volatile Coordiante m_EndPosition;
extern volatile Coordiante m_ActualPosition;


Mit diesen Variablen habe ich einen ähnlichen Fehler. Hier sind die Positionsangaben plötzlich falsch, obwohl diese nur am Programmstart gesetzt werden. Werte von 10 springen plötzlich auf 314...

Ich habe nochmals alle Vergleiche geprüft, ob ich den "klassischen Fehler" "=" statt "==" verwendet habe, konnte aber keinen Fehler finden.

Die einzige Routine, wo ich mit Pointer arbeite ist in der Interruptroutine des TWI Slaves.

Da ich die Variable ja über TWI einlese, könnte der Fehler hier sein, nur kann ich dort keinen Fehler sehen (nicht mehr sehen).

Gruss R.

Ritchie
21.12.2011, 16:46
Hallo Zusammen,

ich habe meinen Fehler/Problem immer noch nicht gefunden.

Im I2C Bus Treiber war noch ein Fehler, welcher aber keine Auswirkung hierauf haben könnte.


if(m_NumberOfBytesToSend > 0)
{
if( m_buffer_adr != NULL ) // Do we have a valid pointer
{
*m_buffer_adr=data; // Store the data into the buffer
m_buffer_adr++; // Incr. Buffer address for the next byte
}
m_NumberOfBytesToSend--; // dec. counter of byte to send/recive
if(m_NumberOfBytesToSend > 0)
{
TWCR_ACK; // we still have to receive bytes
}
else
{
TWCR_NACK; // we have all bytes received
}
}
else
{
TWCR_NACK; // We have a Problem. All was send before
}

Diese Zeile fehlte. Hier würde der Treiber keine Antwort senden und das Protokoll würde Fehl laufen.


else
{
TWCR_NACK; // We have a Problem. All was send before
}


Hat jemand noch eine Idee ?

Edit:
Auf dem Hauptrechner des Roby lief noch ein Hintergrund Task, welche ein Kommando einmalig an den Controller gesendet hat.
Dumm, ich weiss.

Gruss

R.