bonjour,
actuellement en terminale sti génie electronique, j'ai un thème du bac à realiser. Le problème c'est que mon programme se compile mais il y a des erreurs qui sont les suivantes:
L 134: argument is out of range
L 134: error fatal
L134: ";" expected but ) found
voici mon programme
la ligne 134 est celle qui est en rouge.
Je vous prie de bien vouloir m'aider à trouver une solution à ce problème.
cordialement
// DECLARATION DES BIBLIOTHEQUES
#include "LCD_I2C_valence.h" // bibliothèque perso : gestion de l'afficheur LCD I2C Batron
#include "Fonctions_diverses_seq4.h " // biblio perso : divers
////////////////////// DECLARATION DES EQUIVALENCES ///////////////////////////////////
#define LED_R PORTBbits.RB5 // LED Rouge sur RB5
#define LED_V PORTBbits.RB2 // LED Verte sur RB2
#define BP_MENU PORTCbits.RC4 // BP_MENU sur RC4/INT1
#define BP_MOINS PORTCbits.RC1 // BP_MOINS sur RC1
#define BP_PLUS PORTCbits.RC2 // BP_PLUS sur RC2
#define BP_ENTER PORTCbits.RC3 // BP_ENTER sur RC3/INT0
#define COLOR 1 // POT "COLOR" sur canal analogique 1 (AN1)
#define DIM 2 // POT "DIM" sur canal analogique 2 (AN2)
#define RX_DMX PORTCbits.RC7 // RX_DMX : entrée de réception DMX sur RC7
#define Adr_MOTEURS 0x42 // Adresse I2C carte Moteurs sur 8 bits (avec R/W =0)
#define Adr_LCD 0x76 // Adresse I2C de l'afficheur LCD BARTON (avec R/W =0)
#define MANU 0 // Le mode MANUEL est associé à 0
#define AUTO 1 // Le mode AUTOMATIQUE est associé à 1
#define DMX5CH 2 // Le mode DMX 5 CANAUX est associé à 2
#define LENTE 25 // Nb de tempo de 100 ms à faire en MODE AUTO et vitesse lente
#define VITESSE_DMX 16 // Nb de tempo de 100 ms à effectuer en MODE DMX
#define RAPIDE 13 // Nb de tempo de 100 ms à faire en MODE AUTO et vitesse rapide
#define ENFONCE 0 // Un Bouton Poussoir enfoncé place l'entrée du pic à 0
#define RELACHE 1 // Un Bouton Poussoir relaché place l'entrée du pic à 1
//////////////////////// DECLARATION DES VARIABLES ////////////////////////////////////
/////////// variables utilisées à partir de la séquence 4 //////////////
unsigned char Dose_R, Dose_V, Dose_B ; // Doses entre 0 et 255 de Rouge, de Vert et de Bleu
unsigned char COULEUR_MACROS; // Canal correspondant au choix de la couleur
unsigned int Alpha_R, Alpha_V, Alpha_B ; // rapports cycliques des sorties Rouge, Vert et Bleu
unsigned int Toff; // durée d'extinction en mode stroboscope
unsigned int Intensite =0; // Intensité de l'éclairage
unsigned int DIMMER_STROBE; // Canal correspondant au choix du mode d'éclairage
/////////// variables utilisées à partir de la séquence 5 ////////////////////////////
unsigned char Mode_lyre=AUTO ; // forçage de la variable Mode_Lyre à la valeur Auto
unsigned char Vitesse_auto; // Valeur de la vitesse en mode auto (LENTE ou RAPIDE)
unsigned char PAN, TILT; // Valeur du PAN et du TILT à transmettre à la carte GESTION MOTEUR
unsigned char DMX_adresse; // Adresse DMX de base de la lyre
unsigned char v;
unsigned char chaine_DMX[4]; // chaine des caractères ascii composant l'adresse DMX (pour affichage)
unsigned char Config =0; // nouvelle configuration de la lyre
unsigned char Config_ex =255; // ancienne configuration de la lyre
unsigned char BP_PLUS_ex =1; // mémorisation de l'état du bouton poussoir BP_PLUS
unsigned char BP_MOINS_ex =1; // mémorisation de l'état du bouton poussoir BP_MOINS
unsigned char BP_MENU_actif =0; // variable indiquant l'appui sur BP_MENU
unsigned char BP_ENTER_actif =0; // variable indiquant l'appui sur BP_ENTER
//////////// variables utilisées à partir de la séquence 7 (DMX) /////////////////////////////
unsigned int t =0;
unsigned int th =0;
unsigned char trame =0;
unsigned char i =0;
unsigned char j=0;
unsigned char OCTET_RECU;
unsigned char canaux_DMX[4]; // chaine des caractères ascii composant l'adresse DMX (pour affichage)
//////////// variable utilisée pour la séquence 8
unsigned char ctr =0;
//////////////////////// DECLARATION DES FONCTIONS ////////////////////////////////////////
FONCTIONS DE GESTION DE L'ECLAIRAGE ///////////////////////////////////////
//////////////////// UTILISEES A PARTIR DE LA SEQUENCE 4
// Cette fonction détermine les valeurs de Dose_R, Dose_V et Dose_B selon
// la valeur du canal COULEUR_MACROS ("Macro de couleur")
// pas de paramètre d'entrée, pas de paramètre de sortie
// SEQUENCE 4 : A COMPLETER PAR LES ELEVES
void COULEURMACRO(void)
{
}
// Cette fonction détermine la valeur de chaque rapport cyclique sur 14 bits puis
// permet d'affecter les 6 registres de rapport cycliques du module PWM du pic
// pas de paramètre d'entrée, pas de paramètre de sortie
// SEQUENCE 4 : A COMMENTER PAR LES ELEVES
void Ecriture_PWM(void)
{
Alpha_R = Dose_R * Intensite;
Alpha_R=Alpha_R>>2;
Alpha_V = Dose_V * Intensite;
Alpha_V=Alpha_V>>2;
Alpha_B = Dose_B * Intensite;
Alpha_B=Alpha_B>>2;
PDC0L=Alpha_R;
PDC0H=Alpha_R >>8;
PDC1L=Alpha_V;
PDC1H=Alpha_V >>8;
PDC2L=Alpha_B;
PDC2H=Alpha_B >>8;
}
// Cette fonction détermine la valeur de l' Intensite et le réglage du stroboscope
// selon la valeur du canal DIMMER_STROBE
// DIMMER_STROBE sera déterminé dans main() en fonction du mode de fonctionnement
// pas de paramètre d'entrée, pas de paramètre de sortie
// SEQUENCE 4 : A COMPLETER PAR LES ELEVES
void DIMMERSTROBE(void)
{
}
// Cette fonction envoie le PAN, le TILT et la VITESSE en I2C à la carte "gestion moteurs pas à pas"
// d'adresse Adr_MOTEURS
// 3 paramètres d'entrées : p pour le PAN, t pour le TILT et v pour la vitesse
// pas de paramètre de sortie
// SEQUENCE 5 : A COMPLETER PAR LES ELEVES
void I2C_PAN_TILT_VITESSE(unsigned char p,unsigned char t, unsigned char v)
{
Soft_I2C_Config(&PORTC,15,16); // Instruction de MikroC
Soft_I2C_Start();
Soft_I2C_Write(Adr_LCD);
Soft_I2C_Write(p);
Soft_I2C_Write(t);
Soft_I2C_Write(v);
}
// Cette fonction permet l'affichage du mode de fonctionnement : MANU, AUTO ou DMX
// Cette fonction ne doit être appellée que si la configuration (Config) vient de changer (géré dans main())
// pas de paramètre d'entrée, pas de paramètre de sortie
// SEQUENCE 5 : A COMPLETER PAR LES ELEVES
void affichage_mode(void) //fonction affichage_mode
{
if (Mode_lyre == Manu)
{
lcd_i2c_init( );
lcd_i2c_clear( );
lcd_i2c_puts("MODE MANUEL"); //affichage sur la première ligne
lcd_i2c_gotoxy(0,1); // aller à la seconde ligne1
lcd_i2c_puts("REGLAGE PAR POTs"); // affichage sur la seconde ligne
}
if (Mode_lyre == Auto)
{
lcd_i2c_init( );
lcd_i2c_clear( );
lcd_i2c_puts("MODE AUTOMAT"); //affichage sur la première ligne
lcd_i2c_gotoxy(0,1); // aller à la seconde ligne1
lcd_i2c_puts("IQUE"); // affichage sur la seconde ligne
if (Vitesse_auto == LENTE)
{
lcd_i2c_init( );
lcd_i2c_clear( );
lcd_i2c_puts ("VITESSE LENTE");
}
if (Vitesse_auto == RAPIDE)
{
lcd_i2c_init( );
lcd_i2c_clear( );
lcd_i2c_puts ("VITESSE RAPIDE");
}
}
if (Mode_lyre == DMX5CH)
{
lcd_i2c_init( );
lcd_i2c_clear( );
lcd_i2c_puts ("VITESSE RAPIDE");// affichage sur la première ligne
lcd_i2c_gotoxy(0,1);// aller sur la deuxième ligne
lcd_i2c_puts ("5CH ADR=");// affichage sur la deuxième ligne
lcd_i2c_gotoxy(12,1);
ByteToStr(DMX_adresse,&chaine_ DMX);// curseur en 13ème (0 à 12) position de la ligne1 (la 2nde)
//la stocke dans chaine_DMX[]
lcd_i2c_puts_ram (chaine_DMX); // // affichage de l'adresse DMX en fin de 2nde ligne
}
}
// Cette fonction détermine la valeur des canaux PAN, TILT, DIMMER_STROBE et COULEUR_MACROS reçus par DMX
// pas de paramètre d'entrée, pas de paramètre de sortie
// Fonctionne , y compris en changeant d'adresse : Bug parfois en mode stroboscope
// SEQUENCE 7 : Cette fonction est fournie aux élèves
void DMX_LYRE(void)
{
while (RX_DMX==1) // test si DMX=1 (entre 2 trames)
{
th=th+1;
Delay100TCYx(5); // attente de 100 µs
if (th > 500) // résout le bloquage du programme lorsqu'on débranche le
{ // cable DMX : entrée reste à l'état haut
break;
}
}
if (th>10) // test si plus de 1 ms d'état haut
{
if (th<250) // test si moins de 25 ms d'état haut
{
while (RX_DMX==0) // test si DMX=0 pendant >88 us (Synchro Trame DMX)
{
t=t+1;
}
if (t>18) // test si synchro-trame 80us alors trame= 1 (t=18 pour 20MHz)
{
if (t<100) // 100 pour 20MHz
{
trame=1; // début de trame DMX detecté
RCSTAbits.CREN=0;
RCSTAbits.CREN=1; // re-initialisation de l'usart
}
}
t=0; // remise à 0 du compteur de durée d'état bas
while (trame==1) // tant que l'on travaille sur la même trame
{
if (USART_Data_Ready()) // si octet série reçu
{
if (USART_READ()==0) // TEST si Synchro et 1er octet à 0.(startcode)
{
i=i+1;
}
}
if (i==1) // si Séquence d'initialisation détectée
{
j=1; // adresse à 1
while (j<(DMX_adresse+1)) // lecture jusqu'à la bonne adresse.
{
if (USART_Data_Ready()) // si octet série reçu
{
i =USART_READ(); // lecture canal
j=j+1; // incrémentation d'adresse
}
}
LED_R=!LED_R; // LED rouge clignote à chaque réception des 4 octets
PAN=i; // canal DMX correspondant à l'adresse mis dans donnée.
while (!USART_Data_Ready()); // si octet série reçu
TILT =USART_READ(); // lecture canal
while (!USART_Data_Ready()); // si octet série reçu
DIMMER_STROBE =USART_READ(); // lecture canal
while (!USART_Data_Ready()); // si octet série reçu
COULEUR_MACROS =USART_READ(); // Pour projecteurlecture canal
trame=0; // fin de réception des 4 canaux DMX
RCSTAbits.CREN=0; // USART désactivé car inutile jusqu'à la prochaine trame
// delay_ms(2); // Pour éviter d'analyser la même trame : attente de 2 ms
} // fin de if (i==1)
} //fin de while (trame==1)
i=0;
}
}
th=0; // remise à 0 du compteur d'état haut
} // fin de la fonction DMX_F
// Non indispensable : pour debug ou bonus (fournie aux élèves)
// Cette fonction affiche la valeur en décimal (en nombres signés hélas) des canaux DMX
// sur la deuxième ligne de l'afficheur LCD
void affichage_canaux(void)
{
lcd_i2c_gotoxy(0,1); //curseur 2ème ligne, 1er caractere
btoa(PAN, &canaux_DMX); // calcule la chaine des caractères ascii de DMX_adresse et la stocke dans chaine_DMX[]
lcd_i2c_puts_ram (canaux_DMX); // affichage de l'adresse DMX en fin de 2nde ligne
lcd_i2c_putchar (' ');
btoa(TILT, &canaux_DMX); // calcule la chaine des caractères ascii de DMX_adresse et la stocke dans chaine_DMX[]
lcd_i2c_puts_ram (canaux_DMX); // affichage de l'adresse DMX en fin de 2nde ligne
lcd_i2c_putchar (' ');
btoa(DIMMER_STROBE, &canaux_DMX); // calcule la chaine des caractères ascii de DMX_adresse et la stocke dans chaine_DMX[]
lcd_i2c_puts_ram (canaux_DMX); // affichage de l'adresse DMX en fin de 2nde ligne
lcd_i2c_putchar (' ');
btoa(COULEUR_MACROS, &canaux_DMX); // calcule la chaine des caractères ascii de DMX_adresse et la stocke dans chaine_DMX[]
lcd_i2c_puts_ram (canaux_DMX); // affichage de l'adresse DMX en fin de 2nde ligne
lcd_i2c_putchar (' ');
}
// Cette fonction gère les réglages liés à l'appui sur BP_ENTER :
// en mode AUTO : choix de la vitesse LENTE ou RAPIDE par BP_MOINS et BP_PLUS
// en mode DMX : réglage de l'adresse de base par BP_MOINS et BP_PLUS
// pas de paramètre d'entrée, pas de paramètre de sortie
// SEQUENCE 8 : A COMPLETER PAR LES ELEVES
void Reglage_BPs(void)
{
}
//// Cette fonction permet de retrouver à la mise sous tension la lyre dans la configuration précedant
// la mise hors tension. Les paramètres Mode_lyre, Vitesse_auto et DMX_adresse sont lus en EEPROM
// pas de paramètre d'entrée, pas de paramètre de sortie
// SEQUENCE 8 : A COMPLETER PAR LES ELEVES
void lire_config_EEPROM(void)
{
}
// FONCTIONS DE GESTION DES INTERRUPTIONS
// CONFIGURATION DU DECLENCHEMENT DES INTERRUPTIONS
// Cette fonction est fournie aux élèves.
void init_interrupt(void)
{
INTCON= 0b11010000; // pour debug : INTCON.1 passe à 1 même sans activer les interruptions
INTCON2=0b10000100;
INTCON3=0b11001000;
}
// FONCTION (SOUS-PROGRAMME) D'INTERRUPTION
// Cette fonction est fournie aux élèves
void MyInterrupt(void); // fonction contenant le code de l'interruption
#pragma code highVector=0x008 // on déclare que lors d'une interruption
void atInterrupthigh(void)
{
_asm GOTO MyInterrupt _endasm // on doit éxecuter le code de la fonction MyHighInterrupt
}
#pragma code // retour à la zone de code
#pragma interrupt MyInterrupt
void MyInterrupt(void)
{
// delay_ms(20); // anti-rebond
INTCONbits.GIE=0; // on inhibe toutes les interruptions
if (INTCON3bits.INT1IF==1) // si l'interruption est provoquée par l'appui sur BPmenu
{
BP_MENU_actif=1; // variable à 1 : mémorisation de la demande de changement de mode
INTCON3bits.INT1IF =0; // remise à 0 du drapeau d'interruption
}
if(INTCONbits.INT0IF==1) // si l'interruption est provoquée par l'appui sur BPenter
{
BP_ENTER_actif=1; // mémorisation de la demande de changement de configuration
INTCONbits.INT0IF=0; // remise à 0 du drapeau d'interruption
}
INTCONbits.GIE=1; // on autorise à nouveau les interruptions
Config=Config+1; // Cette variable, qui change à chaque interruption,
} // servira à raffraichir l'affichage du mode
/////////////////////////// FONCTION PRINCIPALE MAIN
void main( void )
{
if (Mode_lyre==AUTO)
{
DIMMER_STROBE= 255;
COULEUR_MACROS= rand();
TILT = rand();
PAN = rand();
}
I2C_PAN_TILT_VITESSE (PAN, TILT,Vitesse_Auto) ;
}
-----