Bienvenue aux nouveaux arrivants sur FantasPic !

- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.

--- L’équipe FantasPic ---

Problème de compilation

Forum général sur le langage C !

Modérateur : Jérémy

Sw338965
Amateur
Amateur
Messages : 114
Enregistré en : décembre 2024

Problème de compilation

Messagepar Sw338965 » ven. 20 déc. 2024 14:51

bonjour à tous,
J'ai un fichier codé en C que je souhaiterai compiler pour utiliser un PIC16F788A avec MPLAB X IDE XC8 et je n'y arrive pas.
Pourriez-vous m'aider, svp.
; Configuration du microcontrôleur PIC16F877
#include <xc.h>

; Configuration des bits de configuration
#pragma config FOSC = XT // Oscillateur XT
#pragma config WDTE = OFF // Watchdog Timer (Désactivé)
#pragma config PWRTE = ON // Power-up Timer (Activé)
#pragma config CP = OFF // Code Protection (Désactivé)

; Définitions des broches
#define BROCHE_LED_VERTA PORTBbits.RB2
#define BROCHE_LED_ROUGEA PORTBbits.RB3
#define BROCHE_LED_JAUNEA PORTBbits.RB4
#define BROCHE_LED_VERTB PORTBbits.RB5
#define BROCHE_LED_ROUGEB PORTBbits.RB6
#define BROCHE_LED_JAUNEB PORTBbits.RB7

#define BROCHE_INTER_CLIG1 PORTAbits.RA0
#define BROCHE_INTER_CLIG2 PORTAbits.RA1
#define BROCHE_BOUTON_MANUEL PORTAbits.RA2

; Prototypes des fonctions
void initialisation(void);
void eteindreTout(void);
void temporisation_ms(unsigned int ms);
void modeClignotement(void);
void modeManuel(void);
void modeAutomatique(void);

; Variables globales
unsigned char etatFeux = 0;
unsigned char boutonPrecedent = 1;
unsigned int dernierAppui = 0;

void main(void) {
initialisation();

while (1) {
if (BROCHE_INTER_CLIG1 == 0) {
modeClignotement();
} else if (BROCHE_INTER_CLIG2 == 0) {
modeManuel();
} else {
modeAutomatique();
}
}
}

void initialisation(void) {
TRISA = 0b00000111; // RA0, RA1, RA2 en entrée
TRISB = 0b00000000; // Tout PORTB en sortie
PORTA = 0x00; // Initialiser PORTA
PORTB = 0x00; // Initialiser PORTB
}

void eteindreTout(void) {
PORTB = 0x00;
}

void temporisation_ms(unsigned int ms) {
unsigned int i;
unsigned char j;
for (i = 0; i < ms; i++) {
for (j = 0; j < 250; j++) {
__delay_us(4); // Délai de 4µs pour un oscillateur à 8 MHz
}
}
}

void modeClignotement(void) {
eteindreTout();
while (BROCHE_INTER_CLIG1 == 0) {
BROCHE_LED_JAUNEA = 1;
BROCHE_LED_JAUNEB = 1;
temporisation_ms(700);
BROCHE_LED_JAUNEA = 0;
BROCHE_LED_JAUNEB = 0;
temporisation_ms(500);
}
}

void modeManuel(void) {
unsigned int tempsActuel = 0;
if (BROCHE_BOUTON_MANUEL == 0 && boutonPrecedent == 1) {
etatFeux = (etatFeux + 1) % 6;
boutonPrecedent = 0;
} else if (BROCHE_BOUTON_MANUEL == 1) {
boutonPrecedent = 1;
}

eteindreTout();
switch (etatFeux) {
case 0:
BROCHE_LED_VERTA = 1;
BROCHE_LED_ROUGEB = 1;
break;
case 1:
BROCHE_LED_JAUNEA = 1;
BROCHE_LED_ROUGEB = 1;
temporisation_ms(4000);
etatFeux = 2;
break;
case 2:
BROCHE_LED_ROUGEA = 1;
BROCHE_LED_ROUGEB = 1;
break;
case 3:
BROCHE_LED_ROUGEA = 1;
BROCHE_LED_VERTB = 1;
break;
case 4:
BROCHE_LED_ROUGEA = 1;
BROCHE_LED_JAUNEB = 1;
temporisation_ms(4000);
etatFeux = 5;
break;
case 5:
BROCHE_LED_ROUGEA = 1;
BROCHE_LED_ROUGEB = 1;
break;
}
}

