PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Simulation mit AVR-Studio funktioniert, in Realität nicht



Gock
27.09.2007, 16:39
Hallo!
Ich habe jetzt zum 2. Mal heute die Erfahrung machen müssen, dass mein Tiny2313 sich in der Realität anders verhält, als AVR-Studio simuliert.
Es geht um folgende Zeilen Code:


//...
struct {
unsigned Timer1CompA:1;
unsigned TWI:1;
} Status_ISR;
//...
void TWITransfer(){
//SLAVEROUTINE FÜR TWI
}
//...
void Timer1_Comp_Match(){
Status_ISR.Timer1CompA=0;
...
return;
}
//...
int main(void){
init();
while(1){
if (Status_ISR.Timer1CompA==1){
Timer1_Comp_Match();
}
// if (Status_ISR.TWI=1){
// TWITransfer();
// }

}
}
Offensichtlich befindet sich ein Fehler in der unteren if Abfrage, weil ich ein Gleichheitszeichen vergessen habe. Dass der Compiler keinen Fehler meldet ist schade, mir aber klar.

Was ich nicht verstehe, ist, dass AVR-Studio diese Zeilen scheinbar anders interpretiert, als der Compiler, denn im Studio läuft alles einwandfrei. Ist das ein Bug vom Studio, der nicht in den "Known Issues" aufgeführt ist oder mache ich hier einen Fehler? Oder kann mir jemand sagen, warum AVR-Studio diese If Abfrage anders interpretiert? Gibt es noch mehr solcher Dinge zu beachten?

Übrigens: das erste Mal heute war es ein leicht anderes Problem: Obwohl ich dachte, alle Variablen werden in C automatisch mit 0 initialisiert, musste ich Status_ISR.Timer1CompA am Anfang 0 setzen. Habe ich das nicht getan, hat der µC mit einer Verzögerung von ca. 5sekunden erst begonnen. Das habe ich mir damit erklärt, dass unentwegt IRQs ausgelöst wurden und der µC quasi nicht vorangekommen ist. Die Simulation hingegen lief problemlos.

Ich programmiere mit AVRISP MKII.

Es ist mir klar, dass der Tiny2313 kein TWI besitzt. Den entsprechenden Vector habe ich auch weggelassen. Die Funktionen heißen so, weil ich auf dem Tiny testen muss, bevor ich auf einen Mega32 gehe.
Schönen Dank schonmal,
Gruß

CsT
28.09.2007, 14:50
Hi Gock,
ich weiß ja nicht, in wie weit sich dein Tiny2313 anders verhält als der Simulator.
Dieses if (Status_ISR.TWI=1){ ist immer wahr. Ich denke mal sowohl im Simulator, als auch auf deinem Tiny?!?
Weiterhin werden nicht alle Variablen in C mit 0 initialisiert. Laut http://www.mikrocontroller.net/topic/78754 läuft das folgendermaßen:


Nur globale und statische Variablen werden bei Programmstart automatisch
mit 0 initialisiert! Lokale Variablen haben keinen definierten
Startwert.

Viele Grüße
CsT

Gock
28.09.2007, 16:36
Ja, dass ich das Gleichheitszeichen vergessen habe, schrieb ich. Mir geht es um die Unterschiede der Simulation zur Realität. Aber mit der Info über die Variableninitialisierung kann ich auch was anfangen, das war mir so nicht klar. Ich befürchte allerdings, dass das nicht der Grund im vorliegenden Fall ist, weil die Variable als struct global definiert wurde. Es sei denn, ein struct bildet eine Ausnahme.
Gruß