mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik at91sam reset probleme watchdog?


Autor: Matze Müller (Firma: Student Informatik) (maze)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo ich habe kein Beitrag gefunden der mir weiterhilft,
ich habe unter iar ew ein Programm  entwickelt. Das im debug Modus 
funktioniert, aber wenn ich mein board flash und es danach resete 
startet das Programm alle ca 20sek neu?????
Weiß jemand was das auf sich hat ??
Ist vielleicht der watchdog daran schult?
Wie kann ich mein Programm auf meinen AT91sam7s-ek Läufen lassen ohne 
das ich es Debugge??

nur zur info meine main sieht so aus
int main()
{
  int tmp=0;
  
    BRD_LEDInit(false);
    BRD_LEDSetOn(LED_MASK);
    
    for(int y=0;y<32700;y++){ //Zum testen ob ein neustart gemacht wird
      for(int x=0;x<700;x++){  
          tmp++;
      }
    }
    BRD_LEDSetOff(LED_MASK);
    
    AT91F_RSTSetMode(AT91C_BASE_RSTC,AT91C_RSTC_URSTEN);

    
    USBInit();
    PWM_init();
    
    // Main loop
    while (1);
}
sollte ich in meine main den watchdog ausschalten , wenn es daran liegt?
Ein reset per user button press habe ich ja schon initialisiert.
da brauche ich nichts weiter.

