Forum: Compiler & IDEs Komisches Verhalten im Programm


von abcd (Gast)


Lesenswert?

Hallo

kann mir jemand einen Tipp geben wieso bei den Sensor if-Abfragen der 
Debugger if und else-Abfrage überspringt.

Ebenso habe ich das Problem wenn ich im Debugger bei der Taster-Abfrage 
die Pins auf Low stelle bei Taster X+ nur die erste Zeile ausgeführt 
wird und die restliche if-Abfrage übersprungen wird. Danach springt es 
in die Taster-Abfrage X- die richtig ausgeführt wird.

Ein Unterschied ist nur wenn ich PB0 und PB2 auf 1 stelle dann springt 
es ins else.


MfG
1
static volatile bool variable = 0;
2
3
int main(void)
4
{
5
    //Sensor X+        LOW Active
6
    DDRE &= ~(1<<DDE6);
7
    //Sensor X-
8
    DDRE &= ~(1<<DDE7);
9
10
    //Taster X+
11
    DDRB &= ~(1<<DDB0);
12
    //Taster X-
13
 
14
15
    //Motor Clock X        LOW Active
16
    DDRB |= (1<<DDB5);
17
    PORTB |= (1<<PORTB5);
18
  
19
20
    TCCR1B |= (2<<CS10);  //kein prescaler
21
    TIMSK |= (1<<TOIE1);  //overflow interrupt enable
22
23
    sei();
24
25
26
    static bool sensor_x_plus;
27
    static bool sensor_x_minus;
28
29
30
31
    while (1)
32
    {
33
        //Sensor X+
34
        if (~PINE & (1<<PE6))
35
        {
36
            sensor_x_plus = true;
37
        }
38
        else
39
        {
40
            sensor_x_plus = false;
41
        }
42
43
        //Sensor X-
44
        if (~PINE & (1<<PE7))
45
        {
46
            sensor_x_minus = true;
47
        }
48
        else
49
        {
50
            sensor_x_minus = false;
51
        }
52
       
53
54
        //Taster X+
55
        if (~PINB & (1<<PB0)) //&& (sensor_x_plus != true))
56
        {
57
            PORTD |= (1<<PORTD5);  //Motor Direction X
58
59
            if(variable == 0)
60
            {
61
                PORTB &= ~(1<<PB5);
62
                variable = 1;
63
            }
64
            else if (variable == 1)
65
            {
66
                PORTB |= (1<<PB5);
67
                variable = 0;
68
            }
69
            _delay_ms(5);
70
        }
71
        //Taster X-
72
        else if (~PINB & (1<<PB2)) //&& (sensor_x_minus != true))
73
        {
74
            PORTD &= ~(1<<PORTD5);  //Motor Direction X
75
76
            if(variable == 0)
77
            {
78
                PORTB &= ~(1<<PB5);
79
                variable = 1;
80
            }
81
            else if (variable == 1)
82
            {
83
                PORTB |= (1<<PB5);
84
                variable = 0;
85
            }
86
            _delay_ms(5);
87
        }
88
        else
89
        {
90
            PORTB |= (1<<PB5);
91
        }
92
93
        _delay_ms(1);
94
    }
95
}

von Karl H. (kbuchegg)


Lesenswert?

Zum Debuggen ist es für erste nicht schlecht, wenn man den Compiler 
nicht optimieren lässt. Dann stimmen zwar die delay_ms Zeiten nicht 
mehr, da die aber beim Debuggen aber sowieso keinen Sinn haben, kann man 
die zum Debuggen auch ganz eifnach auskommentieren.

Grund: Der Compiler kann, darf und wird dein Programm umbauen, wenn er 
optimieren darf. Das, was dann letzten Endes auf dem µC ausgeführt wird, 
hat mit dem was du geschrieben hast, dem Buchstaben nach nicht mehr viel 
zu tun. Insbesondere existeren deine Zeilen dann so nicht mehr wirklich, 
so dass der Debugger Schwierigkeiten hat, das tatsächlich ausgeführte 
Programm mit deinem Quelltext in Übereinstimmung zu bringen.

von abcd (Gast)


Lesenswert?

Wenn ich die Optimierung auf -O0 stelle erscheint bei mir immer eine 
Ordnersuche wo steht

Please browse to the present location for files originally found at 
c:/avrdev/gcc/gcc-4.3.3/gcc/config

Was bedeutet das?

von abcd (Gast)


Lesenswert?

Wenn PB5 auf 1 gesetzt und der Debugger in die nächste Zeile springt, 
wieso wird PB5 gleich wieder gelöscht.

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.