Forum: Compiler & IDEs Zwei gleiche Codeschnipsel = volkommen verschiedene Ergebnisse


von cerberus (Gast)


Lesenswert?

Ich sitze jetzt seit 6 Stunden vor diesem Problem und bin langsam am 
verzweifeln
Grundidee war das ein Timer mit 2 Compare-Interrupts 2 Motoren steuern 
kann.
Beide Routinen sind absolut identisch. Inzwischen habe ich sogar einen 
zweiten Timer spendiert, der exakt eingestellt ist, wie der erste.
Motor 1 läuft super / Motor 2 macht, was er will
1
SIGNAL(SIG_OUTPUT_COMPARE1B)
2
{  
3
if(checkbit(az_status,0)) 
4
  {
5
  if(checkbit(az_status,2) && OCR1B < 255) clearbit(PORTA,PA2);
6
  if(checkbit(az_status,3) && OCR1B < 255) clearbit(PORTA,PA3);  
7
  }
8
}
9
10
SIGNAL(SIG_OUTPUT_COMPARE3B)
11
{
12
if(checkbit(ho_status,0)) 
13
  {
14
  if(checkbit(ho_status,2) && OCR3B < 255) clearbit(PORTA,PA4);
15
  if(checkbit(ho_status,3) && OCR3B < 255) clearbit(PORTA,PA5);  
16
  }  
17
}
18
19
SIGNAL(SIG_OUTPUT_COMPARE1A)    
20
{  
21
static char az_sec;
22
if(checkbit(az_status,0)) 
23
  {
24
  if(!checkbit(az_status,7))
25
    {
26
    if (++az_sec % 130 == 0)
27
      {
28
      az_sec = 0;
29
      if(checkbit(az_status,1) && (OCR1B < 255)) OCR1B++;
30
      if(!checkbit(az_status,1) && (OCR1B > 0)) OCR1B--;
31
      }
32
    }
33
  else
34
    {
35
    clearbit(az_status,7);
36
    }        
37
  if(checkbit(az_status,2) && OCR1B > 0) setbit(PORTA,PA2);
38
  if(checkbit(az_status,3) && OCR1B > 0) setbit(PORTA,PA3);
39
  }  
40
}
41
42
SIGNAL(SIG_OUTPUT_COMPARE3A)    
43
{  
44
static char ho_sec;
45
if(checkbit(ho_status,0)) 
46
  {
47
  if(!checkbit(ho_status,7))
48
    {
49
    if (++ho_sec % 130 == 0)
50
      {
51
      ho_sec = 0;
52
      if(checkbit(ho_status,1) && (OCR3B < 255)) OCR3B++;
53
      if(!checkbit(ho_status,1) && (OCR3B > 0)) OCR3B--;
54
      }
55
    }
56
  else
57
    {
58
    clearbit(ho_status,7);
59
    }        
60
  if(checkbit(ho_status,2) && OCR3B > 0) setbit(PORTA,PA4);
61
  if(checkbit(ho_status,3) && OCR3B > 0) setbit(PORTA,PA5);
62
  }  
63
}
64
65
void az_freigabe (void)
66
{
67
setbit(az_status,1);  // Direction-Bit setzen
68
setbit(az_status,0);// PWM - Freigabebit setzen
69
setbit(TIMSK1,OCIE1B);  // interrupt freigeben
70
setbit(TIMSK1,OCIE1A);
71
}
72
73
void ho_freigabe (void)
74
{
75
setbit(ho_status,1);  // Direction-Bit setzen
76
setbit(ho_status,0);// PWM - Freigabebit setzen
77
setbit(TIMSK3,OCIE3B);  // interrupt freigeben
78
setbit(TIMSK3,OCIE3A);
79
}
80
81
und im Main
82
83
if((!checkbit(motorsollbyte,2) && !checkbit(motorsollbyte,3)) || (checkbit(motorsollbyte,2) && checkbit(motorsollbyte,3))) // ho_stop
84
  if(checkbit(ho_status,1))