void modeAutomatique(void) {
eteindreTout();
BROCHE_LED_VERTA = 1;
BROCHE_LED_ROUGEB = 1;
temporisation_ms(10000);

BROCHE_LED_VERTA = 0;
BROCHE_LED_JAUNEA = 1;
temporisation_ms(4000);

BROCHE_LED_JAUNEA = 0;
BROCHE_LED_ROUGEA = 1;
temporisation_ms(4000);

BROCHE_LED_ROUGEB = 0;
BROCHE_LED_VERTB = 1;
temporisation_ms(10000);

BROCHE_LED_VERTB = 0;
BROCHE_LED_JAUNEB = 1;
temporisation_ms(4000);

BROCHE_LED_JAUNEB = 0;
BROCHE_LED_ROUGEB = 1;
temporisation_ms(4000);
}
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.

satinas
Expert
Expert
Messages : 1497
Enregistré en : novembre 2015

Problème de compilation

Messagepar satinas » ven. 20 déc. 2024 15:51

Bonjour,

Le compilateur fournit aussi une une fonction __delay_ms() en plus de __delay_us()
Ces fonctions delay du compilateur ont besoin qu'on leur donne la fréquence de l'horloge cpu, pour se calibrer en exécutant un nombre précis de cycles cpu. Il faut pour cela ajouter un define, par exemple pour un quartz de 8 MHz :
#define _XTAL_FREQ 8000000

Les lignes commentaires en C ne commencent pas par un ; il faut mettre // en début de ligne.
Cela donne pour le début du programme :

// Configuration du microcontrôleur PIC16F877
#include <xc.h>
#define _XTAL_FREQ 8000000

Sw338965
Amateur
Amateur
Messages : 114
Enregistré en : décembre 2024

Problème de compilation

Messagepar Sw338965 » ven. 20 déc. 2024 16:33

Merci pour ton aide. Je l'ai ajouté à mon code.
Pour le reste, une fois modifié, est ce que je peux le compiler avec MPLAB X IDE XC8 pour obtenir un fichier hex?

// Configuration du microcontrôleur PIC16F877
#include <xc.h>
#define _XTAL_FREQ 8000000
https://sdcc.sourceforge.net/

; Configuration des bits de configuration
#pragma config FOSC = XT // Oscillateur XT
#pragma config WDTE = OFF // Watchdog Timer (Désactivé)
#pragma config PWRTE = ON // Power-up Timer (Activé)
#pragma config CP = OFF // Code Protection (Désactivé)

; Définitions des broches
#define BROCHE_LED_VERTA PORTBbits.RB2
#define BROCHE_LED_ROUGEA PORTBbits.RB3
#define BROCHE_LED_JAUNEA PORTBbits.RB4
#define BROCHE_LED_VERTB PORTBbits.RB5
#define BROCHE_LED_ROUGEB PORTBbits.RB6
#define BROCHE_LED_JAUNEB PORTBbits.RB7

#define BROCHE_INTER_CLIG1 PORTAbits.RA0
#define BROCHE_INTER_CLIG2 PORTAbits.RA1
#define BROCHE_BOUTON_MANUEL PORTAbits.RA2

; Prototypes des fonctions
void initialisation(void);
void eteindreTout(void);
void temporisation_ms(unsigned int ms);
void modeClignotement(void);
void modeManuel(void);
void modeAutomatique(void);

; Variables globales
unsigned char etatFeux = 0;
unsigned char boutonPrecedent = 1;
unsigned int dernierAppui = 0;

void main(void) {
initialisation();

while (1) {
if (BROCHE_INTER_CLIG1 == 0) {
modeClignotement();
} else if (BROCHE_INTER_CLIG2 == 0) {
modeManuel();
} else {
modeAutomatique();
}
}
}

