mikrocontroller.net

Forum: Compiler & IDEs Debugger springt in's Nirvana


Autor: Michael Z. (zellm)
Datum:

Bewertung
0 lesenswert
nicht 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)
 
#include <avr/io.h>
volatile uint8_t start = 0;
int main() {
  DDRC &= ~   ((1<<PC0) | (1<<PC1) | (1<<PC2) | (1<<PC3));
  while (1) {
    if (PINC0 == 1) {
      start = 1;
    }
  }
} 
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

Autor: Peter (Gast)
Datum:

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

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
  while (1) {
    if (PINC0 == 1) {
      start = 1;
    }
  }
Daraus macht der Optimierer ein "while(1){}", weil "PINC0 == 1" niemals 
wahr sein kann.

Autor: Michael Z. (zellm)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die Schnelle rückmeldung!

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

ich stehe leider noch auf dem Schlauch...

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Warum kann "PINC0 ==1" nicht wahr sein?

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

und

b) Weil du das Tutorial nicht gelesen hast.

http://www.mikrocontroller.net/articles/AVR-GCC-Tu...

Oliver

Autor: Michael Z. (zellm)
Datum:

Bewertung
0 lesenswert
nicht 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.
int main() {
  DDRC &= ~ (1<<PC0);
  while (1) {
    if (PINC & (1<<PINC0)) {
      start = 1;
    }
  }
}

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!

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Michael Z. (zellm)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Michael Z. (zellm)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.