Forum: Mikrocontroller und Digitale Elektronik AT90CAN32 Fuses und IDR event 0xFF


von Dom (Gast)


Lesenswert?

Hallo Zusammen,

Ich verwende einen Atmel Prozessor AT90CAN32. Ich bin mir nicht ganz 
sicher ob die Fuses korrekt programmiert werden. Ich habe derzeit das 
Hackal bei diesen Fuses gesetzt:

JTAGEN, SPIEN, EESAVE,
BOOTSZ: Boot Flash size = 4096 words start address =$3000
SUT_CKSEL: Ext. Crystal Osc. 8.0-   MHz; Startup time: 258CK + 4.1ms

Nicht gesetzt:
TA0SEL, OCDEN,WDTON,BOOTRST,CKDIV8,CKOUT, BODLEVEL disabled

Verwende einen externen Quarz von 16 MHz.

Ist die Start up time 258CK + 4.1ms richtig eingestellt, bzw. was 
bedeutet das genau?
Ist die Boot Flash size und start address richtig eingestellt?


Außerdem bekomme ich nach gewisser Zeit im Debug Modus einen IDR Event 
0xFF vom JTAG ICE mkII. Deswegen bin ich jetzt auf der Suche nach dem 
Fehler ( Eben auch ob überhaupt alle FUses richtig gesetzt sind). 
Instabile Spannungsversorgung kann ich ausschließen.
Die Taktung während des Debuggens ist 4Mhz ( eingestellt im AVR 
Studio4).

Was Probleme sein könnten, dass es dazu kommt dass das JTAG ICE mkII 
abstürzt:
- Return stack wird überschritten

Nur wie kann ich das überprüfen ob dass der Fehler ist.. Im Programm 
alle calls, pushs usw suchen nachverfolgen? Programm ist leider ziemlich 
groß.
Oder kann ichs auch testen indem ich die return stack configuration im 
compiler vergrößere und dann teste ob es noch zu einem Absturz kommt.

http://support.atmel.com/bin/customer.exe?=&action=viewKbEntry&id=397
In dem Link sind die Problemmöglichkeiten von IDR Event 0xFF 
beschrieben.
Unter anderem:

The return stack problem can be fixed by simply increasing the return 
stack configuration in the compiler. If the problem disappears doing 
this, make sure to read the compiler documenation to understand how to 
calculate sufficient return stack size.

Habe aber keine Ahnung wie ich die return stack configuration vergrößern 
kann?

Bin für Hilfe sehr dankbar! Habe leider sonst keinen den ich hierbei 
fragen könnte.

PS:Wenn ich das Programm ganz normal laufe lasse ohne Debuggen dann 
funktioniert alles wunderbar, zumindest fällt mir kein Fehler auf..


Hier noch ein Code für Interruptvektoren.

.cseg


          ;Beginn eines Code-Segmentes
.org 0x0000          ;Startadresse=0
  rjmp  init

.org 0x0002
  jmp    int0_interrupt

.org 0x0004
  jmp    int1_interrupt

.org 0x0006
  jmp    int2_interrupt

.org 0x0008
  jmp    int3_interrupt

.org 0x000A
  jmp    int4_interrupt

.org 0x000C
  jmp    int5_interrupt

.org 0x000E
  jmp    int6_interrupt

.org 0x0010
  jmp    int7_interrupt

.org 0x0012
  jmp    timer2_compare

.org 0x0014
  jmp    timer2_overflow

.org 0x0016
  jmp    timer1_capture

.org 0x0018
  jmp    timer1_compareA

.org 0x001A
  jmp    timer1_compareB

.org 0x001C
  jmp    timer1_compareC

.org 0x001E
  jmp timer1_overflow      ;INTERRUPT

.org 0x0020
  jmp  timer0_compare

.org 0x0022
  jmp timer0_overflow

.org 0x0024
  jmp CAN_TCOE  ; CAN Transfer Complete or Error

.org 0x0026
  jmp CAN_TIMOVR  ; CAN Timer Overrun

.org 0x0028
  jmp  SPI_STC

.org 0x002A
  jmp  USART0_RX0

.org 0x002C
  jmp  USART0_UDRE

.org 0x002E
  jmp USART0_TX

.org 0x0030
  jmp  ANALOG_COMP

.org 0x0032
  jmp  ADC_Interrupt

.org 0x0034
  jmp  EE_READY_Interrupt

.org 0x0036
  jmp  TIMER3_CAPTURE