void initialisation(void) {
TRISA = 0b00000111; // RA0, RA1, RA2 en entrée
TRISB = 0b00000000; // Tout PORTB en sortie
PORTA = 0x00; // Initialiser PORTA
PORTB = 0x00; // Initialiser PORTB
}

void eteindreTout(void) {
PORTB = 0x00;
}

void temporisation_ms(unsigned int ms) {
unsigned int i;
unsigned char j;
for (i = 0; i < ms; i++) {
for (j = 0; j < 250; j++) {
__delay_us(4); // Délai de 4µs pour un oscillateur à 8 MHz
}
}
}

void modeClignotement(void) {
eteindreTout();
while (BROCHE_INTER_CLIG1 == 0) {
BROCHE_LED_JAUNEA = 1;
BROCHE_LED_JAUNEB = 1;
temporisation_ms(700);
BROCHE_LED_JAUNEA = 0;
BROCHE_LED_JAUNEB = 0;
temporisation_ms(500);
}
}

void modeManuel(void) {
unsigned int tempsActuel = 0;
if (BROCHE_BOUTON_MANUEL == 0 && boutonPrecedent == 1) {
etatFeux = (etatFeux + 1) % 6;
boutonPrecedent = 0;
} else if (BROCHE_BOUTON_MANUEL == 1) {
boutonPrecedent = 1;
}

eteindreTout();
switch (etatFeux) {
case 0:
BROCHE_LED_VERTA = 1;
BROCHE_LED_ROUGEB = 1;
break;
case 1:
BROCHE_LED_JAUNEA = 1;
BROCHE_LED_ROUGEB = 1;
temporisation_ms(4000);
etatFeux = 2;
break;
case 2:
BROCHE_LED_ROUGEA = 1;
BROCHE_LED_ROUGEB = 1;
break;
case 3:
BROCHE_LED_ROUGEA = 1;
BROCHE_LED_VERTB = 1;
break;
case 4:
BROCHE_LED_ROUGEA = 1;
BROCHE_LED_JAUNEB = 1;
temporisation_ms(4000);
etatFeux = 5;
break;
case 5:
BROCHE_LED_ROUGEA = 1;
BROCHE_LED_ROUGEB = 1;
break;
}
}

void modeAutomatique(void) {
eteindreTout();
BROCHE_LED_VERTA = 1;
BROCHE_LED_ROUGEB = 1;
temporisation_ms(10000);

BROCHE_LED_VERTA = 0;
BROCHE_LED_JAUNEA = 1;
temporisation_ms(4000);

BROCHE_LED_JAUNEA = 0;
BROCHE_LED_ROUGEA = 1;
temporisation_ms(4000);

BROCHE_LED_ROUGEB = 0;
BROCHE_LED_VERTB = 1;
temporisation_ms(10000);

BROCHE_LED_VERTB = 0;
BROCHE_LED_JAUNEB = 1;
temporisation_ms(4000);

BROCHE_LED_JAUNEB = 0;
BROCHE_LED_ROUGEB = 1;
temporisation_ms(4000);
}

satinas
Expert
Expert
Messages : 1497
Enregistré en : novembre 2015

Problème de compilation

Messagepar satinas » ven. 20 déc. 2024 16:43

Oui, il passera sur MBLABX avec le compilateur xc8, mais je vois encore plein de points-virgules dans ton programme :-)
Tu les sors d'où tous ces points-virgules, origine du programme ?

Sw338965
Amateur
Amateur
Messages : 114
Enregistré en : décembre 2024

Problème de compilation

Messagepar Sw338965 » sam. 21 déc. 2024 08:43

C'est au départ un programme que j'ai réalisé sur ARDINO, puis à l'âge que j'ai (75 ans) je me suis fais aidé par "CHAT GPT4" pour le faire transformé en fichier asm. J'ai eu bien du mal à utiliser MPLAB X IDE XC8 pour essayer de le compiler et maintenant je me retrouve avec un programme bancale en "C"! Je fais ce que je peux mais j'avoue que c'est bien compliqué pour moi. Merci pour ton aide.
Je viens de le remodifier:

