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 ---
Forum général sur le langage C !

Modérateur : Jérémy

Problème de compilation
Sw338965
Amateur
Amateur
Messages : 114
Enregistré en : décembre 2024

#1 Message par 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.

Problème de compilation
satinas
Expert
Expert
Messages : 1487
Enregistré en : novembre 2015

#2 Message par 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

Problème de compilation
Sw338965
Amateur
Amateur
Messages : 114
Enregistré en : décembre 2024

#3 Message par 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);
}

Problème de compilation
satinas
Expert
Expert
Messages : 1487
Enregistré en : novembre 2015

#4 Message par 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 ?

Problème de compilation
Sw338965
Amateur
Amateur
Messages : 114
Enregistré en : décembre 2024

#5 Message par 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);
}

Problème de compilation
Jérémy
Administrateur du site
Administrateur du site
Messages : 2750
Âge : 46
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#6 Message par 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 !!!

Problème de compilation
satinas
Expert
Expert
Messages : 1487
Enregistré en : novembre 2015

#7 Message par 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.

Problème de compilation
Sw338965
Amateur
Amateur
Messages : 114
Enregistré en : décembre 2024

#8 Message par 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.

Problème de compilation
satinas
Expert
Expert
Messages : 1487
Enregistré en : novembre 2015

#9 Message par 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 :-)

Problème de compilation
Sw338965
Amateur
Amateur
Messages : 114
Enregistré en : décembre 2024

#10 Message par 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 2 invités