85
  clearbit(ho_status,1);
86
          
87
          
88
if(checkbit(motorsollbyte,2) && !checkbit(motorsollbyte,3))  //linkslauf
89
  {
90
  if(OCR3B == 0)    // zustand ist stop /Motor anfahren
91
    {
92
    setbit(ho_status,2);    // Port setzen
93
    clearbit(ho_status,3);    // Port setzen
94
    ho_freigabe();
95
    }
96
  else          //Zustand ist nicht stop
97
    {
98
    if(TCNT3 < OCR3B && checkbit(PINA,PA4) && !checkbit(ho_status,1)) // Wenn drehrichtung identisch aber direktion bit falsch / direction bit setzen
99
      setbit(ho_status,1);
100
    if(TCNT3 < OCR3B && checkbit(PINA,PA5) && checkbit(ho_status,1))// wenn Drehrichtung anders herum und direktion bit gesetzt / direction Bit löschen.
101
    clearbit(ho_status,1);
102
    }
103
  }
104
// wie vor, jedoch für Sollbyte 3
105
      
106
if(checkbit(motorsollbyte,3) && !checkbit(motorsollbyte,2))  //rechtslauf
107
  {
108
  if(OCR3B == 0)      // zustand ist stop /Motor anfahren
109
    {
110
    setbit(ho_status,3);    // Port setzen
111
    clearbit(ho_status,2);    // Port setzen
112
    ho_freigabe();
113
    }
114
  else          //Zustand ist nicht stop
115
    {
116
    if(TCNT3 < OCR3B && checkbit(PINA,PA5) && !checkbit(ho_status,1)) // Wenn drehrichtung identisch aber direktion bit falsch / direction bit setzen
117
    setbit(ho_status,1);
118
    if(TCNT3 < OCR3B && checkbit(PINA,PA4) && checkbit(ho_status,1))// wenn Drehrichtung anders herum und direktion bit gesetzt / direction Bit löschen.
119
    clearbit(ho_status,1);
120
    }
121
  }
122
if((!checkbit(motorsollbyte,0) && !checkbit(motorsollbyte,1)) || (checkbit(motorsollbyte,0) && checkbit(motorsollbyte,1))) // az_stop
123
  if(checkbit(az_status,1))
124
  clearbit(az_status,1);
125
          
126
if(checkbit(motorsollbyte,0) && !checkbit(motorsollbyte,1))  //linkslauf
127
  {
128
  if(OCR1B == 0)      // zustand ist stop /Motor anfahren
129
    {
130
    setbit(az_status,2);    // Port setzen
131
    clearbit(az_status,3);    // Port setzen
132
    az_freigabe();
133
    }
134
  else          //Zustand ist nicht stop
135
    {
136
    if(TCNT1 < OCR1B && checkbit(PINA,PA2) && !checkbit(az_status,1)) // Wenn drehrichtung identisch aber direktion bit falsch / direction bit setzen
137
    setbit(az_status,1);
138
    if(TCNT1 < OCR1B && checkbit(PINA,PA3) && checkbit(az_status,1))// wenn Drehrichtung anders herum und direktion bit gesetzt / direction Bit löschen.
139
    clearbit(az_status,1);
140
    }
141
  }
142
// wie vor, jedoch für Sollbyte 1
143
if(checkbit(motorsollbyte,1) && !checkbit(motorsollbyte,0))  //rechtslauf
144
  {
145
  if(OCR1B == 0)      // zustand ist stop /Motor anfahren
146
    {
147
    setbit(az_status,3);    // Port setzen
148
    clearbit(az_status,2);    // Port setzen
149
    az_freigabe();
150
    }
151
  else          //Zustand ist nicht stop
152
    {
153
    if(TCNT1 < OCR1B && checkbit(PINA,PA3) && !checkbit(az_status,1)) // Wenn drehrichtung identisch aber direktion bit falsch / direction bit setzen
154
    setbit(az_status,1);
155
    if(TCNT1 < OCR1B && checkbit(PINA,PA2) && checkbit(az_status,1))// wenn Drehrichtung anders herum und direktion bit gesetzt / direction Bit löschen.
156
    clearbit(az_status,1);
157
    }
158
  }
