Forum: Mikrocontroller und Digitale Elektronik Fusebits bei ATmega32(4MHz,JTAG,Debugging)


von PROgrammer (Gast)


Lesenswert?

Hey Leute,
ich verzweifel gleich!!!
Seit Stunden durchkämme ich das Netz nach Antworten: Ich möchte ganz 
einfach mit AVR Studio 4(AVR GCC, WIN AVR) ein ATmega32 programmieren. 
Mein Mikrocontroller läuft mit einem exteren 4 MHz Quarz, wird von 5V 
gespeist und wird über eine JTAG Schnittstelle angesprochen.
Ich hoffe das reicht erstmal an Infos, damit ihr mir helfen könnt. Ach 
und bevor Kommentare kommen ich soll mal ins Datenblatt schauen, hab 
ich, aber da blick ich leider auch nicht ganz durch...

Vermutlich ist es doch so:
OCDEN(On-Chip-Debugging-ENable):True (Wobei hier bei bin ich mir gar 
nicht mehr sicher im Datenblatt stand, dass das nicht enabled werden 
soll wenn JTAGEN enabeled ist!)
JTAGEN(JTAG-ENable): True
SPIEN(SPI-ENable): Egal ich sag jetzt mal -> True
EESAVE(EEprom-SAVE): ?!? war von vorne rein -> False
BOOTSZ(BOOT-SiZe): ?!? war von vorne rein -> "Boot Flash Size = 1024 
words start address = $1C00
BOOTRST(BOOT-ReSeT): ?!? war von vorne rein -> True
CKOPT(ClocK-OPTion): ?!? hab ich so aus dem Datenblatt -> True
BODLEVEL(?): ?!? war von vorne rein -> Brown-out detection at VCC = 2.7V
BODEN(?-ENable): ?!? war von vorne rein -> False
SUT_CKSEL(?):Ext. Crystal/Resonator Medium Freq.;Start-up time: 16K CK + 
64ms


Danke, schon mal und ich freu mich schon auf Antworten...

Gruß Justus

von Georg G. (df2au)


Lesenswert?

PROgrammer schrieb:
> OCDEN(On-Chip-Debugging-ENable):True (Wobei hier bei bin ich mir gar
> nicht mehr sicher im Datenblatt stand, dass das nicht enabled werden
> soll wenn JTAGEN enabeled ist!)
Du hast offenbar ein anderes Datenblatt als ich. Wenn du JTAG nicht nur 
zum Programmieren sondern auch zum Debuggen nutzen willst, muss es True 
sein.

> JTAGEN(JTAG-ENable): True
OK, du willst es nutzen.

> SPIEN(SPI-ENable): Egal ich sag jetzt mal -> True
Kann nicht schaden.

> EESAVE(EEprom-SAVE): ?!? war von vorne rein -> False
OK.

> BOOTSZ(BOOT-SiZe): ?!? war von vorne rein -> "Boot Flash Size = 1024
> words start address = $1C00
Egal.
> BOOTRST(BOOT-ReSeT): ?!? war von vorne rein -> True
Nutzt du einen Bootlader? Nein? Dann False.

> CKOPT(ClocK-OPTion): ?!? hab ich so aus dem Datenblatt -> True
OK.

> BODLEVEL(?): ?!? war von vorne rein -> Brown-out detection at VCC = 2.7V
Bei 5V Betriebsspannung wäre ein höherer Wert sinnvoller.

> BODEN(?-ENable): ?!? war von vorne rein -> False
In der späteren Serie sollte man das schon nutzen.

> SUT_CKSEL(?):Ext. Crystal/Resonator Medium Freq.;Start-up time: 16K CK +
> 64ms
OK.

von PROgrammer (Gast)


Lesenswert?

Vielen Dank!
Ich kann es zwar erst nachher testen aber trotzdem schon mal danke. Hört 
sich plausibel an...

Zwei Fragen hab ich dennoch:
-Brauch ich denn ein Bootloader bzw. wo kann ich den abstellen?
-Was meinst du mit Serie? Meinst du, wenn ich mal mehrere davon 
produzieren möchte

von PROgrammer (Gast)


Lesenswert?

Leider kann ich mein Mikrocontoller immer noch nicht debuggen(Hält nicht 
an Breakpoint, Zeigt mir bei Pause nicht an wo er ist und Variablen kann 
ich mir im )... Es läuft zwar das Programm und ich erhalte an den 
Ausgängen das richtige Ergebnis aber das war auch schon vorher so

Woran könnte das liegen?(Ich seh nur noch eine Fehlermöglichkeit, denn 
ich weiß nicht was das bringt ;-): Das ELF-File)

Ich hoffe ihr könnt mir hilfreiche Tipps geben.

Ach ich glaub zwar nicht aber hier ist mein Code:

//Testdatei
 //Includes
  #include<avr/io.h>
 //Variablen
  int zaehler;
 //Konstanten
 //Funktionen
  void Init(void){
   //Ports
   DDRA |= 
(1<<PA0)|(1<<PA1)|(1<<PA2)|(1<<PA3)|(1<<PA4)|(1<<PA5)|(1<<PA6)|(1<<PA7);
   PORTA |= 
(1<<PA0)|(1<<PA1)|(1<<PA2)|(1<<PA3)|(1<<PA4)|(1<<PA5)|(1<<PA6)|(1<<PA7);

   DDRB &= 
(1<<PB0)|(1<<PB1)|(1<<PB2)|(1<<PB3)|(1<<PB4)|(1<<PB5)|(1<<PB6)|(1<<PB7);
   PORTB |= 
(1<<PB0)|(1<<PB1)|(1<<PB2)|(1<<PB3)|(1<<PB4)|(1<<PB5)|(1<<PB6)|(1<<PB7);

   DDRC &= 
~((1<<PC0)|(1<<PC1)|(1<<PC2)|(1<<PC3)|(1<<PC4)|(1<<PC5)|(1<<PC6)|(1<<PC7 
));
   PORTC |= 
(1<<PC0)|(1<<PC1)|(1<<PC2)|(1<<PC3)|(1<<PC4)|(1<<PC5)|(1<<PC6)|(1<<PC7);

   DDRD |= 
(1<<PD0)|(1<<PD1)|(1<<PD2)|(1<<PD3)|(1<<PD4)|(1<<PD5)|(1<<PD6)|(1<<PD7);
   PORTD |= 
(1<<PD0)|(1<<PD1)|(1<<PD2)|(1<<PD3)|(1<<PD4)|(1<<PD5)|(1<<PD6)|(1<<PD7);
  }
 //Main
  int main (void){
   Init();
   zaehler = 0;
   while(1){
    switch(zaehler){
     case 0:
      zaehler = 1;
      PORTA |= 
(1<<PA1)|(1<<PA2)|(1<<PA3)|(1<<PA4)|(1<<PA5)|(1<<PA6)|(1<<PA7);
      PORTA &= ~(1<<PA0);
     case 1:
      zaehler = 0;
      PORTA |= 
(1<<PA0)|(1<<PA1)|(1<<PA2)|(1<<PA3)|(1<<PA4)|(1<<PA5)|(1<<PA6)|(1<<PA7);

    }
   }
   return 0;
  }

von Georg G. (df2au)


Lesenswert?

PROgrammer schrieb:
> -Brauch ich denn ein Bootloader bzw. wo kann ich den abstellen?
Ob du ihn brauchst, weiß ich nicht. Man nimmt ihn gern für Geräte, an 
die man im Einsatz schlecht heran kommt, um sie dann aus der Ferne neu 
programmieren zu können. Das ist aber nicht ganz simpel.
Die Fuse "BOOTRST" stellt ihn an oder ab, siehe Datenblatt.

> -Was meinst du mit Serie? Meinst du, wenn ich mal mehrere davon
> produzieren möchte
Für den Basteltisch muss man nicht so pingelig sein, für 1000 verkaufte 
Geräte schon eher. Obwohl es nicht schadet, grundsätzlich und immer so 
zu arbeiten, als ob das Leben davon abhängen würde. "Defensives 
Programmieren" ist so ein Schlagwort.

von PROgrammer (Gast)


Lesenswert?

Danke für die Erklärung

Leider hab ich mich vorhin zweierlei getäuscht:
-Ich hatte doch ein Fehler in meinem Code: Die "break;" fehlten in den 
Cases -Und leider hab ich von meinem Ozilloskop falsch abgelesen, die 
Werte an den Pins stimmten überhaupt nicht

Ich hab dann noch den IC aus meiner Platine genommen und einfach mal so 
debuggt und siehe da, wenn ich Pause drücke, wird mir zumindest schon 
ein Pfeil angezeigt, wo ich gerade bin... Komischer Weise bleibt er 
immer im Case 1 stecken?!?

Die Breakpoint überspringt er immernoch und die Variablen kann ich auch 
noch nicht auslesen!

In der Message Box steht immer "JTAGICE mkII: IDR event 0xff." Ist das 
eigentlich richtig oder steht da sogesagt ich starte dein Programm neu?

Ich komm nicht mehr weiter...

von Georg G. (df2au)


Lesenswert?

Leider habe ich mit JTAG auch keine Erfahrung und kann dir nicht weiter 
helfen.

Aber wie so oft ist Dr. Gurgel eine gute Wahl. Er kennt einige Hundert 
Einträge zu dem Thema.

Ansonsten der übliche Spruch... RTFM.
http://support.atmel.com/bin/customer.exe?=&action=viewKbEntry&id=397

von PROgrammer (Gast)


Lesenswert?

Danke ich habe letztendlich ein Kurzschluss zwischen dem Reset-Pin und 
Masse gefunden und dann klappt jetzt alles.
Ich habe jetzt aber schon wieder ein neues Problem: Ich habe das schon 
in den Thread "Software 
UART"(Beitrag "Re: Software UART") gepostet, aber 
da ich diesen Thread durch suchen und in den neusten Beiträg in diesem 
Forum nicht finden kann, mach ich hier nochmal darauf aufmerksam(ohne 
ein ganz neues Thema dafür zuerstellen).

DANKE und genießt die warmen Tage... Ich hoffe die Unwetter ziehen 
schnell vorbei!

Justus

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.