// Configuration du microcontrôleur PIC16F877
#include <xc.h>
#define _XTAL_FREQ 8000000

// Configuration des bits de configuration
#pragma config FOSC = XT // Oscillateur XT
#pragma config WDTE = OFF // Watchdog Timer (Désactivé)
#pragma config PWRTE = ON // Power-up Timer (Activé)
#pragma config CP = OFF // Code Protection (Désactivé)

// Définitions des broches
#define BROCHE_LED_VERTA PORTBbits.RB2
#define BROCHE_LED_ROUGEA PORTBbits.RB3
#define BROCHE_LED_JAUNEA PORTBbits.RB4
#define BROCHE_LED_VERTB PORTBbits.RB5
#define BROCHE_LED_ROUGEB PORTBbits.RB6
#define BROCHE_LED_JAUNEB PORTBbits.RB7

#define BROCHE_INTER_CLIG1 PORTAbits.RA0
#define BROCHE_INTER_CLIG2 PORTAbits.RA1
#define BROCHE_BOUTON_MANUEL PORTAbits.RA2

// Prototypes des fonctions
void initialisation(void);
void eteindreTout(void);
void temporisation_ms(unsigned int ms);
void modeClignotement(void);
void modeManuel(void);
void modeAutomatique(void);

// Variables globales
unsigned char etatFeux = 0;
unsigned char boutonPrecedent = 1;
unsigned int dernierAppui = 0;

void main(void) {
initialisation();

while (1) {
if (BROCHE_INTER_CLIG1 == 0) {
modeClignotement();
} else if (BROCHE_INTER_CLIG2 == 0) {
modeManuel();
} else {
modeAutomatique();
}
}
}

void initialisation(void) {
TRISA = 0b00000111; // RA0, RA1, RA2 en entrée
TRISB = 0b00000000; // Tout PORTB en sortie
PORTA = 0x00; // Initialiser PORTA
PORTB = 0x00; // Initialiser PORTB
}

void eteindreTout(void) {
PORTB = 0x00;
}

void temporisation_ms(unsigned int ms) {
unsigned int i;
unsigned char j;
for (i = 0; i < ms; i++) {
for (j = 0; j < 250; j++) {
__delay_us(4); // Délai de 4µs pour un oscillateur à 8 MHz
}
}
}

void modeClignotement(void) {
eteindreTout();
while (BROCHE_INTER_CLIG1 == 0) {
BROCHE_LED_JAUNEA = 1;
BROCHE_LED_JAUNEB = 1;
temporisation_ms(700);
BROCHE_LED_JAUNEA = 0;
BROCHE_LED_JAUNEB = 0;
temporisation_ms(500);
}
}

void modeManuel(void) {
unsigned int tempsActuel = 0;
if (BROCHE_BOUTON_MANUEL == 0 && boutonPrecedent == 1) {
etatFeux = (etatFeux + 1) % 6;
boutonPrecedent = 0;
} else if (BROCHE_BOUTON_MANUEL == 1) {
boutonPrecedent = 1;
}

eteindreTout();
switch (etatFeux) {
case 0:
BROCHE_LED_VERTA = 1;
BROCHE_LED_ROUGEB = 1;
break;
case 1:
BROCHE_LED_JAUNEA = 1;
BROCHE_LED_ROUGEB = 1;
temporisation_ms(4000);
etatFeux = 2;
break;
case 2:
BROCHE_LED_ROUGEA = 1;
BROCHE_LED_ROUGEB = 1;
break;
case 3:
BROCHE_LED_ROUGEA = 1;
BROCHE_LED_VERTB = 1;
break;
case 4:
BROCHE_LED_ROUGEA = 1;
BROCHE_LED_JAUNEB = 1;
temporisation_ms(4000);
etatFeux = 5;
break;
case 5:
BROCHE_LED_ROUGEA = 1;
BROCHE_LED_ROUGEB = 1;
break;
}
}