Während der AZ-Motor tut, wie er soll kann ich den ho-Motor ein mal 
ansprechen fährt er links herum und ich stoppe während des Hochfahrens, 
schaltet er ein. Danach kann ich mit dem Sollbyte machen was ich will, 
interessiert nicht mehr. Az funktioniert weiterhin ungestört. Fahre ich 
ihn  rechts herum an fährt er hoch und stoppt abrupt am Ende der PWM. 
Dabei macht es keinen Unterschied, ob der Timer nun OCR3B ist oder 
OCR1C. In Beiden Fällen die gleiche Grütze.
Nur der Vollständigkeit halber hier noch den Sollbyte-Manipulator
1
else if (strncmp_P(auswertstring,PSTR("east"),4)==0)    {volatile extern unsigned char motorsollbyte;   setbit(motorsollbyte,0); clearbit(motorsollbyte,1); ausgabefehler = 0;}
2
else if (strncmp_P(auswertstring,PSTR("west"),4)==0)    {volatile extern unsigned char motorsollbyte;   setbit(motorsollbyte,1); clearbit(motorsollbyte,0); ausgabefehler = 0;}
3
else if (strncmp_P(auswertstring,PSTR("stop"),4)==0)    {volatile extern unsigned char motorsollbyte;   motorsollbyte = 0x00; ausgabefehler = 0;}
4
else if (strncmp_P(auswertstring,PSTR("up"),2)==0)    {volatile extern unsigned char motorsollbyte;   setbit(motorsollbyte,2); clearbit(motorsollbyte,3);ausgabefehler = 0;}
5
else if (strncmp_P(auswertstring,PSTR("down"),4)==0)   {volatile extern unsigned char motorsollbyte;   setbit(motorsollbyte,3); clearbit(motorsollbyte,2);ausgabefehler = 0;}
Ich bin gerade ausgesprochen ratlos ...

von cerberus (Gast)


Lesenswert?

nach 10 Stunden und nac
h dem ich das Programm nun 5 mal neu geschrieben habe habe ich das 
Problem gefunden.

