Forum: Compiler & IDEs Debugger springt in's Nirvana


von Michael Z. (zellm)


Lesenswert?

Hallo,

Ich bin dabei einen kleinen Zeitgeber zu Programmieren.
Als Basis dient ein Atmega8, der mithilfe von AVR-Studio4 und GCC 
Compiler in C Programmiert werden soll.

Leider klappt das (wie erwartet ;-) nicht auf anhieb...

Wenn ich folgende Codezeilen im Debugger laufen lasse springt er einfach 
ins Nirvana... (der "Step into" Button ist nit mehr anwählbar)
1
 
2
#include <avr/io.h>
3
volatile uint8_t start = 0;
4
int main() {
5
  DDRC &= ~   ((1<<PC0) | (1<<PC1) | (1<<PC2) | (1<<PC3));
6
  while (1) {
7
    if (PINC0 == 1) {
8
      start = 1;
9
    }
10
  }
11
}
Nochmal im Detail:
Ich starte das debuggen. --> Pfeil auf Int main...
Klicke auf Step into --> Pfeil auf DDRC...
Klicke auf Step into --> Pfeil verschwunden, "Step into" Button 
ausgegraut.

Falls jemand eine Idee hat oder eine Anmerkung loswerden will...

Ich bin für jede Hilfe dankbar.

Gruß DaZeller

von Peter (Gast)


Lesenswert?

zeigt doch mal den erzeugten ASM-Code, da sieht man was der Optimierer 
draus gemacht hat.

von Stefan E. (sternst)


Lesenswert?

1
  while (1) {
2
    if (PINC0 == 1) {
3
      start = 1;
4
    }
5
  }
Daraus macht der Optimierer ein "while(1){}", weil "PINC0 == 1" niemals 
wahr sein kann.

von Michael Z. (zellm)


Lesenswert?

Danke für die Schnelle rückmeldung!

Warum kann "PINC0 ==1" nicht wahr sein?

ich stehe leider noch auf dem Schlauch...

von Oliver (Gast)


Lesenswert?

>Warum kann "PINC0 ==1" nicht wahr sein?

a) Weil irgendwo in den AVR-Headern das hier steht:
1
#define PINC0 0

und

b) Weil du das Tutorial nicht gelesen hast.

http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Zugriff_auf_IO-Ports

Oliver

von Michael Z. (zellm)


Lesenswert?

Danke an Oliver.

mit deinem Punkt a kann ich leider nichts anfangen...

Punkt b stimmt auch nicht so ganz...
aber dank deinem Link habe ich die Stelle nochmal genauer gelesen und 
mein Programm jetzt entspechend umgebaut.
1
int main() {
2
  DDRC &= ~ (1<<PC0);
3
  while (1) {
4
    if (PINC & (1<<PINC0)) {
5
      start = 1;
6
    }
7
  }
8
}

das funktioniert nun.

Wenn ich das so richtig verstanden habe kan ich nur den Kompletten Port 
auslesen und dann mit dem entsprechenden Bit verküpft genau dieses 
auslesen...
Mir kommt das zwar etwas mühsehlig vor, aber ich stehe auch noch 
ziemlich am Anfang.

Danke für eure Hilfe!

von Stefan E. (sternst)


Lesenswert?

Michael Zeller schrieb:

> mit deinem Punkt a kann ich leider nichts anfangen...

PINC0 ist nur ein symbolischer Name für die Zahl 0.
"PINC0 == 1" ist damit exakt identisch zu "0 == 1".

> Wenn ich das so richtig verstanden habe kan ich nur den Kompletten Port
> auslesen und dann mit dem entsprechenden Bit verküpft genau dieses
> auslesen...

Ja.

von Michael Z. (zellm)


Angehängte Dateien:

Lesenswert?

ein Weiteres Problem:

Auf dem angehängten bild ist mein Debugger zu sehen.

Der Pfel stand zuletzt auf dem roten Brakpoint und ist nach einmaliger 
betätigung von "Step into" auf die zu sehende Position gesprungen.

ich kann mir das nicht erklären.

Auserdem nicht nachfolziehbar ist für mich, warum überhaupt die Position 
des Brakepoint angesprungen wurde, da ja keine 1 an PINC0...

Vorab schon vielen dank für alle Rückmaldungen.

von Oliver (Gast)


Lesenswert?

Wie ja schon weiter oben erwähnt wurde, hast du vermutlich mit 
Optimierung kompiliert. Da passen dann Sourcecode und Assemblerprogramm 
nicht mehr 1:1 zusammen, mit eben solchen Effekten. Schalte mal in den 
Projektoptionen die Optimierung aus, dann klappts auch mit dem Debugger.

Oliver

von Michael Z. (zellm)


Lesenswert?

OK, inzwischen läuft es einigermasen.

Mein Hauptfehler lag wohl tatsächlich in der mangelnden Aufmerksamkeit 
beim lesen. :-(

Ich bedanke mich bei allen für die guten Hinweise und Tipps.

Gruß DaZeller

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.