Poste doch mal bitte dein Programm damit man mal gucken kann wo der Fehler ist
Poste doch mal bitte dein Programm damit man mal gucken kann wo der Fehler ist
Schaut ruhig mal auf meiner Homepage vorbei:
http://kampis-elektroecke.de
Oder folge mir auf Google+:
Daniel Kampert
Es gibt 10 Arten von Menschen. Die einen können Binär, die anderen nicht.
Gruß
Daniel
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
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 ????)Code:main() { Variable = 100; while(true) { ... } }
Gruss R.
Kaum macht man es richtig, schon funktioniert's ...
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
Wenn ich das Programm neu lade und die Variablen direkt über I2C Bus abfrage, haben sie den Wert 101.Code:extern unsigned char m_TargetSpeedLeft; // Speed to drive for the left wheel extern unsigned char m_TargetSpeedRight; // Speed to drive for the right wheel
Nachdem ich das Gerät ausgeschaltet habe und nochmals einschalte, stehen in diesen Variablen wieder 100.
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...Code: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;
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.
Kaum macht man es richtig, schon funktioniert's ...
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.
Diese Zeile fehlte. Hier würde der Treiber keine Antwort senden und das Protokoll würde Fehl laufen.Code: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 }
Hat jemand noch eine Idee ?Code:else { TWCR_NACK; // We have a Problem. All was send before }
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.
Geändert von Ritchie (22.12.2011 um 07:33 Uhr) Grund: Fehler gefunden!
Kaum macht man es richtig, schon funktioniert's ...
Lesezeichen