Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[at91sam7s256][gcc] przerwanie z timera

majster256 04 Wrz 2008 11:36 3612 30
  • #1 04 Wrz 2008 11:36
    majster256
    Poziom 21  

    witam

    przegrzebałem już pół internetu i nie mogę znaleźć odpowiedzi dlaczego nie działa mi przerwanie z timera, programuje w eclipse

    timer inicjuję tak:

    Code:
    //--------------------------------------------------
    
    void TIMER0_Init(int czas_us)                  //Aktywacja Timera próbkującego
    {       
       unsigned int val, dummy;
       
       pPITC->PITC_PIMR = ~(   AT91C_PITC_PITEN |         //
                         AT91C_PITC_PITIEN);         //
       
       PIT_SysTime = 0;                           //zmienne globalne
       PIT_Configured_Time_us = czas_us;               // zmienne globalne
       dummy = pPITC->PITC_PIVR;                     //wyzerowanie rejestru
       AIC_Configure_IRQ(   AT91C_BASE_PITC,
             (AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL | AT91C_AIC_PRIOR_HIGHEST));
       
       val = ((czas_us * ((fMCK_HZ/16)/1000)/1000));
       pPITC->PITC_PIMR =    (val |                     //
                      AT91C_PITC_PITEN |            //
                      AT91C_PITC_PITIEN);            //   
       
    }


    a wcześniej:
    Code:
    volatile unsigned int PIT_SysTime;                  //czas systemowy w jednstkach ts
    
    unsigned int PIT_Configured_Time_us;               // us
    unsigned long fMCK_HZ = 48000000;

    volatile AT91PS_PITC pPITC = AT91C_BASE_PITC;


    jeśli czytam rejestr w którym jest obraz wartości licznika to, on tam ciągle coś liczy więc raczej działa:)

    w linii
    Code:
             (AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL | AT91C_AIC_PRIOR_HIGHEST));

    mam uwagę kompilatora i nie mam pojęcia dlaczego:(
    pisze on :
    Code:
    passing argument 1 of 'AIC_Configure_IRQ' makes integer from pointer without a cast



    przerwanie obsługuję następująco:

    Code:

    unsigned int h = 0;
    void przerwanie(void)
    {
       LCDyx(0,0);
       h++;
       LCDvar(h);


    }
    unsigned int AIC_Configure_IRQ(   unsigned int periph_id,               // numer urzadzenia peryferyjnego
                   unsigned int priorytet_i_wyzwalanie)   // wyzwalanie i priorytet
                   //void (*adres_proc_obbslugi)(void))      // adres procedury obslugi
    {
       unsigned int adres_poprzedniej_proc, mask;
       mask = (0x1 << periph_id);
       adres_poprzedniej_proc = AIC->AIC_SVR[periph_id];      // 1 zapamietgaj stary adres
       AIC->AIC_IECR = mask;
       AIC->AIC_SVR[periph_id] = (unsigned int)przerwanie;
       AIC->AIC_SMR[periph_id] = priorytet_i_wyzwalanie;
       AIC->AIC_ICCR = mask;
       AIC->AIC_IECR = mask;
       
       return(adres_poprzedniej_proc);
    }


    ktoś wie co robię nie tak?

    0 29
  • Pomocny post
    #2 05 Wrz 2008 08:08
    piotrkopec
    Poziom 17  

    Komentarze do kodu sam pisałeś?
    Błąd kompilatora: w AIC_Configure_IRQ pierwszy argument to jak napisałeś "numer urządzenia peryferyjnego" a ty podałeś w kodzie wskaźnik do PITC.
    PIT to nie peryferium tylko część kontrolera systemowego i jego przerwanie jest obsługiwane po SYSTEM_ID.
    Poza tym w AIC_Configure_IRQ

    Code:
       AIC->AIC_IECR = mask;// !!! tutaj powinieneś raczej wyłączać przerwanie a nie włączać
    
       AIC->AIC_SVR[periph_id] = (unsigned int)przerwanie;
       AIC->AIC_SMR[periph_id] = priorytet_i_wyzwalanie;
       AIC->AIC_ICCR = mask;
       AIC->AIC_IECR = mask;

    Pozdrawiam
    kac

    0
  • #3 05 Wrz 2008 08:25
    majster256
    Poziom 21  

    kompilator zwraca uwagę a nie błąd i dotyczy on tego argumentu

    Code:
    AT91C_AIC_PRIOR_LOWEST
    jak ustawie najwyższy priorytet to tez zwraca uwagę.

    poprawiłem to z wyłączaniem przerwania.

    całość jest wzorowana na przykładach z ksiażki Jacka Augustyna. tylko ze tam jest to pod keila :cry:

    przerwanie nadal mi nie działa, a co co chodzi z tym SYSTEM_ID?? czyli ja to mam całkowicie źle? jak to poprawić?

    Dodano po 4 [minuty]:

    dodam jeszcze kawałek biblioteki at91sam7s256.h którego dotyczy błąd
    Code:
    // -------- AIC_SMR : (AIC Offset: 0x0) Control Register -------- 
    
    #define AT91C_AIC_PRIOR       ((unsigned int) 0x7 <<  0) // (AIC) Priority Level
    #define    AT91C_AIC_PRIOR_LOWEST               ((unsigned int) 0x0) // (AIC) Lowest priority level
    #define    AT91C_AIC_PRIOR_HIGHEST              ((unsigned int) 0x7) // (AIC) Highest priority level
    #define AT91C_AIC_SRCTYPE     ((unsigned int) 0x3 <<  5) // (AIC) Interrupt Source Type
    #define    AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL       ((unsigned int) 0x0 <<  5) // (AIC) Internal Sources Code Label High-level Sensitive
    #define    AT91C_AIC_SRCTYPE_EXT_LOW_LEVEL        ((unsigned int) 0x0 <<  5) // (AIC) External Sources Code Label Low-level Sensitive
    #define    AT91C_AIC_SRCTYPE_INT_POSITIVE_EDGE    ((unsigned int) 0x1 <<  5) // (AIC) Internal Sources Code Label Positive Edge triggered
    #define    AT91C_AIC_SRCTYPE_EXT_NEGATIVE_EDGE    ((unsigned int) 0x1 <<  5) // (AIC) External Sources Code Label Negative Edge triggered
    #define    AT91C_AIC_SRCTYPE_HIGH_LEVEL           ((unsigned int) 0x2 <<  5) // (AIC) Internal Or External Sources Code Label High-level Sensitive
    #define    AT91C_AIC_SRCTYPE_POSITIVE_EDGE        ((unsigned int) 0x3 <<  5) // (AIC) Internal Or External Sources Code Label Positive Edge triggered

    0
  • #4 05 Wrz 2008 10:57
    piotrkopec
    Poziom 17  

    To że zwraca tylko uwagę a nie błąd to żadna pomoc dla początkującego. Program się skompiluje, ładujemy w procek i dupsko i trzy dni na przeglądanie lutów na nóżkach.

    Cytat:
    passing argument 1 of 'AIC_Configure_IRQ' makes integer from pointer without a cast
    a argumentem 1 podawanym przez Ciebie do AIC_Configure_IRQ jest AT91C_BASE_PITC( pointer) a powinno być AT91C_ID_SYS( integer).
    Nie poprawiaj mnie tylko kod ;)

    0
  • #5 05 Wrz 2008 11:13
    majster256
    Poziom 21  

    hehe coś to zaczyna działać :D ale program jakby się zawieszał myślę, że to wtedy gdy wejdzie do przerwania :cry:

    dodałem już do funkcji przerwania:

    Code:
       AIC->AIC_EOICR = 0;

    0
  • #6 05 Wrz 2008 11:45
    piotrkopec
    Poziom 17  

    dodaj w przerwaniu

    Code:
    volatile unsigned int status_przerwania;
    
    status_przerwania=pPITC->PITC_PIVR;
    wyczyści to bit PITS w PITC_SR. Bez tego nie zostanie wygenerowane kolejne przerwanie. Nie próbuj czyścić ręcznie, PITC_SR jest tylko do odczytu.

    0
  • #7 05 Wrz 2008 11:52
    majster256
    Poziom 21  

    już też to robiłem...

    jak na początku przerwania dam żeby coś wyświetlił na LCD to on tego nie wyświetla... wiec on chyba w ogóle nie wchodzi tylko zawiesza się gdzieś ' po drodze' dobrze mysle? tylko gdzie on się zatrzymuje :(

    0
  • #8 11 Wrz 2008 12:21
    majster256
    Poziom 21  

    witam po przerwie:)

    do funkcji obsługi przerwania muszę dodać:

    Code:

    void przerwanie(void) __attribute__ ((interrupt ("PIT")));

    void przerwanie(void)
    {
    // obsługa przerwania
    }



    ale nadal nie działa :(

    tylko dlaczego :(

    0
  • Pomocny post
    #9 11 Wrz 2008 12:43
    Freddie Chopin
    Specjalista - Mikrokontrolery

    PIT? przeciez gcc nie obsluguje takiego parametru do atrybutu interrupt...

    Cytat:

    interrupt
    Use this attribute on the ARM, AVR, M32R/D and Xstormy16 ports to indicate
    that the specified function is an interrupt handler. The compiler will generate
    function entry and exit sequences suitable for use in an interrupt handler when
    this attribute is present.
    Note, interrupt handlers for the H8/300, H8/300H and SH processors can be
    specified via the interrupt_handler attribute.
    Note, on the AVR, interrupts will be enabled inside the function.
    Note, for the ARM, you can specify the kind of interrupt to be handled by
    adding an optional parameter to the interrupt attribute like this:
    void f () __attribute__ ((interrupt ("IRQ")));
    Permissible values for this parameter are: IRQ, FIQ, SWI, ABORT and UNDEF.


    4\/3!!

    0
  • #10 11 Wrz 2008 12:51
    majster256
    Poziom 21  

    kurcze.. bo skopiowałem to skądś i było co innego, a ze ja używam PIT to pomyślałem ze to tam mam dac... ale popróbowałem wszystko co jest w Twoim cytacie i nigdy nie rusza :cry: jak to odpalić...

    0
  • #11 11 Wrz 2008 13:08
    Freddie Chopin
    Specjalista - Mikrokontrolery

    jaka masz wersje GCC? bo niektore wersje generuja niepoprawny kod obslugi przerwania...

    na pewno musisz to miec zdefiniowane jako __attribute__ ((interrupt("IRQ"))) - innej opcji nie ma.

    4\/3!!

    0
  • #12 11 Wrz 2008 13:37
    majster256
    Poziom 21  

    kurcze przyznam sie ze nie jestem pewny jak to sprawdzić...
    w eclipse mam tak

    Code:
    Eclipse Platform
    

    Version: 3.3.1.1
    Build id: M20071023-1652


    Dodano po 5 [minuty]:

    w pliku version.txt znalazlem takie cos

    Code:


    This build of yagarto use the following versions:

    binutils: 2.18
    gcc:      4.2.2
    newlib:   1.16.0
    gdb:      6.8.50-20080308-cvs

    (08.04.2008, mifi)

    0
  • #13 11 Wrz 2008 13:54
    Freddie Chopin
    Specjalista - Mikrokontrolery

    tak na przyszlosc to wystarczy otworzyc wiersz polecen i wpisac arm-elf-gcc --version

    inne przerwania IRQ ci dzialaja?

    4\/3!!

    0
  • #14 11 Wrz 2008 13:57
    majster256
    Poziom 21  

    nie mam jak sprawdzić, dopiero zaczynam, to pierwsze przerwanie jakie uruchamiam:)

    0
  • #15 11 Wrz 2008 14:21
    Freddie Chopin
    Specjalista - Mikrokontrolery

    aha

    no coz, ja sie tam nie znam na Atmelowych ARMach, ale mozesz pokazac startup'a swojego.

    4\/3!!

    0
  • #16 11 Wrz 2008 14:28
    majster256
    Poziom 21  

    chodzi o makefile?

    Dodano po 2 [minuty]:

    Code:
    #
    
    #       
    #
    ##############################################################################################
    #
    # On command line:
    #
    # make all = Create project
    #
    # make clean = Clean project files.
    #
    # To rebuild project do "make clean" and "make all".
    #

    ##############################################################################################
    # Start of default section
    #

    TRGT = arm-elf-
    CC   = $(TRGT)gcc 
    CP   = $(TRGT)objcopy
    AS   = $(TRGT)gcc -x assembler-with-cpp
    BIN  = $(CP) -O ihex

    MCU  = arm7tdmi

    # List all default C defines here, like -D_DEBUG=1
    DDEFS =

    # List all default ASM defines here, like -D_DEBUG=1
    DADEFS =

    # List all default directories to look for include files here
    DINCDIR =

    # List the default directory to look for the libraries here
    DLIBDIR =

    # List all default libraries here
    DLIBS =

    #
    # End of default section
    ##############################################################################################

    ##############################################################################################
    # Start of user section
    #

    # Define project name here
    PROJECT = test

    # Define linker script file here
    LDSCRIPT_RAM = ./prj/sam7s256_ram.ld
    LDSCRIPT_ROM = ./prj/sam7s256_rom.ld

    # List all user C define here, like -D_DEBUG=1
    UDEFS =

    # Define ASM defines here
    UADEFS =

    # List C source files here
    SRC  = ./src/main.c

    # List ASM source files here
    ASRC = ./src/crt.s

    # List all user directories here
    UINCDIR = ./inc

    # List the user directory to look for the libraries here
    ULIBDIR =

    # List all user libraries here
    ULIBS =

    # Define optimisation level here
    OPT = -O0

    #
    # End of user defines
    ##############################################################################################


    INCDIR  = $(patsubst %,-I%,$(DINCDIR) $(UINCDIR))
    LIBDIR  = $(patsubst %,-L%,$(DLIBDIR) $(ULIBDIR))
    DEFS    = $(DDEFS) $(UDEFS)
    ADEFS   = $(DADEFS) $(UADEFS)
    OBJS    = $(ASRC:.s=.o) $(SRC:.c=.o)
    LIBS    = $(DLIBS) $(ULIBS)
    MCFLAGS = -mcpu=$(MCU)

    ASFLAGS = $(MCFLAGS) -g -gdwarf-2 -Wa,-amhls=$(<:.s=.lst) $(ADEFS)




    CPFLAGS = $(MCFLAGS) $(OPT) -gdwarf-2 -mthumb-interwork -fomit-frame-pointer -Wall -Wstrict-prototypes -fverbose-asm -Wa,-ahlms=$(<:.c=.lst) $(DEFS)
    LDFLAGS_RAM = $(MCFLAGS) -nostartfiles -T$(LDSCRIPT_RAM) -Wl,-Map=$(PROJECT)_ram.map,--cref,--no-warn-mismatch $(LIBDIR)
    LDFLAGS_ROM = $(MCFLAGS) -nostartfiles -T$(LDSCRIPT_ROM) -Wl,-Map=$(PROJECT)_rom.map,--cref,--no-warn-mismatch $(LIBDIR)

    # Generate dependency information
    CPFLAGS += -MD -MP -MF .dep/$(@F).d

    #
    # makefile rules
    #

    all: RAM ROM

    RAM: $(OBJS) $(PROJECT)_ram.elf $(PROJECT)_ram.hex

    ROM: $(OBJS) $(PROJECT)_rom.elf $(PROJECT)_rom.hex

    %o : %c
       $(CC) -c $(CPFLAGS) -I . $(INCDIR) $< -lm -o $@

    %o : %s
       $(AS) -c $(ASFLAGS) $< -lm -o $@

    %ram.elf: $(OBJS)
       $(CC) $(OBJS) $(LDFLAGS_RAM) $(LIBS) -lm -o $@

    %rom.elf: $(OBJS)
       $(CC) $(OBJS) $(LDFLAGS_ROM) $(LIBS) -lm -o $@

    %hex: %elf
       $(BIN) $< $@

    clean:
       -rm -f $(OBJS)
       -rm -f $(PROJECT)_ram.elf
       -rm -f $(PROJECT)_ram.map
       -rm -f $(PROJECT)_ram.hex
       -rm -f $(PROJECT)_rom.elf
       -rm -f $(PROJECT)_rom.map
       -rm -f $(PROJECT)_rom.hex
       -rm -f $(SRC:.c=.c.bak)
       -rm -f $(SRC:.c=.lst)
       -rm -f $(ASRC:.s=.s.bak)
       -rm -f $(ASRC:.s=.lst)
       -rm -fR .dep

    #
    # Include the dependency files, should be the last of the makefile
    #
    -include $(shell mkdir .dep 2>/dev/null) $(wildcard .dep/*)

    # *** EOF ***


    trzeba by jeszcze w nim dopisać żeby przed kompilacja sam sobie zapisywał pliki... ja go skądś skopiowałem.. musiałem w nim trochę pozmieniać żeby używał funkcji bibliotecznych.. bo np nic z math.h nie chciał :cry: ale już działa :D

    0
  • #17 11 Wrz 2008 14:47
    Freddie Chopin
    Specjalista - Mikrokontrolery

    nie, chodzi o rozbiegowke w assemblerze. crt, boot albo startup sie to zwykle zwie.

    4\/3!!

    0
  • #18 11 Wrz 2008 14:55
    majster256
    Poziom 21  

    Code:

    /*
     * Some defines for the program status registers
     */
       ARM_MODE_USER  = 0x10      /* Normal User Mode                             */
       ARM_MODE_FIQ   = 0x11      /* FIQ Fast Interrupts Mode                     */
       ARM_MODE_IRQ   = 0x12      /* IRQ Standard Interrupts Mode                 */
       ARM_MODE_SVC   = 0x13      /* Supervisor Interrupts Mode                   */
       ARM_MODE_ABORT = 0x17      /* Abort Processing memory Faults Mode          */
       ARM_MODE_UNDEF = 0x1B      /* Undefined Instructions Mode                  */
       ARM_MODE_SYS   = 0x1F      /* System Running in Priviledged Operating Mode */
       ARM_MODE_MASK  = 0x1F
       
       I_BIT          = 0x80      /* disable IRQ when I bit is set */
       F_BIT          = 0x40      /* disable IRQ when I bit is set */
       
    /*
     * Register Base Address
     */
       AIC_BASE         = 0xFFFFF000
       AIC_EOICR_OFF    = 0x130
       AIC_IDCR_OFF     = 0x124

       RSTC_MR          = 0xFFFFFD08
       RSTC_KEY         = 0xA5000000
       RSTC_URSTEN      = 0x00000001

       WDT_BASE         = 0xFFFFFD40
       WDT_MR_OFF       = 0x00000004
       WDT_WDDIS        = 0x00008000

       MC_BASE          = 0xFFFFFF00
       MC_FMR_OFF       = 0x00000060
       MC_FWS_1FWS      = 0x00480100
         
       .section .vectors,"ax"
       .code 32
           
    /****************************************************************************/
    /*               Vector table and reset entry                               */
    /****************************************************************************/
    _vectors:
       ldr pc, ResetAddr    /* Reset                 */
       ldr pc, UndefAddr    /* Undefined instruction */
       ldr pc, SWIAddr      /* Software interrupt    */
       ldr pc, PAbortAddr   /* Prefetch abort        */
       ldr pc, DAbortAddr   /* Data abort            */
       ldr pc, ReservedAddr /* Reserved              */
       ldr pc, IRQAddr      /* IRQ interrupt         */
       ldr pc, FIQAddr      /* FIQ interrupt         */


    ResetAddr:     .word ResetHandler
    UndefAddr:     .word UndefHandler
    SWIAddr:       .word SWIHandler
    PAbortAddr:    .word PAbortHandler
    DAbortAddr:    .word DAbortHandler
    ReservedAddr:  .word 0
    IRQAddr:       .word IRQHandler
    FIQAddr:       .word FIQHandler

       .ltorg

       .section .init, "ax"
       .code 32
       
       .global ResetHandler
       .global ExitFunction
       .extern main
    /****************************************************************************/
    /*                           Reset handler                                  */
    /****************************************************************************/
    ResetHandler:
       /*
        * The watchdog is enabled after processor reset. Disable it.
        */
       ldr   r1, =WDT_BASE
       ldr   r0, =WDT_WDDIS
       str   r0, [r1, #WDT_MR_OFF]

       
       /*
        * Enable user reset: assertion length programmed to 1ms
        */
       ldr   r0, =(RSTC_KEY | RSTC_URSTEN | (4 << 8))
       ldr   r1, =RSTC_MR
       str   r0, [r1, #0]

       
       /*
        * Use 2 cycles for flash access.
        */
       ldr   r1, =MC_BASE
       ldr   r0, =MC_FWS_1FWS
       str   r0, [r1, #MC_FMR_OFF]


       /*
        * Disable all interrupts. Useful for debugging w/o target reset.
        */
       ldr   r1, =AIC_BASE
       mvn   r0, #0
       str   r0, [r1, #AIC_EOICR_OFF]
       str   r0, [r1, #AIC_IDCR_OFF]

       
       /*
        * Setup a stack for each mode
        */   
       msr   CPSR_c, #ARM_MODE_UNDEF | I_BIT | F_BIT   /* Undefined Instruction Mode */     
       ldr   sp, =__stack_und_end
       
       msr   CPSR_c, #ARM_MODE_ABORT | I_BIT | F_BIT   /* Abort Mode */
       ldr   sp, =__stack_abt_end
       
       msr   CPSR_c, #ARM_MODE_FIQ | I_BIT | F_BIT     /* FIQ Mode */   
       ldr   sp, =__stack_fiq_end
       
       msr   CPSR_c, #ARM_MODE_IRQ | I_BIT | F_BIT     /* IRQ Mode */   
       ldr   sp, =__stack_irq_end
       
       msr   CPSR_c, #ARM_MODE_SVC | I_BIT | F_BIT     /* Supervisor Mode */
       ldr   sp, =__stack_svc_end


       /*
        * Clear .bss section
        */
       ldr   r1, =__bss_start
       ldr   r2, =__bss_end
       ldr   r3, =0
    bss_clear_loop:
       cmp   r1, r2
       strne r3, [r1], #+4
       bne   bss_clear_loop
       
       
       /*
        * Jump to main
        */
       mrs   r0, cpsr
       bic   r0, r0, #I_BIT | F_BIT     /* Enable FIQ and IRQ interrupt */
       msr   cpsr, r0
       
       mov   r0, #0 /* No arguments */
       mov   r1, #0 /* No arguments */
       ldr   r2, =main
       mov   lr, pc
       bx    r2     /* And jump... */
                           
    ExitFunction:
       nop
       nop
       nop
       b ExitFunction   
       

    /****************************************************************************/
    /*                         Default interrupt handler                        */
    /****************************************************************************/

    UndefHandler:
       b UndefHandler
       
    SWIHandler:
       b SWIHandler

    PAbortHandler:
       b PAbortHandler

    DAbortHandler:
       b DAbortHandler
       
    IRQHandler:
       b IRQHandler
       
    FIQHandler:
       b FIQHandler
       
       .weak ExitFunction
       .weak UndefHandler, PAbortHandler, DAbortHandler
       .weak IRQHandler, FIQHandler

       .ltorg
    /*** EOF ***/   
     



    Dodano po 2 [minuty]:

    plik się nazywał crt.s

    0
  • #19 11 Wrz 2008 15:03
    Freddie Chopin
    Specjalista - Mikrokontrolery

    no i wszystko jasne. twoj startup nie ma ustawionej obslugi tego Atmelowego AIC'a i po przerwaniu procek ci skacze tutaj:

    Code:

    IRQHandler:
       b IRQHandler


    anyway - ten kawalek kodu mozesz wywalic. tak samo wywalic mozesz to:

    IRQAddr: .word IRQHandler

    a linie:

    ldr pc, IRQAddr /* IRQ interrupt */

    zastap:

    ldr pc, [pc,#-0xF20] ; IRQ : read the AIC

    4\/3!!

    0
  • #20 11 Wrz 2008 15:25
    majster256
    Poziom 21  

    Freddie Chopin napisał:

    ldr pc, IRQAddr /* IRQ interrupt */

    zastap:

    ldr pc, [pc,#-0xF20] ; IRQ : read the AIC



    nie da się tego skompilować:( wywala błąd

    mowi

    Code:
    bad instruction `read the AIC'


    Dodano po 9 [minuty]:

    znalazłem na jakiejś niemieckiej stronce opis tego problemu i tam kazali wpisać
    Code:
       ldr pc, [pc, #-0x0FF0]  /* Vector from VicVectAddr */
    


    kompiluje się ale nadal nie działa :cry:

    Dodano po 3 [minuty]:

    nie jestem mistrzem z niemca... ale z tego co rozumie to jest problem z itagiem i przerwaniem... muszę wgrać do flash żeby działało?

    0
  • #21 11 Wrz 2008 15:33
    Freddie Chopin
    Specjalista - Mikrokontrolery

    majster256 napisał:
    Freddie Chopin napisał:

    ldr pc, IRQAddr /* IRQ interrupt */

    zastap:

    ldr pc, [pc,#-0xF20] ; IRQ : read the AIC



    nie da się tego skompilować:( wywala błąd

    mowi

    Code:
    bad instruction `read the AIC'


    OMG czlowieku, czy ty umiesz czytac? przeciez blad ktory zwrocil ci kompilator jest opisany ludzkim jezykiem po angielsku... jeden kompilator ma komentarze od srednika, inny nie... wystarczylo skasowac to co bylo wpisane po sredniku... to co znalazles na niemieckiej stronce to kod do LPC, do niczego ci sie nie przyda, bo w atmelach sa inne adresy...

    bladzisz na slepo,,, wez jakas ksiazke albo datasheeta lepiej.

    4\/3!!

    0
  • #22 11 Wrz 2008 15:41
    majster256
    Poziom 21  

    myślałem ze język C ma swoje komentarze i tyle.. teraz sie zorientowałem ze to były fragmenty ASM którego nie znam... sorki

    możesz mi polecić jakąś ksiązkę? bo ja mam jacka augustyna ale ona jest do kaila

    a program nadal nie działa ....... :cry:

    0
  • #23 11 Wrz 2008 15:46
    Freddie Chopin
    Specjalista - Mikrokontrolery
  • #24 11 Wrz 2008 15:52
    grko
    Poziom 33  

    Jesli chodzi o sama architekture ARM ja duzo sie nauczylem z dokumentu:

    http://www.hitex.com/download.html
    (wchodzisz na Insider's Guides i masz kilka dokumentow).

    Nie ma tam instrukcji do SAM7S ale dokumenty sa bardziej zjadliwe niz datasheet'y. Warto przeczytac moim zdaniem jezeli zaczyna sie z ARM'ami

    0
  • #26 11 Wrz 2008 16:48
    majster256
    Poziom 21  

    tamten plik crt.s to juz w ogole bajka... same błędy...


    no ale po kolei co się dzieje...

    zmieniam

    Code:
       ldr pc, [pc,#-0xF20] // IRQ : read the AIC 


    robie debuggerem i program utyka na:
    Code:
    SWIHandler:
    
       b SWIHandler
      2000e8:   eafffffe    b   2000e8 <SWIHandler>



    dalej
    usuwam:
    Code:
    IRQAddr: .word IRQHandler


    oraz
    Code:
    IRQHandler:
    
       b IRQHandler


    robię debuggerem, i program staje na:


    Code:
    FIQHandler:
    
       b FIQHandler
      2000f0:   eafffffe    b   2000f0 <FIQHandler>


    ale dlaczego skoro przerwanie jest IRQ a nie FIQ?


    i jak tak bede usuwać kolejne wpisy z
    Code:
    /****************************************************************************/
    
    /*                         Default interrupt handler                        */
    /****************************************************************************/

    UndefHandler:
       b UndefHandler
       
    SWIHandler:
       b SWIHandler

    PAbortHandler:
       b PAbortHandler

    DAbortHandler:
       b DAbortHandler
       
    //IRQHandler:
      // b IRQHandler
       
    FIQHandler:
       b FIQHandler


    to zawsze zatrzyma sie na którymś z tych co zostało... a wszystkich skasować nie można bo się nie skompiluje, nie mniej jednak jak zostanie 2 wpis to program utknie w miejscu w którym wystąpiło przerwanie( już nigdzie nie skoczy)

    0
  • #29 16 Paź 2010 11:15
    majster256
    Poziom 21  

    procki atmela mnie tak wnerwiały ze przesiadłem sie na NXP, naprawdę polecam taka zmianę. NXP ma to wszystko jakieś takie logiczne, wytłumaczalne i zrozumiałe, a Atmel jest upierdliwy strasznie

    0
  • #30 16 Paź 2010 11:31
    uz87
    Poziom 11  

    Niestety już mam kupioną płytke uruchmieniową, czy mogłbyś jednak zamieścic te pliki ?

    0