ich komm nicht drauf:(

Autor: gerhard (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo,
ich würde mal vermuten, dass der watchdog aktiv ist.
schau mal in die funktion AT91F_LowLevelInit() dort wird der watchdog in 
der regel initialisiert.

gruss
gerhard

Autor: Matze Müller (Firma: Student Informatik) (maze)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo leider finde ich diese Funkion nicht woher kommt sie? und was 
bewirt sie?

Autor: gerhard (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo,
die funktion findest du in den iar examples normalerweise im modul 
Cstartup_SAM7.c.
die funktion wird vom startup-code (modul: Cstartup.s) aufgerufen und 
erledigt die erste initialisierung der internen hardware (takterzeugung 
und pll, ...).

p.s. falls das nichts hilft dann wäre es sinnvoll mal dein komplettes 
projekt hier zu posten.


gruss
gerhard

Autor: Matze Müller (Firma: Student Informatik) (maze)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die Antwort und ich habe zwar eine startup-code (modul: 
Cstartup.s)
aber ich weiß nicht wie ich sie ändern muss um den watchdog abzustellen 
!!
vielleicht kann mir jemand zeigen wo hier ist erstmal meine startup-code 
(modul: Cstartup.s)

;-----------------------------------------------------------------------------
; This file contains the startup code used by the ICCARM C compiler.
;
; The modules in this file are included in the libraries, and may be replaced
; by any user-defined modules that define the PUBLIC symbol _program_start or
; a user defined start symbol.
; To override the cstartup defined in the library, simply add your modified
; version to the workbench project.
;
; All code in the modules (except ?RESET) will be placed in the ICODE segment.
;
; $Revision: 1.1.2.1 $
;
;-----------------------------------------------------------------------------

;
; Naming covention of labels in this file:
;
;  ?xxx   - External labels only accessed from assembler.
;  __xxx  - External labels accessed from or defined in C.
;  xxx    - Labels local to one module (note: this file contains
;           several modules).
;  main   - The starting point of the user program.
;
;---------------------------------------------------------------
; Macros and definitions for the whole file
;---------------------------------------------------------------
;------------------------------------------------------------------------------
;       Includes
;------------------------------------------------------------------------------
        INCLUDE config.h


    #if  AT91SAM7S256
        INCLUDE AT91SAM7S256_inc.h
    #endif


;-------------------------------------------------------------------------------
;       Constants
;-------------------------------------------------------------------------------
; Mode, correspords to bits 0-5 in CPSR
MODE_BITS DEFINE  0x1F    ; Bit mask for mode bits in CPSR
USR_MODE  DEFINE  0x10    ; User mode
FIQ_MODE  DEFINE  0x11    ; Fast Interrupt Request mode
IRQ_MODE  DEFINE  0x12    ; Interrupt Request mode
SVC_MODE  DEFINE  0x13    ; Supervisor mode
ABT_MODE  DEFINE  0x17    ; Abort mode
UND_MODE  DEFINE  0x1B    ; Undefined Instruction mode
SYS_MODE  DEFINE  0x1F    ; System mode

;-- Status register bits
I_BIT     DEFINE  0x80
F_BIT     DEFINE  0x40

;---------------------------------------------------------------
; ?RESET
; Reset Vector.
; Normally, segment INTVEC is linked at address 0.
; For debugging purposes, INTVEC may be placed at other
; addresses.
; A debugger that honors the entry point will start the
; program in a normal way even if INTVEC is not at address 0.
;---------------------------------------------------------------
    MODULE  ?RESET
#ifdef AT91SAM9261
    RSEG    PROGRAM_END
#endif // AT91SAM9261
    COMMON  INTVEC:CODE:ROOT(2)
    PUBLIC  __program_start
    EXTERN  ?cstartup
    EXTERN  ?irq_handler
    EXTERN  undef_handler, swi_handler, prefetch_handler
    EXTERN  data_handler,  fiq_handler
    CODE32  ; Always ARM mode after reset

    org 0x00
__program_start
    ldr pc,[pc,#24] ; Absolute jump can reach 4 GByte
;     b ?cstartup ; Relative branch allows remap, limited to 32 MByte
                ; Vectors can be enabled by removing the comments below or by
                ; using #pragma vector from C code.

    org 0x04
__undef_handler  
    ldr pc,[pc,#24] ; Branch to undef_handler

    org 0x08
__swi_handler  
    ldr pc,[pc,#24] ; Branch to swi_handler

    org 0x0c
__prefetch_handler
    ldr pc,[pc,#24] ; Branch to prefetch_handler

    org 0x10
__data_handler  
    ldr pc,[pc,#24] ; Branch to data_handler

#ifdef AT91SAM9261
    org  0x14
    DCD (SFE(PROGRAM_END)+1)
#endif // AT91SAM9261

    org 0x18
__irq_handler
    ldr pc,[pc,#24] ; Branch to irq_handler

    org 0x1c
__fiq_handler  
   ldr pc,[pc,#24] ; Branch to fiq_handler
    ; Constant table entries (for ldr pc) will be placed at 0x20
                ; Exception vectors can be specified in C code by #pragma vector or by filling
                ; in the vectors below. The vector address is the ARM vector number + 0x20.
    org 0x20
                dc32  ?cstartup
    org 0x24
                dc32 __undef_handler
    org 0x28
                dc32 __swi_handler
    org 0x2c
                dc32 __prefetch_handler
    org 0x30
                dc32 __data_handler
    org 0x38
                dc32 ?irq_handler
    org 0x3c
                dc32 __fiq_handler
    LTORG
;   ENDMOD  __program_start
                ENDMOD
;---------------------------------------------------------------
; ?CSTARTUP
;---------------------------------------------------------------
    MODULE  ?CSTARTUP

    RSEG  IRQ_STACK:DATA(2)
    RSEG  CSTACK:DATA(2)
    RSEG  ICODE:CODE:NOROOT(2)

    PUBLIC  ?cstartup
    EXTERN  ?main

; Execution starts here.
; After a reset, the mode is ARM, Supervisor, interrupts disabled.

    CODE32
?cstartup

; Add initialization nedded before setup of stackpointers here

; Initialize the stack pointers.
; The pattern below can be used for any of the exception stacks:
; FIQ, IRQ, SVC, ABT, UND, SYS.
; The USR mode uses the same stack as SYS.
; The stack segments must be defined in the linker command file,
; and be declared above.

                mrs     r0,cpsr                             ; Original PSR value
                bic     r0,r0,#MODE_BITS                    ; Clear the mode bits
                orr     r0,r0,#IRQ_MODE                     ; Set IRQ mode bits
                msr     cpsr_c,r0                           ; Change the mode
                ldr     sp,=SFE(IRQ_STACK) & 0xFFFFFFF8     ; End of IRQ_STACK

                bic     r0,r0,#MODE_BITS                    ; Clear the mode bits
                orr     r0,r0,#SYS_MODE                     ; Set System mode bits
                msr     cpsr_c,r0                           ; Change the mode
                ldr     sp,=SFE(CSTACK) & 0xFFFFFFF8        ; End of CSTACK


#ifdef __ARMVFP__
; Enable the VFP coprocessor.
                mov     r0, #0x40000000                 ; Set EN bit in VFP
                fmxr    fpexc, r0                       ; FPEXC, clear others.

; Disable underflow exceptions by setting flush to zero mode.
; For full IEEE 754 underflow compliance this code should be removed
; and the appropriate exception handler installed.
                mov     r0, #0x01000000           ; Set FZ bit in VFP
                fmxr    fpscr, r0                       ; FPSCR, clear others.
#endif

; Add more initialization here


; Continue to ?main for more IAR specific system startup

                ldr     r0,=?main
                bx      r0

                LTORG

                ENDMOD
;---------------------------------------------------------------
; ?IRQ_HANDLER
;---------------------------------------------------------------
    MODULE  ?irq_handler

    RSEG  IRQ_STACK:DATA(2)
    RSEG  CSTACK:DATA(2)
    RSEG  ICODE:CODE:NOROOT(2)

    PUBLIC  ?irq_handler
?irq_handler

;---- Adjust and save return address on the stack
    sub     lr, lr, #4
    stmfd   sp!, {lr}

;---- Save r0 and SPSR on the stack
    mrs     r14, SPSR
    stmfd   sp!, {r0, r14}

;---- Write in the IVR to support Protect mode
;---- No effect in Normal Mode
;---- De-assert NIRQ and clear the source in Protect mode
    ldr     r14, =AT91C_BASE_AIC
    ldr     r0, [r14, #AIC_IVR]
    str     r14, [r14, #AIC_IVR]

;---- Enable nested interrupts and switch to Supervisor mode
    msr     CPSR_c, #SYS_MODE

;---- Save scratch/used registers and LR on the stack
    stmfd   sp!, {r1-r3, r12, r14}

;---- Branch to the routine pointed by AIC_IVR
    mov     r14, pc
    bx      r0

;---- Restore scratch/used registers and LR from the stack
    ldmia   sp!, {r1-r3, r12, r14}

;---- Disable nested interrupts and switch back to IRQ mode
    msr     CPSR_c, #I_BIT | IRQ_MODE

;---- Acknowledge interrupt by writing AIC_EOICR
    ldr     r14, =AT91C_BASE_AIC
    str     r14, [r14, #AIC_EOICR]

;---- Restore SPSR and r0 from the stack
    ldmia   sp!, {r0, r14}
    msr     SPSR_cxsf, r14

;---- Return from interrupt handler
    ldmia   sp!, {pc}^

                LTORG

                ENDMOD
                END



kann mir jemand zeigen was ich ändern muss ich habe nicht soviel 
Erfahrung mit asm:(

Autor: gerhard (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo,
in deinem cstartup.s fehlt tatsächlich der aufruf von 
AT91F_LowLevelInit().
woher kommt den das example?
kannst du mal das komplette projekt in eine zip-datei packen und hier 
als anhang reinstellen?

gruss
gerhard

Autor: Matze Müller (Firma: Student Informatik) (maze)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Beispiel ist ein wenig geändert aber eigentlich das Original aus USB 
Framework (CDC) von Atmel ,
eigentlich funktioniert alles bis auf dieses watchdog Problem , oder was 
immer es sein mag, das den Effekt hat das dass Programm nur im degub 
modus läuft.
ich würde echt gerne wissen wie ich das beheben kann wäre sehr dankbar 
für jede Hilfe.

Autor: gerhard (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
da der watchdog nach einem reset aktiv ist und er offensichtlich nicht 
deaktiviert wird würde ich das mal am anfang von main() machen:
AT91C_BASE_WDTC->WDTC_WDMR = AT91C_WDTC_WDDIS;

hoffe das hilft

gerhard

Autor: Matze Müller (Firma: Student Informatik) (maze)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja danke hat geklappt
Gruß Matze

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.