Pb écriture dans les registres PIC18F sous MCC18 - Page 2
Répondre à la discussion
Page 2 sur 2 PremièrePremière 2
Affichage des résultats 31 à 48 sur 48

Pb écriture dans les registres PIC18F sous MCC18



  1. #31
    3661dominique

    Re : Pb écriture dans les registres PIC18F sous MCC18


    ------

    Je reprend la forme du fichier .h:
    Delay.h

    extern long delay_us(long u);
    extern long delay_ms(long m);
    et la forme du fichier .c:
    #include ” Delay.h”



    extern long delay_us(long u)
    {
    ….
    }

    extern long delay_ms(long m)
    {
    ….
    }
    Autant pour moi j’avais oublié de copier
    #include ”Delay.h”

    La est ce correct?

    -----
    Dernière modification par 3661dominique ; 10/10/2013 à 15h19.

  2. #32
    invite805ff73c

    Re : Pb écriture dans les registres PIC18F sous MCC18

    Là c'est bon (sous réserve de mes réflexions sur les extern).

  3. #33
    paulfjujo

    Re : Pb écriture dans les registres PIC18F sous MCC18

    le probleme est bien specific a
    delay_us(xxx); et delay_mS(xxx); definis dans delai.h
    car le fichier delay.c correspondant n'est pas dans le chemin habituel de MPLAB

    alors qu'on y trouve bien delays.h
    dans mon cas ici: "C:\Program Files\Microchip\mplabc18\h\del ays.h"

    J'avais deja trencontré ce probleme et donc utilisé à la place la librairie C18 : delays.h
    j'avais en fait un bug dans ma version delay.c (partie declaration en rouge, manquante !)
    apres correction, la fonction delay_uS(xxx) est OK .. pas de waring ou error

    J'ai donc delay.c rajouté dans mon projet "Sources files"
    et j'ai rajouté mon header #include "../_common/delai.h"

    Code:
    /*********************************************************************
     * delay.c  -     General purpose delay functions
     *********************************************************************/
    //  delay_us(x)  Delay specified number of microseconds
    //  delay_ms(x)  Delay specified number of milliseconds
    
    #include    "../_common/delay.h"
    #ifndef CLOCK_FREQ
    #define CLOCK_FREQ                      (40000000L)      // Hz
    #define XTAL_FREQ                      (10000000L)      // Hz
    #endif
    
    void delay_ms(unsigned char cnt)
    {
    #if    XTAL_FREQ <= 2000000
        do {
            delay_us(996);
        } while(--cnt);
    #endif
    
    #if    XTAL_FREQ > 2000000
        unsigned char i;
        do {
            i = 4;
            do {
                delay_us(250);
            } while(--i);
        } while(--cnt);
    #endif
    }
    
    
    #ifndef	XTAL_FREQ
    #error "XTAL_FREQ must be defined in projdefs.h!"
    #endif
    
    #if	XTAL_FREQ >= 40100000
    #error "XTAL_FREQ >= MHz"
    #endif
    
    void delay_us(unsigned char cnt)
    {
        #if	XTAL_FREQ >= 12000000
    
        #define delay_us(x) \
        { \
           unsigned char _dcnt; \
            _dcnt = (x)*(XTAL_FREQ/12000000); \
            while(--_dcnt != 0) \
                continue; \
        }
     #else
    
        #define delay_us(x) \
        { \
            unsigned char _dcnt; \
            _dcnt = (x)/(12000000/XTAL_FREQ)|1; \
            while(--_dcnt != 0) \
                continue; \
        }
      #endif
    }

    /*
    ****************************** ****
    * delay_us(x) Delay specified number of microseconds
    * delay_ms(x) Delay specified number of milliseconds
    * 2004-11-05, David Hosken (DH):
    * - Initial version
    ****************************** ****************************** *********/
    #ifndef _DELAY_H_
    #define _DELAY_H_
    extern void delay_us(unsigned char x);
    extern void delay_ms(unsigned char cnt);
    #endif

    Dernière modification par paulfjujo ; 10/10/2013 à 15h39.

  4. #34
    invite805ff73c

    Re : Pb écriture dans les registres PIC18F sous MCC18

    Je ne peux rien dire sur les spécificités PIC mais je ne suis pas d'accord avec l'ajout en rouge. En effet #define delay_us(x) définit un(e?) macro au niveau du préprocesseur et non une fonction. Toute la partie entourée de rouge est "invisible" du compilateur (puisque destinée au précprocesseur), en y rajoutant les trucs en rouge on définit une fonction vide avec le même nom que le/la macro, bonjour les ennuis...

    edit: Un macro n'as pas de prototype bien sûr!

  5. #35
    paulfjujo

    Re : Pb écriture dans les registres PIC18F sous MCC18

    curoeux, je viens de voir , au fil des post precedent , que je n'ai pas le meme
    header delai.h
    usage de long pour le nb de µS ou mS ...
    extern long delay_us(long u);
    alors que j'ai
    extern void delay_us(unsigned char x);


    et pourqoui aurait-on un retour de valeur sur cette fonction ?
    au lieu de simplement
    extern void delay_us(long u);

    Pouvez vous poster le source C correspondant ?

  6. #36
    invite805ff73c

    Re : Pb écriture dans les registres PIC18F sous MCC18

    curoeux, je viens de voir , au fil des post precedent , que je n'ai pas le meme header delai.h
    Pas étonnant, 3661dominique l'a fabriqué lui-même avec le fichier .c.

    Bon, je fais une pause, ce sujet commence à devenir confus je trouve...

  7. #37
    paulfjujo

    Re : Pb écriture dans les registres PIC18F sous MCC18

    Citation Envoyé par grosmatou75001 Voir le message
    Toute la partie entourée de rouge est "invisible" du compilateur
    (puisque destinée au précprocesseur), en y rajoutant les trucs en rouge on définit une fonction
    vide avec le même nom que le/la macro, bonjour les ennuis...
    edit: Un macro n'as pas de prototype bien sûr!
    concernant l'encapsulation ( en rouge) de la macro delay_us
    si c'est uniquement une macro
    pourquoi dans le header voit-on traiter cette macro comme une fonction
    meme declaration que la fonction delay_mS ?

  8. #38
    invite805ff73c

    Re : Pb écriture dans les registres PIC18F sous MCC18

    si c'est uniquement une macro pourquoi dans le header voit-on traiter cette macro comme une fonction[?]
    Oh, certainement un oubli, on a du écrire d'abord une fonction puis la changer en macro sans ajuster le header...

  9. #39
    3661dominique

    Re : Pb écriture dans les registres PIC18F sous MCC18

    Bonjour,

    Je vois que j’ai semé la panique.

    Comme je débute en C, mis à part s’amuser a éclairer une LED dans un mini programme, j’ai du mal avec certaines notions.
    Par exemple, je croyais qu’il suffisait de déclarer les headers avant la fonction main() pour que l’ensemble des fonctions soient déclarées…et d’autres.

    A l’attention de paulfjujo
    As-tu pu vérifier la syntaxe de l’académie d’AIX-MARSEILLE concernant la déclaration de l’espace mémoire ?
    Je ne peu pas encore le vérifier car il me reste toujours des warning mais cette fois c’est :

    (2054) suspicious pointer conversion
    pour toutes mes fonctions du genre :
    Fonction (i,j,m,n) ;
    En tous les cas merci de vos conseils, ils son notés et dans le programme.

    Cordialement

  10. #40
    paulfjujo

    Re : Pb écriture dans les registres PIC18F sous MCC18

    hello,

    Panique encore ?
    voir mon alerte dans le post #21
    je ne pouvais verifier qu'avec avec le debugger pour le 18f452
    par contre j'ai refais des test reels avec un 18f46k22
    et je retrouve le meme probleme:
    Bad init de tableau si l'indice (valeur constante) est superieur à 127...
    alors qu'en mettant un indice variable int , no problemo..
    WHY ???

    J'ai testé la methode Aix...
    Code:
     
    // ATTENTION option projet MAPSM   radix = decimal !! 
    
    #pragma udata Bank2=0x200
    int Tab_Trame5[100];    // trame de 100 entiers soit 200 bytes
    #pragma udata
    Tab_Trame5[0] pointe bien sur adresse RAM 0x200 ...c'est OK

    par contre avec cette methode je ne vois pas comment on reserve plus d'une bank
    exemple
    Code:
    #pragma udata Bank2=0x200
    int Tab_Trame5[200]; // trame de 200 entiers soit 400 bytes
    #pragma udata
    ce qui genere une error
    => Error - section 'Bank2' can not fit the absolute section. Section 'Bank2' start=0x00000200, length=0x00000190

    j'utilise donc l'autre methode
    avec modif du fichier original 18f452.lkr
    Code:
    DATABANK  NAME=MyBank  	START=0x300  			END=0x4FF
    //DATABANK   NAME=gpr3       START=0x300             END=0x3FF
    //DATABANK   NAME=gpr4       START=0x400             END=0x4FF
    SECTION NAME=MyBank RAM=MyBank
    ne pas oublier d renommer autrement le fichier lors de la sauvegarde !

    et init ci dessous
    // test avec modif fichier lkr ..OK pour 200 entiers
    // ATTENTION option projet MAPSM radix = decimal !!
    // usage de 18f452_moreram.lkr !!
    [/CODE]
    #pragma udata MyBank
    int Tab_Trame5[200]; //6em trame de 100entiers soit 200bytes
    #pragma udata
    [/CODE]


    fichier de test avec mode debug et usage de watch
    Code:
    
    #include <p18f452.h>
    #include <stdlib.h>
    #include <stdio.h> 		// printf
    
    // Attention utiliser  "../_common/18f452_g.lkr"
    
    #pragma config WDT = OFF
    
    
    
    static int Tab_Trame0[10]; //1ere trame (Rx)
    static int Tab_Trame1[10]; //2eme trame (Tx)
    static int Tab_Trame2[10]; //3eme trame (Rx)
    static int Tab_Trame3[10]; //4eme trame (Tx)
    static int Tab_Trame4[10]; //5eme trame (Tx)
    
    
    // ATTENTION option projet MAPSM   radix = decimal !! 
    #pragma udata Bank2=0x200
    int Tab_Trame5[100]; //6ere trame de 100 entiers soit 200 bytes
    #pragma udata
    
    /*   test avec modif fichier lkr ..OK pour 200 entiers
    // ATTENTION option projet MAPSM   radix = decimal !! 
    // usage de 18f452_moreram.lkr !!
    #pragma udata MyBank
    int Tab_Trame5[200]; //6em trame de 100entiers soit 200bytes
    #pragma udata
    */
    
    int i;
    int *p0;
    int *p1;
    int *p2;
    int *p3;
    int *p4;
    int *p5;
    
    void main(void)
    { 
    p0=  Tab_Trame0;
    p1=  Tab_Trame1; 
    p2=  &Tab_Trame2[0];
    p3=  &Tab_Trame3[0];
    p4=  &Tab_Trame4[0]; 
    p5=  &Tab_Trame5[0]; 
       
    for(i = 0 ; i <= 9 ; i++) 
    {
    Tab_Trame0[i]=i;
    Tab_Trame1[i]=1;
    Tab_Trame2[i]=2;
    Tab_Trame3[i]=0;
    Tab_Trame4[i]=i;
    Tab_Trame5[i]=i;
    }
    Tab_Trame5[0]=0;
    Tab_Trame5[9]=9;
    Tab_Trame5[99]=1230;
    Tab_Trame5[118]=4560;
    Tab_Trame5[120]=789;
    Tab_Trame5[127]=16387;
    Tab_Trame5[128]=10000;
    Tab_Trame5[150]=32100;
    Tab_Trame5[180]=1654;
    Tab_Trame5[199]=9870; // <-- BAD
    i=199;
    Tab_Trame5[i]=123456;  // <-- OK
    Tab_Trame5[0xC7]=28345; //<-- OK
    
    while(1);
    
    	
    }

  11. #41
    RISC

    Re : Pb écriture dans les registres PIC18F sous MCC18

    Salut,

    C'est un cas évoqué des centaines de fois...Les PIC18 ont des banques de 256 octets par défaut donc un tableau ne peut dépasser cette taille sauf si on change le fichier linker.
    Copie le fichier linker original du compilateur dans ton projet, modifie le et ajoute le à ton projet pour créer par exemple un zone de 512 octets ou plus au lieu de 2 banques de 256.

    a+

  12. #42
    3661dominique

    Re : Pb écriture dans les registres PIC18F sous MCC18

    Bonsoir,
    Merci à tous pour les conseils qui m'ont bien servis.

    Il me reste toujours des warning mais cette fois c’est :

    (2054) suspicious pointer conversion
    pour toutes mes fonctions du genre :
    Fonction (i,j,m,n) ;
    Si vous avez une solution, ce me serait utile.

    Cordialement

  13. #43
    invite805ff73c

    Re : Pb écriture dans les registres PIC18F sous MCC18

    Pour ton warning il faut montrer plus de code, l'implémentation et l'appel de/des fonction(s) concernée(s) ainsi que la définition de tout les paramètres...

  14. #44
    paulfjujo

    Re : Pb écriture dans les registres PIC18F sous MCC18

    exemple de warning 2054 résolu

    extrait de ???
    C18 string literals (implicit string constants) are NOT of type const char *,
    they are of type const rom char* and cannot be assigned to variable of type char *

    If you are transmitting string literals you need another transmit function,
    identical except for the declaration:
    void txUsart_R(const rom char data[]) //Fixes warning 2054
    Then
    txUsart_R("Hello World! ");
    should compile OK. You need to use txUsart_R() for all string literals (ROM resident)
    and txUsart() for all string variables (RAM resident).
    exemple
    Code:
    void Put_RS( char * untel)
    {
       	while(Busy1USART());
       	Write1USART(*untel);
    }
    
    Put_RS(CR);    genere un warning 2054   car CR est en dur ! via   #define CR 13
    modif :
    void PutR_RS(rom char * untel)
    {
       	while(Busy1USART());
       	Write1USART( * untel);
    }
    ce qui donne à l'usage, sans WARNING :
    void CRLF()
    {
      PutR_RS((rom char *)13);  PutR_RS((rom char *)10);
      }
    J'ai toujours pas mal de warning 2054 dans mes codes!
    un warning n'est pas toujours revelateur d'un bug. sinon il n'existerait pas l'option:
    voir http://www.microchip.com/forums/m551858-print.aspx

    in Project
    Buid options
    Project
    MPLAB C18
    cocher : uses alternative settings
    et rajouter à la fin : -nw=2054 -pa=3
    *
    ou via alternate settings:
    -Ou- -Ot- -Ob- -Op- -Or- -Od- -Opa- -nw=2066 -pa=3 -nw=2054

  15. #45
    3661dominique

    Re : Pb écriture dans les registres PIC18F sous MCC18

    Bonjour,
    A part la méthode de supprimer les warnings, je n’ai rien compris du tout.

    Néanmoins j’ai progressé, il ne me reste plus que le sujet suivant :

    Déclaration des tableaux :
    extern char Tab_trame0[10] ;
    extern char Tab_trame1[10] ;
    extern char Tab_trame2[10] ;
    extern char Tab_trame3[10] ;
    extern char Tab_trame4[10] ;
    Après initialisation a 0 :
    for(i = 0 ; i <= 9 ; i++) //mise a 0 des tableaux
    {
    Tab_trame0[i]=0;
    Tab_trame1[i]=0;
    Tab_trame2[i]=0;
    Tab_trame3[i]=0;
    Tab_trame4[i]=0;
    }
    Fonction utilisant un des tableaux :
    Void Tab_Trame(char i,char valeur)
    {
    Tab_trame0[&i]=valeur ;
    }
    Appel de cette fonction dans la fonction main():
    Tab_trame(i,valeur,Tab_trame0)
    Cela me déclenche durant la compilation
    warning (2054) suspicious pointer conversion
    .Ces warning bloquent la compilation, à moins que ce soit les lignes suivantes :
    Qui concernent la fonction suivante par exemple Init_INT.asm
    Executing: "C:\Program Files\Microchip\MCC18\bin\mcc1 8.exe" /q /p18F452 "Init_INT.asm" /l"Init_INT.lst" /e"Init_INT.err" /o"Init_INT.o" /d__DEBUG=1 /q: unknown option
    Je ne trouve pas d’explications sur ce sujet.
    Si quelqu'un a une réponse, merci d’avance

    Cordialement

  16. #46
    invite805ff73c

    Re : Pb écriture dans les registres PIC18F sous MCC18

    supprimé, je dois regarder le truc de plus près...

  17. #47
    invite805ff73c

    Re : Pb écriture dans les registres PIC18F sous MCC18

    extern char Tab_trame0[10] ;
    C'est une déclaration ou une définition (c'est à dire que les variables sont en fait définis dans un autre fichier) ça? Dans le premier cas les extern sont faux, à virer!

    Tab_trame0[&i]=valeur ;
    Hein? L'adresse de i? C'est certainement faux.

    Void Tab_Trame(char i,char valeur)
    {
    Tab_trame0[&i]=valeur ;
    }
    Tu es sûr que là tu veux toujours écrire dans Tab_trame0? Je ne vois pas trop le sens de faire une fonction pour une seule instruction (fausse en plus).

    char Tab_trame0[10] ;
    Void Tab_Trame(char i,char valeur)
    Tab_trame(i,valeur,Tab_trame0)
    La il y a déjà un soucis au niveau du nombre de paramètres: Deux dans la déf de la fonction mais trois dans l'appel...
    Si je me fie à la déf de la fonction le Tab_trame0 n'a rien à faire là!
    Comment sont définies i et valeur passés en paramètre lors de l'appel?
    Tu veux faire quoi au juste (en deux mots)?

    Essaye de clarifier le truc, on vera pour le warning... J'ai l'impression que tu ne maîtrises pas parfaitement les pointeurs et les tableaux, je me trompe? Essaye pour la prochaine fois de donner un seul morceau de code qui contient tout le nécessaire pour être compilé plutôt que plusieurs bout. Avec plusieurs morceaux je ne vois notamment pas si les déclarations de variables sont locales ou globales...

  18. #48
    3661dominique

    Re : Pb écriture dans les registres PIC18F sous MCC18

    bonjour,
    je vais aller apprendre les tableaux.
    je reviendrais peut être plus tard.
    salut à tous et merci.

Page 2 sur 2 PremièrePremière 2

Discussions similaires

  1. Ecriture sous forme canonique et Problème
    Par invited5631833 dans le forum Mathématiques du collège et du lycée
    Réponses: 7
    Dernier message: 24/09/2013, 21h19
  2. Réalisation de registres et mémoire sous VHDL
    Par inviteaf5ba3b1 dans le forum Électronique
    Réponses: 3
    Dernier message: 12/05/2013, 11h53
  3. Écriture de l'EEPROM interne avec PIC18F: Un octet sur deux de perdu?
    Par invite48613fdf dans le forum Électronique
    Réponses: 9
    Dernier message: 08/09/2010, 23h41
  4. Registres sous Windows
    Par invite4671370c dans le forum Électronique
    Réponses: 1
    Dernier message: 01/09/2008, 20h08
  5. écriture de sommes partielles sous forme d'une integrale
    Par invite7494d0d2 dans le forum Mathématiques du supérieur
    Réponses: 1
    Dernier message: 18/10/2006, 09h06
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...