[C/PIC12F] - Déclaration de variables, en Flash? en RAM?
Répondre à la discussion
Affichage des résultats 1 à 8 sur 8

[C/PIC12F] - Déclaration de variables, en Flash? en RAM?



  1. #1
    jorg1n

    [C/PIC12F] - Déclaration de variables, en Flash? en RAM?


    ------

    Bonjour,

    je suis entrain d'écrire un programme en C (compilateur XC8/Microchip) destiné à être implanté dans un PIC12F1501, et j'arrive plus à déclarer de variables faute de place... J'ai principalement utilisé des variables locales...

    Voici l'état de des mémoires :

    - RAM 683 (0x2AB) bytes / RAM Used: 62 (0x3E) Free: 621 (0x26D)
    - Flash 1024 (0x400) words / Flash Used: 642 (0x282) Free: 382 (0x17E)

    Est-il possible de déclarer certaines variables en RAM afin de libérer un peu de flash? Qu'en sera t'il de l'utilisation de cette variable?

    Merci d'avance pour vos lumières!

    -----

  2. #2
    Seb.26

    Re : [C/PIC12F] - Déclaration de variables, en Flash? en RAM?

    C'est pas un pb de place, tu as de la RAM et de la flash dispo ... tu veux ajouter quoi comme variable ?

    A mon avis, c'est plus un souci de BANK, il faut que tu regarde ton fichier de link.
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  3. #3
    jorg1n

    Re : [C/PIC12F] - Déclaration de variables, en Flash? en RAM?

    Bonjour Seb.26,

    C'est pas un pb de place, tu as de la RAM et de la flash dispo ... tu veux ajouter quoi comme variable ?
    Quand je veux ajouter une variable, quelle soit locale ou globale, j'ai ce message d'erreur:
    error: could not find space (2 bytes) for variable _Testvar2
    Alors que mes espaces mémoires avant l'ajout était :
    RAM Used: 63 (0x3F) Free: 620 (0x26C)
    Flash Used: 684 (0x2AC) Free: 340 (0x154)
    A mon avis, c'est plus un souci de BANK, il faut que tu regarde ton fichier de link.
    Que souhaites tu que je regarde? car je ne met jamais trop le nez dans ce fichier.

    Merci d'avance

  4. #4
    RISC

    Re : [C/PIC12F] - Déclaration de variables, en Flash? en RAM?

    Salut Jorg,

    Quelle version de XC8 utilises-tu ?
    As-tu modifié le fichier linker ou as-tu une fonctionalité de bootloader dans ton projet ?
    Il y a vraiment un problème dans ton projet pour que XC8 ne puisse pas allouer le reste de la RAM....
    Sans voir ton code source ou un exemple qui montre ce message d'erreur difficile de dire d'ou vient le problème...

    a+

  5. A voir en vidéo sur Futura
  6. #5
    jiherve

    Re : [C/PIC12F] - Déclaration de variables, en Flash? en RAM?

    Bonsoir,
    les variables comme leur nom l'indique ne peuvent être en Flash qui est une mémoire non volatile mais reprogrammable avec un nombre d’écriture réduit!
    Je parie pour un problème de stack donc jeter un oeuil sur le résultat de la compilation.
    JR
    l'électronique c'est pas du vaudou!

  7. #6
    jorg1n

    Re : [C/PIC12F] - Déclaration de variables, en Flash? en RAM?

    Bonjour,

    Quelle version de XC8 utilises-tu ?
    J'utilise la version 1.2 de XC8.

    As-tu modifié le fichier linker ou as-tu une fonctionalité de bootloader dans ton projet ?
    Rien de tout ça!

    En ce qui concerne le code, voici les initialisation que je fais dans mon *.c en variables globales:
    unsigned int ResultVinAD = 0;
    volatile unsigned int Cpt_T8_Vin_byPeak = 0;
    volatile unsigned int Cpt_T8_Vin_byEdge = 0;
    volatile unsigned int Cpt_RisingEdgeDetect = 0;
    unsigned char T_Vin_byPeak = 0;
    unsigned char T_Vin_byEdge = 0;
    volatile unsigned char Cpt_Nb_T_Vin = 0;
    volatile unsigned int Cpt_DelayEchAcq = 0;
    et dans mon *.h
    extern unsigned int ResultVinAD;
    extern volatile unsigned int Cpt_T8_Vin_byPeak;
    extern unsigned char T_Vin_byPeak;
    extern volatile unsigned int Cpt_DelayEchAcq;
    Et pour exemple, voici mon main.c:
    #include <pic12f1501.h>
    #include <xc.h>
    #include <acqad.h>
    #include <init.h>
    #include <onewire.h>

    //////////////////////////////////////////////////////////////////////////////////////////
    // Configuration Fuse Registers //
    //////////////////////////////////////////////////////////////////////////////////////////
    // CONFIG1
    #pragma config FOSC = INTOSC // Oscillator Selection Bits (INTOSC oscillator: I/O function on CLKIN pin)
    #pragma config WDTE = ON // Watchdog Timer Enable (WDT enabled)
    #pragma config PWRTE = OFF // Power-up Timer Enable (PWRT disabled)
    #pragma config MCLRE = ON // MCLR Pin Function Select (MCLR/VPP pin function is MCLR)
    #pragma config CP = ON // Flash Program Memory Code Protection (Program memory code protection is enabled)
    #pragma config BOREN = ON // Brown-out Reset Enable (Brown-out Reset enabled)
    #pragma config CLKOUTEN = OFF // Clock Out Enable (CLKOUT function is disabled. I/O or oscillator function on the CLKOUT pin)

    // CONFIG2
    #pragma config WRT = OFF // Flash Memory Self-Write Protection (Write protection off)
    #pragma config STVREN = ON // Stack Overflow/Underflow Reset Enable (Stack Overflow or Underflow will cause a Reset)
    #pragma config BORV = LO // Brown-out Reset Voltage Selection (Brown-out Reset Voltage (Vbor), low trip point selected.)
    #pragma config LPBOR = OFF // Low-Power Brown Out Reset (Low-Power BOR is disabled)
    #pragma config LVP = ON // Low-Voltage Programming Enable (Low-voltage programming enabled)
    //////////////////////////////////////////////////////////////////////////////////////////
    // Variable Globale //
    //////////////////////////////////////////////////////////////////////////////////////////
    unsigned int ResultVinAD = 0;
    volatile unsigned int Cpt_T8_Vin_byPeak = 0;
    volatile unsigned int Cpt_T8_Vin_byEdge = 0;
    volatile unsigned int Cpt_RisingEdgeDetect = 0;
    unsigned char T_Vin_byPeak = 0;
    unsigned char T_Vin_byEdge = 0;
    volatile unsigned char Cpt_Nb_T_Vin = 0;
    volatile unsigned int Cpt_DelayEchAcq = 0;
    //////////////////////////////////////////////////////////////////////////////////////////
    // Routines IT //
    //////////////////////////////////////////////////////////////////////////////////////////
    void interrupt it_gene(void)
    {
    if(INTCONbits.TMR0IE && INTCONbits.TMR0IF) // SI débordement du registre de comptage
    {
    TMR0 = 0xA7; // Initialisation du registre du Timer
    INTCONbits.TMR0IF = 0; // Mise à zéro du flag de détection d'interruption

    Cpt_DelayEchAcq++; // Incrémentation du compteur / intervalle entre les acquisition Vin
    Cpt_T8_Vin_byEdge++; // Incrémentation du compteur de mesure de fréquence
    Cpt_T8_Vin_byPeak++; // Incrémentation du compteur de mesure de fréquence
    Cpt_RisingEdgeDetect++; // Incrémentation du compteur / Gestion commande pour seuil de mesure fréquence
    Cpt_RefreshOneWireCom++; // Incrémentation du compteur de rafraichissement de la communication 1 Wire
    Cpt_GestionOneWireCom++; // Incrémentation du compteur de gestion de la communication 1 Wire
    // TMR0 = 0xB2; // Initialisation du registre du Timer
    // INTCONbits.TMR0IF = 0; // Mise à zéro du flag de détection d'interruption
    }
    if(INTCONbits.INTE && INTCONbits.INTF) // SI détection sur broche INT
    {
    Cpt_RisingEdgeDetect = 0; // Remise à zéro du compteur
    Cpt_Nb_T_Vin++;
    if(Cpt_Nb_T_Vin >= 9)
    {
    Cpt_T8_Vin_byEdge = Cpt_T8_Vin_byEdge>>3; // Moyennage de la période sur 8 périodes
    T_Vin_byEdge = Cpt_T8_Vin_byEdge; // Sauvegarde du compteur de mesure de fréquence
    Cpt_T8_Vin_byEdge = 0; // Remise à zéro du compteur
    Cpt_Nb_T_Vin = 1; // Remise à zéro du compteur
    }
    INTCONbits.INTF = 0; // Mise à zéro du flag de détection d'interruption
    }
    }

    //////////////////////////////////////////////////////////////////////////////////////////
    // Main //
    //////////////////////////////////////////////////////////////////////////////////////////
    int main(void)
    {
    unsigned char T_Vin = 0;

    InitUC (); // Initialisation du µC
    InitIO(); // Initialisation du µC (I/O)
    InitINT(); // Initialisation du module INT
    InitTIMER0(); // Initialisation du module Timer 0
    Init_AD (); // Initialisation ADC
    INTCONbits.GIE = 1; // Autorisation des IT

    LowVinVoltagePinState = 1;
    FinThresholdLevelPin = 1;
    CloseOneWireCom (); // Phase de repos / Mise à "0" de la sortie isolée
    Cpt_RefreshOneWireCom = 0; // Mise à zéro du compteur de raffraichissement de la communication OneWire
    while (1)
    {
    CLRWDT(); // Acquitement du WDT

    // MESURE DE TENSION VIN + CONTROLE LOW PIN
    AcqAD_Vin(); // Acquisition de la tension / Surveillance

    //
    // if(Cpt_RisingEdgeDetect >= 400) // Si compteur supérieure à 20ms (50Hz) / Détection de front incorrecte
    // {
    // if(FinThresholdLevelPinState == 1)FinThresholdLevelPin = 0;
    // else if(FinThresholdLevelPinState == 0)FinThresholdLevelPin = 1;
    // Cpt_RisingEdgeDetect = 0;
    // }

    // ENVOI DONNEES VIA LIAISON 1 FIL
    // if(Cpt_RefreshOneWireCom >= 20000 ) // Si compteur supérieur à 500ms
    // {
    // T_Vin = 0;
    // //DETERMINATION FREQUENCE FIN
    // if((T_Vin_byEdge>=124)&&(T_Vin _byEdge<=185))T_Vin = T_Vin_byEdge; // Détermination via le signal carré sur RA2
    // else if((T_Vin_byPeak>=124)&&(T_Vin _byPeak<=185))T_Vin = T_Vin_byPeak; // Détermination via la mesure max de Vin
    //
    // InitOneWireCom (); // Initialisation de la communication One Wire
    // SendIntViaOneWire(T_Vin); // Envoi au µC de gestion via communication OneWire
    // SendIntViaOneWire(ResultVinAD) ; // Envoi au µC de gestion via communication OneWire
    //
    //// SendIntViaOneWire(0b0100101000 001101); // Envoi au µC de gestion via communication OneWire
    //// SendIntViaOneWire(0b0000001111 000101); // Envoi au µC de gestion via communication OneWire
    // CloseOneWireCom (); // Phase de repos / Mise à "0" de la sortie isolée
    // Cpt_RefreshOneWireCom = 0; // Mise à zéro du compteur de raffraichissement de la communication OneWire
    // }
    }
    }
    Pour informations, je déclare aussi ces variables en local dans mon fichier acqad.c
    unsigned int VinMaxEch[10];
    unsigned int ResultAD[5];
    unsigned int FilterValueTab = 0;
    unsigned int VinMaxValue = 0;
    J'espère que toutes ces informations vous aiderons !

    Merci encore!

  8. #7
    jorg1n

    Re : [C/PIC12F] - Déclaration de variables, en Flash? en RAM?

    Bonjour!

    ça ne vous donne pas plus d'idées que ça??

  9. #8
    jorg1n

    Re : [C/PIC12F] - Déclaration de variables, en Flash? en RAM?

    A mon avis, c'est plus un souci de BANK, il faut que tu regarde ton fichier de link.
    Vous allez rire (ou pas) mais je ne trouve pas le fichier linker!!
    Je trouve le fichier *.INC et le fichier *.H, mais rien d'autre!

Discussions similaires

  1. Réponses: 7
    Dernier message: 11/12/2012, 07h47
  2. Déclaration de variables en C
    Par flyingrock dans le forum Électronique
    Réponses: 10
    Dernier message: 25/09/2012, 14h18
  3. Déclaration de variables en assembleur
    Par Laboum dans le forum Électronique
    Réponses: 3
    Dernier message: 25/10/2010, 07h55
  4. [C]-Déclaration de variables
    Par jorg1n dans le forum Électronique
    Réponses: 3
    Dernier message: 29/04/2009, 12h57
  5. [PIC]-Aide déclaration variables
    Par jorg1n dans le forum Électronique
    Réponses: 17
    Dernier message: 03/06/2008, 09h36
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...