Das Programm funktioniert wenn die Variable nicht ho_status heißt. 
(jetzt heißt sie ho_statusbyte.
Ich habe zur Sicherheit alle meine Dateien nach dem Eintrag ho_status 
durchsuchen lassen und kann jetzt sagen, dass bei mir keine zweite 
Variable so heißt.

Ich würde mich etwas besser fühlen, wenn ich wüsste warum die Variable 
nicht ho_status heissen darf.

von Peter (Gast)


Lesenswert?

Wie und wo waren/sind die Variabeln deklariert?

von Peter D. (peda)


Lesenswert?

Bei solchen Codeschnipseln gibt es hier immer große Jubelschreie:

Juhu, wir dürfen wieder das große Rätselraten beginnen.

Ooch wie schön, erstmal den unbekannten Compiler rauskriegen, die 
unbekannte MC-Familie und den unbekannten MC-Chip.

Was ist wo und wie deklariert, was ist sonst noch so im Programm.

Ooch wie schön, nen Haufen unbekannter Unterfunktionen und Macros.

Ooch wie schön, der Compiler bricht nach 1000 Errors ab, weil ihm so 
viele wichtige Informationen fehlen.


Nicht so große Rätselfreunde könnten sich daher leicht hinreißen lassen 
zu:
Solche Hellseher-sein-müssen-Postings sind voll forn Ar***.


Peter

von cerberus (Gast)


Lesenswert?

> Juhu, wir dürfen wieder das große Rätselraten beginnen.
> Ooch wie schön, erstmal den unbekannten Compiler rauskriegen,
avr-gcc (GCC) 4.1.2 (WinAVR 20070525) ist meines wissens nicht soo 
unbekannt
> dieunbekannte MC-Familie
Es ist mir neu das Variablennamen aus C-Programmen im Programmspeicher 
der uC Familie abgelegt werden.
> und den unbekannten  MC-Chip.
dito
> Was ist wo und wie deklariert, was ist sonst noch so im Programm.
Nichts was nicht funktionieren würde ...
> Ooch wie schön, nen Haufen unbekannter Unterfunktionen und Macros.
Oh in der Tat! Ganze 3 Makros und die sind auch noch hier aus dem 
Tutorial!
> Ooch wie schön, der Compiler bricht nach 1000 Errors ab, weil ihm so
> viele wichtige Informationen fehlen.
Welche Errors? Wenn ich wenigstens nur ein einziges "warning" hätte gäbe 
es zumindest einen Anhaltspunkt.

> Wie und wo waren/sind die Variabeln deklariert?
volatile unsigned char    als globale Variable im main.c

@Peter Dannegger
Nur für mich zum Verständnis:
Wie bekommt man eigentlich ein, in den uC-Chip ladbares hex-file anhand 
dessen man die Funktion oder Fehlfunktion des Programmes testen kann, 
wenn der Compiler nach nach 1000 Errors abbricht, weil ihm so viele 
wichtige Informationen fehlen?

von Dirk D. (dirkd)


Lesenswert?

> avr-gcc (GCC) 4.1.2 (WinAVR 20070525) ist meines wissens nicht soo
> unbekannt

Davon steht aber in Deinem ersten Posting nichts. Und darum geht es.

> Ganze 3 Makros und die sind auch noch hier aus dem Tutorial!

Dann schreib's dabei. Das Forum wird auch von Leuten genutzt die das 
Tutorial nicht kennen (Welches eigentlich, gibt sicherlich mehrere hier) 
und das nicht sofort sehen.

In dem Controller können auch Fehler sein, die dazu führen, daß Dein 
Interrupt nicht korrekt ausgeführt wird. Kann man natürlich nur 
beurteilen wenn man weiß welchen Controller Du verwendest.

Der Compiler könnte Fehler enthalten. Vielleicht ist WinAVR20070525 kein 
guter Stand.

Alles Gründe warum diese Infos wichtig sein könnten.

Wenn Du das ganze Projekt posten würdest könnte man dem Fehler 
vielleicht finden. Nur mit dem Code-Schnipsel ist es recht 
unwahrscheinlich.

--

    Dirk

von cerberus (Gast)


Lesenswert?

Es ist sogar recht unwahrscheinlich dass jemand den Fehler finden würde, 
wenn ich das ganze Projekt posten würde, denn es läuft auf einem Mega88 
ganz problemlos, obschon ich dort jetzt auch die ho_status-Variable 
sicherheitshalber umbenannt habe, es sei denn er baut auch die komplette 
Hardware nach, was wohl als Hilfestellung unzumutbar ist.
Der Interrupt wird ja korrekt ausgeführt, der Inhalt einer der beiden 
Variablen ist lediglich fehlerhaft, was keinen Sinn macht, wenn beide 
genau gleich bearbeitet werden.
Dabei spielt es keine Rolle ob die Variablen in einem oder in zwei 
unterschiedlichen Interrupts abgearbeitet werden. Es macht aber einen 
Unterschied, ob die Variable ho_status oder ho_statusbyte heißt. Das hat 
einfach nichts mit uC-Familie, uC-Typ noch mit Makros usw zu tun, 
allenfalls könnte es mit dem Compiler zu tun haben.
> Davon steht aber in Deinem ersten Posting nichts. Und darum geht es.
Nein, geht es nicht, es sei denn Herr Dannegger hätte an seinem Post 7 
Stunden und 47 Minuten gearbeitet ...

von Dirk D. (dirkd)


Lesenswert?

> allenfalls könnte es mit dem Compiler zu tun haben.

Und auch den hast Du erst genannt, als sich Peter beschwert hat.

Ich wollte Dich auch nur darauf hinweisen, daß Du einfach zu wenig 
Informationen in Deinem Posting hattest.

Auch wenn natürlich Deine weiteren Postings darauf hindeuten, daß das 
Problem nichts mit der Hardware zu tun hat, ging es Peter wohl auch um's 
Prinzip.


> Es ist sogar recht unwahrscheinlich dass jemand den Fehler finden würde,
> wenn ich das ganze Projekt posten würde [...] es sei denn er baut auch die
> kompletteHardware nach

Du sagst doch selbst, daß Du nicht glaubst, daß die HW schuld ist. Wozu 
also nachbauen?

Mit dem ganzen Projekt könnte man das auch mal durchbauen und Hex und 
ASM-Code der Variante mit ho_status und der mit ho_statusbyte 
vergleichen.

Wenn der Name wirklich einen Unterschied ausmachen soll dann müsste auch 
der ASM-Code bzw. das generierte Bin/Hex-File unterschiedlich sein.

von Peter D. (peda)


Lesenswert?

cerberus wrote:

>> Davon steht aber in Deinem ersten Posting nichts. Und darum geht es.
> Nein, geht es nicht, es sei denn Herr Dannegger hätte an seinem Post 7
> Stunden und 47 Minuten gearbeitet ...

Was meinst Du mit den 7 Stunden und 47 Minuten ?

Daß es überhaupt um einen AVR geht, hast Du erst 3 Tage nach meinem Post 
rausgerückt, im Post vom 15.06.2008 12:31.


Ob Dein Problem mit der Namensgebung zusammenhängt oder mit anderen 
gleichzeitig gemachten Änderungen (auch Compileroptionen), kann man 
nicht beurteilen.
Vielleicht hast Du auch irgendwelche Macros definiert, die gleich 
heißen.
Oder nicht sichtbare Zeichen in den Codezeilen.
Oder ....

Mit dem gesamten Code, der GCC-Version und dem Makefile hätte man das 
aber leicht herausfinden können.


Peter

von Peter D. (peda)


Lesenswert?

cerberus wrote:

> Oh in der Tat! Ganze 3 Makros und die sind auch noch hier aus dem
> Tutorial!

Na aber hallo, gehts Dir noch gut?
Du erwartest also allen Ernstes, daß jeder sämtlichen Code im Forum 
auswendig kennt?

Ich hab den AVR 1997 kennen gelernt, da war hier nichts mit Tutorial.
Ich hab auch nicht die Zeit, dann später etwas zu lesen, worüber ich 
schon längst Bescheid weiß.


> Welche Errors? Wenn ich wenigstens nur ein einziges "warning" hätte gäbe
> es zumindest einen Anhaltspunkt.

Unbekannte Macros erzeugen haufenweise Folgefehler, probiers aus.


> volatile unsigned char    als globale Variable im main.c

Diese Zeile gibt auch nur Compilerfehler.
Ist es denn so schwer, den exakten Quelltext zu posten?


> Wie bekommt man eigentlich ein, in den uC-Chip ladbares hex-file anhand
> dessen man die Funktion oder Fehlfunktion des Programmes testen kann,
> wenn der Compiler nach nach 1000 Errors abbricht, weil ihm so viele
> wichtige Informationen fehlen?

Na eben.
Ich konnte das ja nicht und das war meine Rede.

Daß Du es konntest, weil Du alle fehlenden Informationen hattest, hilft 
mir nicht einen Pups beim Lösen Deines Problems.


Peter

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.