.org 0x0038
  jmp  TIMER3_COMPARE_A

.org 0x003A
  jmp  TIMER3_COMPARE_B

.org 0x003C
  jmp  TIMER3_COMPARE_C

.org 0x003E
  jmp  TIMER3_OVERFLOW

.org 0x0040
  jmp  USART1_RX

.org 0x0042
  jmp  USART1_UDRE

.org 0x0044
  jmp  USART1_TX

.org 0x0046
  jmp TWI_Interrupt

.org 0x0048
  jmp  SPM_READY


init:
  //RAM initialisieren

  ldi   temp, HIGH(RAMEND)            ; HIGH-Byte der obersten 
RAM-Adresse
  out   SPH, temp
  ldi   temp, LOW(RAMEND)             ; LOW-Byte der obersten 
RAM-Adresse
  out   SPL, temp

von Rudolph (Gast)


Lesenswert?

Dom schrieb:
> Ist die Start up time 258CK + 4.1ms richtig eingestellt, bzw. was
> bedeutet das genau?

Mit der Startup Zeit ist gemeint das der Controller nach dieser aus dem 
Reset gelassen wird.
Das sollte für Deinen Quarz passen, ein Keramik-Resonator würde zum 
Beispiel schneller stabil schwingen.

> Ist die Boot Flash size und start address richtig eingestellt?

Vielleicht, kommt auf den Bootloader an den Du benutzen willst.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Dom schrieb:
> Habe aber keine Ahnung wie ich die return stack configuration vergrößern
> kann?

Wenn du den GCC benutzt, ist das nicht relevant.  GCC benutzt einen
gemeinsamen (automatischen) Stack für Daten und Returnadressen.  Der
hat standardmäßig immer die maximal mögliche Größe (sprich, den
gesamten freien Speicher oberhalb der statisch zugewiesenen Daten).

Ist deine JTAG-Geschwindigkeit zu hoch?  Sie muss fürs Debuggen kleiner
als 1/4 der CPU-Geschwindigkeit sein.  (Fürs reine Programmieren darf
sie höher sein.)  Wenn man diese Bedingung nicht einhält, habe ich schon
IDR-Events mit 0xFF gesehen (nicht Studio sondern AVaRICE, aber da die
aus der Firmware des JTAGICE geworfen werden, sollte das egal sein).

von Dom (Gast)


Lesenswert?

Jörg Wunsch schrieb:
> Wenn du den GCC benutzt, ist das nicht relevant.

Ich verwende den Atmel AVR Assembler.

Jörg Wunsch schrieb:
> Ist deine JTAG-Geschwindigkeit zu hoch?  Sie muss fürs Debuggen kleiner
> als 1/4 der CPU-Geschwindigkeit sein.

Ich hab die Geschwindigkeit auch schon runter auf 1MHz gesetzt, da ist 
IDR Event 0xFF aber auch gekommen.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Dom schrieb:
> Ich verwende den Atmel AVR Assembler.

Du schreibst aber nicht versehentlich mal irgendwann auf das Register
OCDR?  (Bewusst oder in Folge eines Bugs)

von Dom (Gast)


Lesenswert?

Jörg Wunsch schrieb:
> Du schreibst aber nicht versehentlich mal irgendwann auf das Register
> OCDR?  (Bewusst oder in Folge eines Bugs)


Nein das OCDR schreib ich gar nicht in meinem Code. Hmm.

von Dom (Gast)


Lesenswert?

Ist damit der Stack Pointer richtig initialisiert?

        ldi   temp, HIGH(RAMEND)
  out   SPH, temp
  ldi   temp, LOW(RAMEND)
  out   SPL, temp

Bzw. muss ich noch in die Register SPH, und SPL Werte schreiben? .. Zum 
Beispiel SPL --> 0xFF und SPH --> 0xFF  , damit ich den größten 
verfügbaren Stack habe?

Ich denke nämlich, dass das Problem, warum sich das Debugging Tool nach 
gewisser Zeit aufhängt( IDR Event 0xFF), wegen dem Stack Pointer oder 
Interrupts besteht.

Da es so sporadisch und erst nach längerer Zeit auftritt könnte es ja 
sein, dass eine return oder pop Funktion von einem call oder push im 
Programm fehlt?
Da das Programm sehr groß ist dauert es sehr lange bis ich es komplett 
durchgeschaut habe. Deswegen würd ich erst eure Meinung wissen, ob das 
überhaupt Sinn machen würde.

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.