Pb écriture dans les registres PIC18F sous MCC18
Répondre à la discussion
Page 1 sur 2 1 DernièreDernière
Affichage des résultats 1 à 30 sur 48

Pb écriture dans les registres PIC18F sous MCC18



  1. #1
    3661dominique

    Pb écriture dans les registres PIC18F sous MCC18


    ------

    Bonjour à tous,
    Depuis quelque temps je me suis mis à essayer de programmer un PIC 18F452 en langage C.
    Après pas mal de correction je "tombe" sur un problème certainement très simple à résoudre mais je ne trouve pas la solution pour initialiser les fichiers INTCON ,INTCON2,INTCON3, etc. en C.
    INTCON = 0b00101000;
    INTCON = 0x28;
    INTCON,5,1;
    INTCON.5=1;
    INTCONbits,5,1;
    INTCONbits.5=1;
    INTCONbits.RBIE=1;
    aucune méthode ne fonctionne.
    J’obtiens la réponse suivante "Error: syntax error"
    Le fichier "P18F452.H" est bien inclus en header et dans le même dossier avec
    extern volatile near unsigned char INTCON;
    extern volatile near union {
    struct {
    unsigned RBIF:1;
    unsigned INT0F:1;
    unsigned T0IF:1;
    unsigned RBIE:1;
    unsigned INT0E:1;
    unsigned T0IE:1;
    unsigned PEIE:1;
    unsigned GIE:1;
    };
    struct {
    unsigned :1;
    unsigned INT0IF:1;
    unsigned TMR0IF:1;
    unsigned :1;
    unsigned INT0IE:1;
    unsigned TMR0IE:1;
    unsigned GIEL:1;
    unsigned GIEH:1;
    };
    } INTCONbits;

    Je ne vois pas ce qui n'est pas conforme au C ou au compilateur.
    Configuration:
    MPLAB IDE v8.89

    Avec le Pack MCC18 ci dessous
    MPASM v3.36
    MPLINK v4.47
    MCC18 v3.36
    Librarian v4.37
    Pouvez-vous m'indiquer mon erreur.
    je suis a court d'idée


    Pourtant ça marche sur l’exemple suivant :

    http://fr.wikiversity.org/wiki/Utili...t_le_langage_C

    //******************** Compilateur C18 ***********************
    #include <p18f452.h>
    #include <stdio.h>
    #pragma config WDT = OFF
    void main(void) {
    // configure USART
    SPBRG = 25; // configure la vitesse (BAUD) 9600 N 8 1
    TXSTA = 0x24;
    RCSTA = 0x90; // active l'USART
    // quartz comme source
    T0CONbits.T0CS = 0;
    // si 0 pas besoin diviseur suivant
    T0CONbits.PSA = 1;
    // division par 2
    T0CONbits.T0PS0 = 0;
    T0CONbits.T0PS1 = 0;
    T0CONbits.T0PS2 = 1;
    // passage en 8 bits
    T0CONbits.T08BIT = 1;
    T0CONbits.TMR0ON = 1; //C'est parti
    // bit RA0 du PORTA en sortie
    TRISAbits.TRISA0=0;
    while(1) {
    // TMR0H = 0x00; inutile car en 8 bits
    TMR0L = TMR0L+8; // peut être le mieux
    INTCONbits.TMR0IF = 0;
    while (INTCONbits.TMR0IF == 0);
    PORTAbits.RA0 = PORTAbits.RA0 ^1;
    }
    }

    Merci d'avance, cordialement

    -----

  2. #2
    invite805ff73c

    Re : Pb écriture dans les registres PIC18F sous MCC18

    Chaque bit du REGISTRE INTCON à un nom: RBIF, INT0F etc. Il suffit d'écrire p.ex.
    Code:
    INTCON.RBIF=1;
    (avec un point entre les deux mots)

    edit: En relisant le code posté (la prochaine fois entre [ code] ça sera mieux) je doute mais je vais laisser ma réponse...

  3. #3
    RISC

    Re : Pb écriture dans les registres PIC18F sous MCC18

    Salut dominique,

    Utilises les balises sans quoi ton code est illisible...
    Tout d'abord commence par utiliser la dernière version gratuite du compilateur C18 (v3.46 je crois) : http://www.microchip.com/C18

    La syntaxe correcte est pour n'importe quel registre : NOMDUREGISTREbits.bitname ou NOMDUREGISTREbits.bitfield
    Donc ton programme est globalement correct MAIS il faut que tu nous fasses voir ton programme et TOUTE la ligne d'erreur qui donne le No de la ligne ou le compilateur DETECTE l'erreur. Cela veut dire que l'erreur est sur cette ligne...ou AU-DESSUS.

    Je te recommande également d'installer MPLAB X plutot que MPLAB qui est plus convivial ;=)

    a+

    Grosmatou : la syntaxe que tu proposes n'est pas valide pour le compilateur C18 mais pour un autre compilo (XC8 ?)

  4. #4
    3661dominique

    Re : Pb écriture dans les registres PIC18F sous MCC18

    bonjour à tous,

    Je ne pense pas que cette fonction ai évoluée avec la version 3.46 mais bon..
    Quant a MPLAB X impossible de travailler avec il est trop lent sur ma machine.
    /****************************** ******************/
    Partie du Programme écrit :
    1
    2 //LIST p=18F452 ;Définition de processeur
    3 #include "p18F452.h"
    4 #include "Prog_mem.h" //les fonctions
    5 #include "stdio.h"
    6 #pragma config WDT = OFF
    7 #pragma config OSC = HS //Oscillateur principal(LP,XT,HS,RC,EC,ECIO, HSPLL,RCIO)
    8 //#pragma CLOCK_FREQ 20000000
    9 #pragma config OSCS = ON //Oscillateur secondaire refusé (ON/OFF)
    10 #ifndef DEBUG
    11 #pragma config PWRT = ON //Délai au démarrage (ON/OFF)
    12 #pragma config BOR = ON //Reset si chute de tension (ON/OFF)
    13 #pragma config BORV = 42 //Tension de reset en 1/10ème Volts (20,27,42,45)
    14 #pragma config WDT = OFF //Mise en service watchdog (ON/OFF)
    15 #pragma config WDTPS = 128 //ostdiviseur du watchdog (1,2,4,8,16,32,64,128)
    16 #pragma config STVR = ON //Reset sur débordement de pile (ON/OFF)
    ….
    /*je vous fait grace de tous les pragmas*/
    92 Endif
    93
    94 /**** ASSIGNATIONS SYSTEME ****/
    95
    96 /**** REGISTRE INTCON (contrôle interruptions standard) ****/
    97 //valeur reset=0000 000x;
    98 //INTCON = 0x28;
    99 //INTCON,7,0;
    100 //INTCONbits,5,1;
    101 INTCONbits.TMR0IF = 1; ceci ne va pas mieux que les autres !
    102 //INTCON,4,0;
    103 INTCONbits.RBIE=1;
    104 //INTCON.RBIE=1;
    /*qq exemples de bits sur un registre*/

    Ci-dessus tous les cas essayés je ne vous fait voir que le registre INTCON les autres sont les mêmes aucun ne marche

    Ensuite le programme continue .

    Ligne de retour du compilateur

    Executing: "C:\Program Files\Microchip\MCC18\bin\mcc1 8.exe" -p=18F452 "main.c" -fo="main.o" -D__DEBUG -Ou- -Ot- -Ob- -Op- -Or- -Od- -Opa-
    F:\Programation\Projets\Prog_p ic\Exemples_C\Prog_mem\main.c: 101:Error: syntax error
    Dans l’exemple du 30/09 à 17h48mn
    L’exemple INTCONbits.TMR0IF = 0; ne marche pas même config.

    Avez-vous une idée sur cette anomalie ?
    Ce serait un peu c.n de tout « virer » prg de 25 pages et circuit imprimé prêt à être réaliser.
    Je n’ai pas engagé de dépense heureusement mais un gros boulot.
    Merci pour votre patience Cordialement

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

    Re : Pb écriture dans les registres PIC18F sous MCC18

    bonjour à tous,

    Je ne pense pas que cette fonction ai évoluée avec la version 3.46 mais bon..
    Quant a MPLAB X impossible de travailler avec il est trop lent sur ma machine.
    /****************************** ******************/
    Partie du Programme écrit :
    1
    2 //LIST p=18F452 ;Définition de processeur
    3 #include "p18F452.h"
    4 #include "Prog_mem.h" //les fonctions
    5 #include "stdio.h"
    6 #pragma config WDT = OFF
    7 #pragma config OSC = HS //Oscillateur principal(LP,XT,HS,RC,EC,ECIO, HSPLL,RCIO)
    8 //#pragma CLOCK_FREQ 20000000
    9 #pragma config OSCS = ON //Oscillateur secondaire refusé (ON/OFF)
    10 #ifndef DEBUG
    11 #pragma config PWRT = ON //Délai au démarrage (ON/OFF)
    12 #pragma config BOR = ON //Reset si chute de tension (ON/OFF)
    13 #pragma config BORV = 42 //Tension de reset en 1/10ème Volts (20,27,42,45)
    14 #pragma config WDT = OFF //Mise en service watchdog (ON/OFF)
    15 #pragma config WDTPS = 128 //ostdiviseur du watchdog (1,2,4,8,16,32,64,128)
    16 #pragma config STVR = ON //Reset sur débordement de pile (ON/OFF)
    ….
    /*je vous fait grace de tous les pragmas OFF*/
    92 Endif
    93
    94 /**** ASSIGNATIONS SYSTEME ****/
    95
    96 /**** REGISTRE INTCON (contrôle interruptions standard) ****/
    97 //valeur reset=0000 000x;
    98 //INTCON = 0x28;
    99 //INTCON,7,0;
    100 //INTCONbits,5,1;
    101 INTCONbits.TMR0IF = 1; ceci ne va pas mieux que les autres !
    102 //INTCON,4,0;
    103 INTCONbits.RBIE=1;
    104 //INTCON.RBIE=1;
    /*qq exemples de bits sur un registre*/

    Ci-dessus tous les cas essayés je ne vous fait voir que le registre INTCON les autres sont les mêmes aucun ne marche

    Ensuite le programme continue .

    Ligne de retour du compilateur

    Executing: "C:\Program Files\Microchip\MCC18\bin\mcc1 8.exe" -p=18F452 "main.c" -fo="main.o" -D__DEBUG -Ou- -Ot- -Ob- -Op- -Or- -Od- -Opa-
    F:\Programation\Projets\Prog_p ic\Exemples_C\Prog_mem\main.c: 101:Error: syntax error
    Dans l’exemple du 30/09 à 17h48mn
    L’exemple INTCONbits.TMR0IF = 0; ne marche pas même config.

    Avez-vous une idée sur cette anomalie ?
    Ce serait un peu c.n de tout « virer » prg de 25 pages et circuit imprimé prêt à être réaliser.
    Je n’ai pas engagé de dépense heureusement.
    Merci pour votre patience Cordialement
    Dernière modification par 3661dominique ; 01/10/2013 à 11h14.

  7. #6
    3661dominique

    Re : Pb écriture dans les registres PIC18F sous MCC18

    bonjour,
    Je suis très surpris de découvrir que mon topic a été virer de programmation et mis dans cette rubrique ou il n'a rien à faire et pour lequel je n'aurai aucune réponse.
    merci de le remettre dans programmation car il concerne le langage C.

    cordialement

  8. #7
    paulfjujo

    Re : Pb écriture dans les registres PIC18F sous MCC18

    bonjour,


    Je viens de reprendre ton morceau de code ci-dessous
    et l'ai testé
    remarques:
    j'ai rajouté
    #define DEBUG (sinon double declaration de WDT)
    mis // devant le "Prog_mem.h"
    mettre // devant les "..."
    remplacé le Endif par #endif
    et surtout
    mettre 'init des registre dans le main !
    => No errors ...
    Code:
    
    #define DEBUG
    
     //LIST p=18F452 ;Définition de processeur
    #include "p18F452.h" 
    //#include "Prog_mem.h"	 //les fonctions
    #include "stdio.h"
    #pragma config WDT = OFF
    #pragma config OSC = HS //Oscillateur principal(LP,XT,HS,RC,EC,ECIO, HSPLL,RCIO)
    //#pragma	CLOCK_FREQ	 20000000
    #pragma config OSCS = ON //Oscillateur secondaire refusé (ON/OFF)
    #ifndef DEBUG
    #pragma config PWRT = ON //Délai au démarrage (ON/OFF)
    #pragma config BOR = ON //Reset si chute de tension (ON/OFF)
    #pragma config BORV = 42 //Tension de reset en 1/10ème Volts (20,27,42,45)
    #pragma config WDT = OFF //Mise en service watchdog (ON/OFF)
    #pragma config WDTPS = 128 //ostdiviseur du watchdog (1,2,4,8,16,32,64,128)
    #pragma config STVR = ON //Reset sur débordement de pile (ON/OFF)
    //...
    /*je vous fait grace de tous les pragmas OFF*/
     #endif
    
     /**** ASSIGNATIONS SYSTEME ****/
    
     /**** REGISTRE INTCON (contrôle interruptions standard) ****/
     //valeur reset=0000 000x;
     //INTCON = 0x28;	
     //INTCON,7,0;
     //INTCONbits,5,1;
    
    //INTCON,4,0;
    
    //INTCON.RBIE=1;
    
    void main (void)
    {
         INTCONbits.TMR0IF = 0;
         INTCONbits.RBIE=1;
    	while(1);
    	}
    	
    
    /*
    ----------------------------------------------------------------------
    Release build of project `C:\_C18\_MesProjets_C18\Freq_Period\18F258_Frequencemetre.mcp' started.
    Language tool versions: MPASMWIN.exe v5.47, mplink.exe v4.45, mcc18.exe v3.44, mplib.exe v4.45
    Wed Oct 02 14:46:43 2013
    ----------------------------------------------------------------------
    Clean: Deleting intermediary and output files.
    Clean: Deleted file "C:\_C18\tmp\1.o".
    Clean: Deleted file "C:\_C18\_MesProjets_C18\Freq_Period\18F258_Frequencemetre.cof".
    Clean: Deleted file "C:\_C18\_MesProjets_C18\Freq_Period\18F258_Frequencemetre.hex".
    Clean: Done.
    Executing: "C:\Program Files\Microchip\mplabc18\bin\mcc18.exe" -p=18F452 /i"C:\Program Files\Microchip\mplabc18\h" "1.c" -fo="C:\_C18\tmp\1.o" -Oi -Ou- -Ot- -Ob- -Op- -Or- -Od- -Opa-  -nw=2066 -pa=3
    Executing: "C:\Program Files\Microchip\mplabc18\bin\mplink.exe" /p18F452 /l"C:\Program Files\Microchip\mplabc18\lib" /k"C:\Program Files\Microchip\mplabc18\bin\LKR" "..\..\tmp\1.o" /u_CRUNTIME /w /o"C:\_C18\_MesProjets_C18\Freq_Period\18F258_Frequencemetre.cof"
    MPLINK 4.45, Linker
    Device Database Version 1.10
    Copyright (c) 1998-2011 Microchip Technology Inc.
    Errors    : 0
    
    MP2HEX 4.45, COFF to HEX File Converter
    Copyright (c) 1998-2011 Microchip Technology Inc.
    Errors    : 0
    
    Loaded C:\_C18\_MesProjets_C18\Freq_Period\18F258_Frequencemetre.cof.
    ----------------------------------------------------------------------
    Release build of project `C:\_C18\_MesProjets_C18\Freq_Period\18F258_Frequencemetre.mcp' succeeded.
    Language tool versions: MPASMWIN.exe v5.47, mplink.exe v4.45, mcc18.exe v3.44, mplib.exe v4.45
    Wed Oct 02 14:46:44 2013
    ----------------------------------------------------------------------
    BUILD SUCCEEDED
    
    */
    si cela ne t'aide pas ,
    - verifie le contenu de ton p18f458.h
    - post tout ton code !

  9. #8
    3661dominique

    Re : Pb écriture dans les registres PIC18F sous MCC18

    Bonjour,

    Merci pour ton post.

    En effet :
    #define DEBUG->ok
    Mis // devant le "Prog_mem.h" ->ce sont toutes les fonctions employées
    Mettre // devant les "..."-> ok ce n’est pas dans le prg
    Remplacé le Endif par #endif-> la voila l’erreur, merci !

    Mettre init des registres dans le main() !

    Si je comprends bien tu me dis de mettre l’initialisation des registres dans le main(), cela sous entend que a chaque passage ces fichiers seront réinitialisés ?

    Je pensais qu’il fallait les initialiser avant de déclarer les interruptions et que seules les modifications de configuration se faisaient dans le main().

  10. #9
    paulfjujo

    Re : Pb écriture dans les registres PIC18F sous MCC18

    Mettre init des registres dans le main() !
    dans la phase d'init du programme,
    qui peut etre en tete du main
    ou dans une routine externe.
    il suffit d'y passer une seule fois !

  11. #10
    3661dominique

    Re : Pb écriture dans les registres PIC18F sous MCC18

    Donc en créant une fonction init() ça suffit ce qui me permet de l'appeler avant d'entrer dans le main().
    Merci l'info m'est bien utile.
    J’ai encore du travail là-dessus les interruptions
    Je te remercie pour le temps passé.
    Cordialement A+

  12. #11
    3661dominique

    Re : Pb écriture dans les registres PIC18F sous MCC18

    Bonjour,
    Toujours dans le même dossier est il possible d'incorporer un fichier INIT_INT.asm dans le projet afin qu'il soit compilé et linké par MPLAB ?
    Cela me simplifirai l'opération
    A+

  13. #12
    paulfjujo

    Re : Pb écriture dans les registres PIC18F sous MCC18

    bonjour,

    a priori,oui,en l'encapsulant dans une fonction C et balises asm

    Code:
    void Init (void)
    {
    _asm
    movlw...
    
    _endasm
    }
    
    void main()
    {
     Init();
    ....
    
    }
    mais je n'en vois pas d'avantage par rapport au C18 qui gere tres bien les
    registres soit globalement,soit au niveau des bits.
    Dernière modification par paulfjujo ; 04/10/2013 à 08h50.

  14. #13
    3661dominique

    Re : Pb écriture dans les registres PIC18F sous MCC18

    bonjour,
    Merci pour l'information
    Je vais incorporer mon fichier .asm dans une fonction.
    Je commence à fatiguer de tout transformer en C
    Je croyais cela plus efficace mais ça devient galère.
    Cordialement

  15. #14
    RISC

    Re : Pb écriture dans les registres PIC18F sous MCC18

    Salut,

    Il n'est absolument PAS nécessaire d'encapsuler quoique ce soit. Le compilateur fait très bien la différence entre une extension .asm et .c et décide ou non de compiler le fichier c pour faire un fichier assembleur...
    Il suffit de lire la documentation du compilateur qui explique comment déclarer des variables et des fonctions en C ou en asm et comment les appeler d'un coté ou de l'autre.

    a+

  16. #15
    3661dominique

    Re : Pb écriture dans les registres PIC18F sous MCC18

    Bonjour a tous,
    J’ai effectivement passé deux fichiers en .asm qui ont l’air de passer la compilation.
    Néanmoins j’ai un message :
    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 vois pas pourquoi , le /q en question s’est mis en place tout seul.

    Il me reste un autre souci
    Lors de l’initialisation de mes tableaux dont voici le texte:
    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)

    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;
    }
    Texte de réponse du compilateur la ligne concernée (426) est celle du for:
    Executing: "C:\Program Files\Microchip\MCC18\bin\mcc1 8.exe" -p=18F452 "main.c" -fo="main.o" -D__DEBUG -Ou- -Ot- -Ob- -Op- -Or- -Od- -Opa- F:\Programation\Projets\Prog_p ic\Exemples_C\Prog_mem_c\main. c:426:Error: syntax error
    Merci pour vos efforts
    Cordialement

  17. #16
    invite805ff73c

    Re : Pb écriture dans les registres PIC18F sous MCC18

    Texte de réponse du compilateur la ligne concernée (426) est celle du for:
    enlève donc les étoiles du commentaire et réessaye... /* est la séquence de début d'un commentaire multi-ligne (qui n'est jamais fini içi), je pense que c'est ça qui embrouille le compilateur.

  18. #17
    3661dominique

    Re : Pb écriture dans les registres PIC18F sous MCC18

    Bonjour,
    Ca ne vient pas de là. Après correction c'est toujours la même chose.
    C'est la dernière erreur signalée par le compilateur et impossible pour moi de voir pour quoi
    Cordialement

  19. #18
    paulfjujo

    Re : Pb écriture dans les registres PIC18F sous MCC18

    bonsoir,

    Cette portion de code ne genere pas d'erreur..

    mais l'erreur signalée peut etre bien en amont du numero de ligne ...
    verfifier si il n'y aurait pas un debordement de RAM mal signalé.
    en rajoutant les 5 table de 10 entiers soit 100 bytes..

    ou montre l'integralité de ton code

  20. #19
    3661dominique

    Re : Pb écriture dans les registres PIC18F sous MCC18

    Bonjour,
    Après vérification, effectivement j’ai 122 octets de variables en tenant compte des cinq tableaux ci-dessus et peut être quelques unes ailleurs.
    Ce serait bien si je pouvais ventiler mes variables dans les différentes banques de la puce.
    Il y a 96 octets de disponibles dans BANK 1 qui pourraient accueillir mes tableaux.
    Cela me pose un problème car je ne sais pas comment déclarer les BANK en C ou alors déclarer me tableaux en .asm
    Ce serait bon si tu avais une idée.
    Pour te passer le code en intégralité, cela représente 17 fichiers allant de 20 lignes à 600 lignes chacun. Je ne veux pas vous embrouiller avec un volume pareil. Ce serait trop fastidieux de se "peler" une lecture pareille.
    Cordialement

  21. #20
    paulfjujo

    Re : Pb écriture dans les registres PIC18F sous MCC18

    bonjour,

    Il faut intervenir dans le fichier du linker
    exemple ci dessous pour isoler un bloc de 512 octets.(2 bank )
    il faut que le compilateur pointe sur celui ci (le rajouter dans le projet : linker script)
    pour ne pas utiliser par defaut celui qui est dans c:\microchip\MCC18\....
    et la definition dans le C pour loger la table ..

    on peut voir (*.jpg) que Tab_Trame5 est bien logée dans le nouvel espace adresse 0x300

    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 MyBank
    static	int Tab_Trame5[128]; //6ere trame de 128 entiers soit 256 bytes
    //#pragma idata
    #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++) //*** mise a 0 des tableaux
    {
    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[127]=999;
    
    while(1);
    
    
    	
    }



    Code:
    // File: 18f452_g.lkr  modifié !
    // Generic linker script for the PIC18F452 processor
    
    #DEFINE _CODEEND _DEBUGCODESTART - 1
    #DEFINE _CEND _CODEEND + _DEBUGCODELEN
    #DEFINE _DATAEND _DEBUGDATASTART - 1
    #DEFINE _DEND _DATAEND + _DEBUGDATALEN
    
    LIBPATH .
    
    #IFDEF _CRUNTIME
      FILES c018i.o
      FILES clib.lib
      FILES p18f452.lib
    #FI
    
    #IFDEF _DEBUGCODESTART
      CODEPAGE   NAME=page       START=0x0               END=_CODEEND
      CODEPAGE   NAME=debug      START=_DEBUGCODESTART   END=_CEND        PROTECTED
    #ELSE
      CODEPAGE   NAME=page       START=0x0               END=0x7FFF
    #FI
    
    CODEPAGE   NAME=idlocs     START=0x200000          END=0x200007       PROTECTED
    CODEPAGE   NAME=config     START=0x300000          END=0x30000D       PROTECTED
    CODEPAGE   NAME=devid      START=0x3FFFFE          END=0x3FFFFF       PROTECTED
    CODEPAGE   NAME=eedata     START=0xF00000          END=0xF000FF       PROTECTED
    
    ACCESSBANK NAME=accessram  START=0x0               END=0x7F
    ACCESSBANK NAME=accesssfr  START=0xF80             END=0xFFF          PROTECTED
    DATABANK   NAME=gpr0       START=0x80              END=0xFF
    DATABANK   NAME=gpr1       START=0x100             END=0x1FF
    DATABANK   NAME=gpr2       START=0x200             END=0x2FF
    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
    
    #IFDEF _DEBUGDATASTART
      DATABANK   NAME=gpr5       START=0x500             END=_DATAEND
      DATABANK   NAME=dbgspr     START=_DEBUGDATASTART   END=_DEND           PROTECTED
    #ELSE //no debug
      DATABANK   NAME=gpr5       START=0x500             END=0x5FF
    #FI
    
    
    #IFDEF _CRUNTIME
      SECTION    NAME=CONFIG     ROM=config
      #IFDEF _DEBUGDATASTART
        STACK SIZE=0x100 RAM=gpr4
      #ELSE
        STACK SIZE=0x100 RAM=gpr5
      #FI
    #FI
    Images attachées Images attachées  

  22. #21
    paulfjujo

    Re : Pb écriture dans les registres PIC18F sous MCC18

    Par contre je viens de decouvrir que si j'initialise
    Code:
    #pragma udata MyBank
    int Tab_Trame5[200]; //6ere trame de 200 entiers soit 400 bytes
    #pragma udata
    soit en dessous de la limite 0x4FF,
    il se passe des choses etranges si l'indice (en decimal ) depasse 127 ?
    la table recoit 0 (zero!)

    nota: j'ai bien activé dans options projet , MPASM assembleur, default Radix : decimal !

    Code:
    Tab_Trame5[0]=0;
    Tab_Trame5[9]=9;
    Tab_Trame5[100]=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;
    i=199;
    Tab_Trame5[i]=123456;


    ex: Tab_Trame5[199]=9870; <- reste à 0
    Ce qui voudrait dire qu'un indice forcé serait un char signé de 0 à127 ???
    alors que si je fais

    i=199;
    Tab_Trame5[i]=12345; <-- est bien initialisé

    et si je fais
    Tab_Trame5[0xC7]=12345 <-- c'est OK aussi avec indice en Hexadecimal..

    bug or not bug MPLAB C18 ? or my fault ?

    Nota: tests avec debugger !
    Images attachées Images attachées  
    Dernière modification par paulfjujo ; 09/10/2013 à 16h16.

  23. #22
    3661dominique

    Re : Pb écriture dans les registres PIC18F sous MCC18

    Ne vous fatiguez pas pour les mémoires, j’ai trouvé sur le net dans un cours de l’Académie d’AIX-MARSEILLE sur MCC18 v14.pdf page 30/56. Voici la partie concernée :

    4.4. Gestion de la mémoire
    4.4.1. Directives de gestion de la mémoire

    Directive/ Rôle

    #pragma varlocate
    Indique au compilateur dans quel bloc mémoire (bank) placer une variable.
    Cela permet d’optimiser le code généré.

    Syntaxe / exemple

    #pragma varlocate bank nom_variable
    ou
    #pragma varlocate nom_section nom_variable [, nom_variable …]
    Par exemple, dans un fichier c1 et c2 sont affectées en bank 1.
    #pragma udata bank1=0x100
    signed char c1;
    signed char c2;
    ça semble marcher.

    Je verrais ton code demain. En attendant merci encore.


    Il me reste une chose à voir , les warning ci-dessous :
    Executing: "C:\Program Files\Microchip\MCC18\bin\mcc1 8.exe" -p=18F452 "LCD_4.c" -fo="LCD_4.o" -D__DEBUG -Ou- -Ot- -Ob- -Op- -Or- -Od- -Opa- F:\Programation\Projets\Prog_p ic\Exemples_C\Prog_mem_c\LCD_4 .c:48:Warning [2058] call of function without prototype
    concernant les routines suivantes inclues dans la fonction LCD_4 dont voici le texte :
    char lcd_write(unsigned char c) /*** reçoit c =quartet DATA_H et quartet DATA_L ***/
    {
    delay_us(40);
    LATB = ( ( c >> 4 ) & 0x0F ); //decale de 4 bits a droite dans LCD_DATA + masque
    LCD_STROBE();
    LATB = ( c & 0x0F ); //met c dans LCD_DATA + masque
    LCD_STROBE();
    return 0;
    }
    La ligne 48 correspond à
    delay_us(40) ;

    je ne comprend pas le texte du warning[2058]

    et des comme ça j’en ai……

    Je ne peut rien tester car ça ne compile pas.
    je continue à ramer dur !
    Merci de ton attention.
    Bonne soirée

  24. #23
    paulfjujo

    Re : Pb écriture dans les registres PIC18F sous MCC18

    Je vais tester cette methode
    mais quid d'un tableau de 512 bytes (ou plus) soit 2 bank ?


    err 2058

    il suffit de declarer les corps de fonction en tete de programme ..
    AVANT de les utiliser.
    char lcd_write(unsigned char c) ;

  25. #24
    invite805ff73c

    Re : Pb écriture dans les registres PIC18F sous MCC18

    call of function without prototype
    Tu appelles une fonction (à priori delay_us) que le compilateur ne connaît pas encore. Pour la faire connaitre il suffit d'inclure quelque part avant le premier appel le header qui contient le prototype. Tu peux aussi écrire le prototype directement dans le fichier, quelque chose comme
    Code:
    void delay_us(int);
    (à confirmer),
    si tu as toi même écrit la fonction et que tu n'as pas fait de fichier header. (Mais je suppose que delay_us est fourni par le fabricant du compilateur donc il doit y avoir un header qui va avec.)

  26. #25
    3661dominique

    Re : Pb écriture dans les registres PIC18F sous MCC18

    bonjour,
    pour les warning correspondants à la fonction
    delay_us(40);
    qui nous sert d'exemple cette fonction ainsi que toutes les autres sont déclarées dans un fichier header.

    sous la forme
    extern long delay_us(long u);
    C'est ça l'objet de ma question, car toutes sont déclarées et toutes ou peut être presque toutes sont
    signalées par un warning!
    soit environ 50. c'est "bizzard!,j'ai dis bizzard?"
    Cordialement
    Dernière modification par 3661dominique ; 10/10/2013 à 10h42.

  27. #26
    invite805ff73c

    Re : Pb écriture dans les registres PIC18F sous MCC18

    Et le (ou les) fichier header est bien inclus dans chaque fichier .c qui utilise les fonctions concernées et cela avant le premier appel à une de ces fonctions? Il n'y a pas de warning "file not found" ou quelque chose comme ça?

  28. #27
    3661dominique

    Re : Pb écriture dans les registres PIC18F sous MCC18

    Pour être plus précis voici la forme:

    Delay.h

    extern long delay_us(long u);
    extern long delay_ms(long m);

    Delay.c

    extern long delay_us(long u)
    {
    long j;
    for (j==0;j<=u;j++)//1ms pour 1000
    {
    nop();
    }
    return 0;
    }

    extern long delay_ms(long m)
    {
    long i=0;

    for (i==0;i<=m;i++) //temps x 1000ms
    {
    // long u=1000;
    delay_us(1000);
    }
    return 0;
    }
    C’est le terme prototype qui ne me dis rien, est il possible de me faire une autre phrase que celle qui suit le (2058)

    (2058) call of function without prototype
    appeler la fonction sans prototype
    Je ne saisis pas le sens de cette phrase
    Dernière modification par 3661dominique ; 10/10/2013 à 13h19.

  29. #28
    invite805ff73c

    Re : Pb écriture dans les registres PIC18F sous MCC18

    Delay.c

    extern long delay_us(long u)
    {
    ...
    C'est bien joli d'avoir un fichier header mais il faut aussi l'inclure dans le(s) fichier(s) .c!
    #include "header.h"
    ou
    #include <header.h>
    selon l'endroit où se trouve le fichier.

    Un prototype est la signature d'une fonction. P. ex. pour une fonction
    Code:
    int bidule(char c)
    {
      int i;
      faire_quelque_chose_d'utile_avec c;
      return i;
    }
    le prototype est
    Code:
    int bidule(char c);
    , autrement dit la ligne de "définition" des paramètres et du nom de la fonction suivi d'un point-virgule. (Mais tu aurais pu demander à un moteur de recherche...)

    (2058) call of function without prototype
    appeler la fonction sans prototype
    Non, pas appeler mais appel de la fonction: En effet si tu écrits delay_ms(250); tu appelles la fonction et le compilo se plaint que cette fonction ne lui a pas encore été présentée sous forme d'un prototype ou de l'implémentation complète au moment de l'appel.

    Conclusion: Rajoute les #include qui vont bien et ça devrait être réglé.

  30. #29
    invite805ff73c

    Re : Pb écriture dans les registres PIC18F sous MCC18

    Et après réflexion les "extern" dans les fichiers .c m'embêtent mais je ne saurais trop dire pourquoi (je ne trouve pas le bon paragraphe dans le K&R...). En tout cas ça marche très bien sans tout ces extern devant les fonctions... Un expert qui veut se prononcer la-dessus?

  31. #30
    invite805ff73c

    Re : Pb écriture dans les registres PIC18F sous MCC18

    Pardon pour le triplet...

    Code:
    for (j==0;j<=u;j++)//1ms pour 1000
    Aie!! Le compilateur ne te sors pas de warning "statement without effect" à cet endroit? Tu utilises l'opérateur de comparaison == à la place de l'opérateur d'assignation =!

    D'ailleurs je ne suis pas convainqu des deux fonctions délai, il n'y a pas de tels fonction fournies par le fabricant du compilateur? En effet le nop() a une durée d'exécution toujours identique et connue, mais la boucle for autour elle prends aussi un temps et celui-ci est inconnu à moins d'avoir simulé le bazar (sans dire que le temps peut varier avec la version du compilateur, le niveau d'optimisation etc...) J'ai demandé à Google qui me dit qu'il faut regarder par là page 142 (quoi que c'est pas top, va falloir faire des calculs pour avoir des µs/ms. Chez AVR GCC il y a directement du delay_µs/ms...)

    et un dernier point, fais attention à la mise en page de ton code... Tout écrire à droite sans intendation/intemachin (comment ça s'appelle encore ce truc?) c'est pas très lisible.

Page 1 sur 2 1 DernièreDernière

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, 20h19
  2. Réalisation de registres et mémoire sous VHDL
    Par inviteaf5ba3b1 dans le forum Électronique
    Réponses: 3
    Dernier message: 12/05/2013, 10h53
  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, 22h41
  4. Registres sous Windows
    Par invite4671370c dans le forum Électronique
    Réponses: 1
    Dernier message: 01/09/2008, 19h08
  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, 08h06
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...