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
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.
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).
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.
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)
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.