void modeAutomatique(void) {
eteindreTout();
BROCHE_LED_VERTA = 1;
BROCHE_LED_ROUGEB = 1;
temporisation_ms(10000);

BROCHE_LED_VERTA = 0;
BROCHE_LED_JAUNEA = 1;
temporisation_ms(4000);

BROCHE_LED_JAUNEA = 0;
BROCHE_LED_ROUGEA = 1;
temporisation_ms(4000);

BROCHE_LED_ROUGEB = 0;
BROCHE_LED_VERTB = 1;
temporisation_ms(10000);

BROCHE_LED_VERTB = 0;
BROCHE_LED_JAUNEB = 1;
temporisation_ms(4000);

BROCHE_LED_JAUNEB = 0;
BROCHE_LED_ROUGEB = 1;
temporisation_ms(4000);
}

Jérémy
Administrateur du site
Administrateur du site
Messages : 2750
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

Problème de compilation

Messagepar Jérémy » sam. 21 déc. 2024 09:15

 ! Message de modération :
SAlut à tous,

@Sw338965, afin de faciliter la lecture de tes messages merci de bien vouloir utilsier les balises "code" pour mettre ton code stp.
voici le tuto : Lient vers tuto

Merci à toi
C'est en faisant des erreurs, que l'on apprend le mieux !!!

satinas
Expert
Expert
Messages : 1497
Enregistré en : novembre 2015

Problème de compilation

Messagepar satinas » sam. 21 déc. 2024 09:32

Bonjour à tous,
le point-virgule en ASM est justement l'équivalent du // en langage C, d'où la confusion. Ton programme est en C, donc il faut des //. Le C est beaucoup plus simple que le C++ utilisé par Arduino.

Pour MPLABX, télécharge la dernière version de MPLABX et du compilateur xc8. Ensuite crée un nouveau projet de type "Standalone projet" et sélectionne le compilateur xc8. Dans la fenêtre "Projets" sous-dossier "Source files" un clic droit pour ajouter le fichier source C avec "Add existing item", c'est tout.
La compilation et la programmation du pic se font en cliquant sur l'icône flèche verte en haut. Si tu veux juste produire le fichier hex, c'est l'icône marteau.

Bon cette fois j'ai lu la totalité de ton message :-) et je suis perdu. Tu veux faire du C ou de l'ASM ?
Modifié en dernier par satinas le sam. 21 déc. 2024 10:23, modifié 1 fois.

Sw338965
Amateur
Amateur
Messages : 114
Enregistré en : décembre 2024

Problème de compilation

Messagepar Sw338965 » sam. 21 déc. 2024 10:20

MPLAB avec XC8 est déjà installé, et dans la version 6.20, après avoir choisi "new project, il n'y a pas "Standalone".
J'ai le choix entre:
Microchip Embedded, Other Embedded ou Generic.
Si je clique sur"Microchip Embeded,
j'ai le choix entre:
Application Project, Prebuilt Makefile Project ou Librairy Project.

satinas
Expert
Expert
Messages : 1497
Enregistré en : novembre 2015

Problème de compilation

Messagepar satinas » sam. 21 déc. 2024 10:27

Je n'ai pas encore installé la 6.2.
En 6.00, il y a 2 colonnes, à gauche "Microchip Embedded", à droite "Standalone Project".
Quand on sélectionne "Standalone Project", il sélectionne automatiquement "Microchip Embedded".
Tu dois sélectionner "Application Project".
Tu es sûr que tu veux faire du C et pas de l'ASM, car tu parles des 2.
Et pourquoi passer à Microchip, Arduino c'est bien aussi :-)

Sw338965
Amateur
Amateur
Messages : 114
Enregistré en : décembre 2024

Problème de compilation

Messagepar Sw338965 » sam. 21 déc. 2024 14:56

En clair, ce que je veux, c'est obtenir un fichier hex compatible avec le Pic 16F877A. Moi, je vais utiliser mon Pic K150 pour le programmer.
Donc peu importe asm ou C. Si tu penses que l'un des deux est plus facile pour un profane, peu importe.
Si je suis passé de ARDINO à asm ou C, c'est que je voulais pouvoir utiliser ce PIC qui permet davantage de possibilités que l'ATMEGA328P.
De plus, je n'ai pas vu comment on pouvais programmer un PIC avec un programme d'ARDINO.


Retourner vers « Langage C »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 6 invités