Forum: Mikrocontroller und Digitale Elektronik Variable mit AVR Studio JTAG überwachen


von Daniel (Gast)


Lesenswert?

Nabend,

ich hab grad auf einem Testboard ein Atmega16 über JTAG ans laufen 
bekommen. Allerdings habe ich das Problem, dass AVR Studio mir die 
Variablen (z.B. int) nicht in der Überwachnung anzeigt und dort einfach 
den Breakpoint deaktiviert.

Ich benutze einen JTAG Debugger von:
http://www.keeelectronics.com/catalog/product_info.php?cPath=27&products_id=41

Der Programmer funktioniert und ich kann auch das Program laden und das 
Debuggen starten.
1
int main(void){
2
  int a = 0;
3
  //Endlosschleife
4
  DDRA = 0xFF;
5
  PORTA = 0x00;
6
7
  while(1==1){
8
    _delay_ms(100);
9
    PORTA = 0x00; // X1
10
    _delay_ms(100);
11
    PORTA = 0xFF; // X2
12
    a=a+1; // X3 (disable?!)
13
14
  }
15
16
  return 0;
17
}
X = Breakpoints
Wenn ich jetzt das Debuggen starte, kommt er bei der main an. (Gelber 
Pfeil steht drauf, X3 deaktiviert) Wenn ich nun auf "run" drücke, läuft 
er bis X2. Er überspringt X1. Wenn ich nun das Program weiter ausführe, 
springt er nach X1, und danach immer wieder nach X1 beim weiteren 
ausführen. Überspringt beim 2 bis n-ten durchlauf also X2.

Bei der Variable a in der Überwachnung, sagt er mir Unkown Location oder 
so ähnlich.

Jemand ne Idee wo das Problem ist?

Hab am Controller nur Reset auf 5V, Masse, VCC und das JTAG 
angeschlossen. Der Controller läuft auf 1Mhz und die PINs an PortA 
wechseln wie gewollt.

von Oliver J. (skriptkiddy)


Lesenswert?

Hast du die Compiler-Optimierung ausgeschaltet (-O0)?
Nur so ist sichergestellt, dass auch alle Quelltextzeilen wirklich im 
compilierten Programm berücksichtigt sind.

Das könnte z.B. wegoptimiert worden sein:
1
a=a+1; // X3 (disable?!)

Am besten mal ins Listing schauen, was der Compiler draus gemacht hat.


Gruß Skriptkiddy

von Daniel (Gast)


Lesenswert?

Yeaha, es läuft.
Danke Skript Kiddy.

Der Compiler wurde, wie du vermutet hattest mit dem Parameter für 
Optimierung gestartet. Allerdings hieß das -Os.

Gruß
Daniel

von Daniel (Gast)


Lesenswert?

Huhu, ich bins nochmal.

Ich hab jetzt nochmal ein wenig mit dem Code und der Optimierung 
rumgespielt.
So sieht er jetzt aus:
1
int a = 0;
2
3
4
int main(void){
5
  cli();
6
7
  MCUCR = 0b00000011;
8
  GICR  = 0b11000000;
9
10
  
11
  DDRA = 0xFF;
12
  PORTA = 0xFF;
13
14
  sei();
15
  //Endlosschleife
16
  while(1==1){
17
    if( a == 0)
18
    {
19
      _delay_ms(2000);
20
      PORTA = 0x00;
21
      _delay_ms(2000);
22
      PORTA = 0xFF;
23
    }
24
    else
25
    {
26
      _delay_ms(250);
27
      PORTA = 0x00;
28
      _delay_ms(250);
29
      PORTA = 0xFF;
30
    }
31
32
  }
33
  return 0;
34
}
35
36
ISR(INT0_vect){
37
  if(a==0)
38
  {
39
    a=1;
40
  }
41
  else
42
  {
43
    a=0;
44
  }
45
}

Es soll einfach nur eine LED unterschiedlich schnell in 2 "Modi" 
blinken. Ungerade Anzahl Interrupts = langsam blinken, gerade Anzahl = 
schnell blinken.

Jetzt hab ich folgendes Problem bei der Optimierung: Ohne Optimierung 
ist der Code 40xx Byte groß, mit Optimierung O1 nur knapp 300 Byte. 
Allerdings funktioniert bei der Optimierung O1 der else zweig im 
Hauptprogramm nicht, obwohl er in der InterruptServiceRoutine ankommt 
und a richtig setzt. Oder ich merke nicht das er im else-Zweig ankommt 
weil er was wegoptimiert hat. Dann gibts evtl. nen Problem mit der 
delay.h, weil sich das blinken nicht ändert.

Ohne Optimierung läuft er wie vorhergesehen.

Jemand ne Idee?

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.