logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

dsPIC 30F4012 MPLAB IDE v8.10 Compilator HITECH 9.60

adamrrr 16 Lis 2010 19:54 2431 2
REKLAMA
  • #1 8752136
    adamrrr
    Poziom 2  
    Posty: 4
    Ocena: 2
    Problem dotyczy:

    mikro-kontroler: dsPIC 30F4012
    Program: MPLAB IDE v8.10
    Compilator: HITECH 9.60
    Debbuger: Microchip MPLAB ICD2

    Napisałem banalny przykładowy program zapętlający palenie i gaszenie diody dla prostego zobrazowania problemu:

    Kod programu:
    
    #include <stdio.h>
    #include <dspic.h>
    
    int z=0; y=0;
    
    void wait (void)
    {
    for(z=0; z<=32000; z++)
     {
    for(y=0; y<=1; y++)
    {}
     }
    }
    
    void main(void)
    { 
    TRISB=0x00;
    while(1)
    {
    RB0=!RB0;
    wait();
    }
    }
    

    Bity konfiguracyjne:
    dsPIC 30F4012 MPLAB IDE v8.10 Compilator HITECH 9.60

    Schemat połączenia układu:

    dsPIC 30F4012 MPLAB IDE v8.10 Compilator HITECH 9.60

    Do Portu RB0 podłączona dioda LED przez 100 ohmowy opornik w celu sprawdzenia poprawności działania układu.

    A teraz problem:
    Po Rebuldzie. W trybie pracy "RUN" na Debugerrze program działa bez zarzutu, przy przełączeniu na programmer i wrzuceniu na uP oraz Verify target device memory i wyjęciu konektora debuggera dioda pali się ciągle.
    Sprawdziłem na nowym mikrokontrolerze i działa identycznie...
    Proszę o pomoc co może być przyczyną i jak to naprawić najlepiej bez zmiany kompilatora. Zależy mi na czasie i nie chcę z tego powodu zmieniać ani kompilatora ani typu mikrokontrolera ponieważ mam cały zmontowany układ, stąd te pytanie.
    Z góry dzięki za pomoc.
  • REKLAMA
  • Pomocny post
    #2 8753515
    gpql
    Poziom 17  
    Posty: 200
    Pomógł: 17
    Ocena: 38
    1. Jak nie korzystasz z przerwań to ustaw GIE=0;

    2. przykładowe ustawienia działające

    #include <dspic30f2010.h>

    /******************************
    * Configuration Bits
    ******************************/
    //_FOSC(CSW_FSCM_OFF & FRC_PLL8); /* Fast RC with PLLx8 = 16MIP Clock Mon/Switch OFF */
    _FOSC(CSW_FSCM_OFF & XT_PLL8); /* 8MHz Crystal with PLLx8 = 16 MIP */
    _FWDT(WDT_OFF); /* Watch dog Timer OFF */
    _FBORPOR(PBOR_OFF & MCLR_EN); /* Brown Out OFF, MCLR Enabled */
    _FGS(CODE_PROT_OFF); /* Code Protect OFF */



    int main(void)
    {


    OSCCON=0x3300; /* Select Primary Oscillator */

    /* Set up I/O Port */
    ADPCFG=0xFFFF; /* Analog ports as Digital I/O */
    TRISB=0x0000; /* Port B output Data as well as serial port */
    LATB=0x0000; /* Initial Value of 0 */

    /* Main Program Loop */
    while(1)
    {
    RB0=!RB0;
    // waitms(500) ; funkcja w odrębnym pliku w google delay.h dla dspic
    //tutaj wait twój
    }

    ponizej plik delay.h dla dspic

    /*
    * Delay functions for HI-TECH C on the dsPIC
    *
    * Functions available:
    * DelayUs(x) Delay x microseconds
    * DelayMs(x) Delay x milliseconds
    *
    * Note that there are range limits:
    *
    * DelayUs(x) 8/XTAL_FREQ <= x <= 65540/XTAL_FREQ
    * (with the default 20 (MHz) XTAL_FREQ, 1 <= x <= 3277)
    *
    * DelayMs(x) 8/(XTAL_FREQ-4) <= n <= 32774/(XTAL_FREQ-4)
    * (with the default 20 (MHz) XTAL_FREQ, 1 <= x <= 2048)
    *
    * 1 <= XTAL_FREQ <= 65540
    *
    * To use these functions it is only necessary to include this file.
    *
    * Set the crystal frequency in MHz on the dsPICC commmand line,
    * e.g.
    * dspicc -DXTAL_FREQ=4
    *
    * or
    * dspicc -DXTAL_FREQ=40
    *
    * Note that this is the crystal frequency; it is divided by 4 to
    * give the CPU clock
    *
    */

    #ifndef __delay_h
    #define __delay_h

    #include <dspic.h>

    #ifndef XTAL_FREQ
    #define XTAL_FREQ 20 /* Crystal frequency, in MHz */
    #endif

    #if XTAL_FREQ < 1 /* actual lower limit is 8.0/499 - see __Dm */
    #error XTAL_FREQ must be no smaller than 1 (MHz)
    #endif
    #if XTAL_FREQ > 32000 /* actual upper limit is 65540 - see __Dm */
    #error XTAL_FREQ must be no greater than 32000 (MHz)
    #endif

    #define __CYCLE_FREQ ((XTAL_FREQ)/4)

    /* n + 2 cycles
    0 <= n <= 16383 */
    #define __DELAY_SHORT(n) do { \
    asm("repeat #" ___mkstr(n)); \
    asm("clrwdt"); \
    } while(0)

    /* n microseconds
    8/XTAL_FREQ <= n <= 65540/XTAL_FREQ */
    #define DelayUs(n) __DELAY_SHORT((n)*__CYCLE_FREQ-2)

    /* The first-stage delay needs to leave time at end of
    n half-milliseconds for loop and other overhead.

    These values determine maximum and minimum values for XTAL_FREQ. */
    #define __Dm 1
    #define __Dn (500-__Dm)

    /* 2 + (n+1)(__Dn*__CYCLE_FREQ + 1) cycles
    0 <= n <= 16383 */
    #define __DELAY_LONG(n) do { \
    asm("do #" ___mkstr(n) ",2"); \
    DelayUs(__Dn); \
    asm("nop"); \
    } while (0)

    /* n milliseconds
    8/(__Dm*XTAL_FREQ-4) <= n <= 32774/(__Dm*XTAL_FREQ-4) */
    #define DelayMs(n) do { \
    __DELAY_LONG((n)*2-1); \
    __DELAY_SHORT((n)*2*(__Dm*__CYCLE_FREQ - 1) - 4); \
    } while (0)

    #endif /* __delay_h */
  • #3 8758417
    adamrrr
    Poziom 2  
    Posty: 4
    Ocena: 2
    Trafiłeś! Co prawda każdy kto na przyszłość będzie miał podobny problem pod Hitech-em będzie musiał zmienić sekcję Configuration Bits czyli albo zakomentować i ustawić bity ręcznie w sekcji Conifguration Bits dostępnej przez MPLAB-a albo programowo zgodnie z manualem kompilatora. Bardzo dziękuję za pomoc.
REKLAMA