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 ---
- 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 ---
Modérateur : Jérémy
Problème de compilation
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);
}
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
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
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
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);
}
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
Problème de compilation
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);
}
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
Problème de compilation
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 ?
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
Modifié en dernier par satinas le sam. 21 déc. 2024 10:23, modifié 1 fois.
Problème de compilation
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.
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
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
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
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.
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.
Qui est en ligne
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 2 invités



