//---------------------------------------------------------------------------- // Branche : Trvail de Bachelor 2012 // Nom du projet : Capteur Anémométrique à US // Nom du fichier : main.c // Date de création : 08.09.2012 // Date de modification : xx.xx.xxxx // // Auteur : Philippe Bovey // Infos : // http://new.weavesilk.com/ // http://www.microchip.com/wwwproducts/Devices.aspx?dDocName=en546064 //---------------------------------------------------------------------------- //----------------------------------------------------------------------------// //--- fichiers d'entêtes ---// // pour chemin pour inclure le header file du composant : // C:\Program Files\Microchip\MPLAB C30\support\dsPIC33F\h //----------------------------------------------------------------------------// #include #include //#include "lcd.h" //----------------------------------------------------------------------------// //--- Configuration des fusibles ---// //----------------------------------------------------------------------------// //--- Choix du type d'oscillateur ---// /*_FOSCSEL(FNOSC_PRI); // choix oscillateur à quartz //--- Configuration de l'oscillateur ---// // Pas d'acivation au niveau contrôle du l'oscilateur // Ne pas activer la PIN OSC2 en mode IN/OUT // Choix de l'oscillateur XT --> < 20MHz _FOSC(FCKSM_CSDCMD & OSCIOFNC_OFF & POSCMD_XT); //--- Configuration du Watchdog ---// _FWDT(FWDTEN_OFF); */ //----------------------------------------------------------------------------// //--- Variables Globales ---// //----------------------------------------------------------------------------// const double CST_ADI = 1.4; // constante adiabatique const double R = 8.315; // constante R const double M_M = 0.0288; // constante masse molaire int axe_X; int axe_Y; //----------------------------------------------------------------------------// //--- Programme Principal ---// //----------------------------------------------------------------------------// int main (void) { /* //--- définition de variables utilisés dans le programme ---// char msg1[] = "Demo Prog HEIG"; // message 1 char msg2[] = "TDP 2012"; // message 2 //--- configuration de l'oscillateur interne à 40Mhz ---// // utilisation fomrules du datasheet du DSPic33FJ256GP710A --> page 146 // Fcy = Fosc / 2 ; Fosc = Fin(M/(N1 N2)) // Fin = 8Mhz --> Fosc = 80Mhz --> Fcy = 40Mhz PLLFBD = 40; // M CLKDIVbits.PLLPRE = 0; // N1 = 2 CLKDIVbits.PLLPOST = 0; // N2 = 2 //--- initialisation de l'affichage ---// Init_LCD(); //--- message de bienvenu ---// home_clr(); // efface le display // puts_lcd( (char*) &mytext[0], sizeof(mytext) -1 ); puts_lcd((char*) &msg1[0], sizeof(msg1) - 1); line_2(); puts_lcd((char*) &msg2[0], sizeof(msg2) - 1); */ } // /* //----------------------------------------------------------------------------// //--- décalaration de structure ---// //----------------------------------------------------------------------------// typedef struct { char normal; char veille; }sMode; //----------------------------------------------------------------------------// //--- Variables Globales ---// //----------------------------------------------------------------------------// sMode mode_systeme; // variable pour la structure int compteur = 0; // variable pour le compteur int compteur_veille; // variable pour l'enregistrement en mode veilles int compteur_touche; //----------------------------------------------------------------------------// //--- Initialisation Entrées-Sorties ---// //----------------------------------------------------------------------------// void init_entree_sortie() { //--- configuration des ports d'entrées //------------------------------------- //--- partie logique //--- PORT_B TRISBbits.TRISB0 = 1; // entrée logique sur le port B-1 --> bouton S3 //--- configuration des ports d'entrées //------------------------------------- //--- partie logique //--- PORT_B TRISBbits.TRISB1 = 0; // sortie --> led D3 TRISBbits.TRISB2 = 0; // sortie --> led D4 TRISBbits.TRISB3 = 0; // sortie --> led d5 } //----------------------------------------------------------------------------// //--- Initialisation du TIMER1 ---// //----------------------------------------------------------------------------// void init_timer1() { //--- Valeur de chargement du Timer1 pour une fréquence de 1Hz //------------------------------------------------------------ // 32768 = 65536 - 32768 => 0x8000 --> voir calcul sur la feuille de donnée TMR1L = 0x00; TMR1H = 0x80; //--- Configuration du registre du Timer1 (registre T1CON) //--------------------------------------- T1CONbits.TMR1ON = 1; // activation du timer1 --> ici à l'allumage du PIC T1CONbits.TMR1CS = 1; // choix de l'entrée de la clock --> 32768kHz // choix : RC0/T1OSO/T13CKI T1CONbits.T1SYNC = 1; // choix de la sysnchronisation avec clock externe // ici non donc -> 1 T1CONbits.T1OSCEN = 1; // activation de l'oscillateur du Timer1 //--- choix du diviseur par rapport à la clock //-------------------------------------------- T1CONbits.T1CKPS0 = 0; // diviseur 1/1 T1CONbits.T1CKPS0 = 0; T1CONbits.T1RUN = 0; // choix de la clock Timer1 ou d'une autre source T1CONbits.RD16 = 0; // choix du regsitre d'écriture et de lecture // soit 2x8bit ou 1x 16bit --> ici 2x8 bits } //----------------------------------------------------------------------------// //--- Initialisation des Interruptions ---// //----------------------------------------------------------------------------// void init_interrupt() { //configuration des interruptions liées au timer1 //----------------------------------------------- PIR1bits.TMR1IF = 0; // si interruption mettre à 0 le TMR1 IPR1bits.TMR1IP = 1; // choix la priorité de l'interruption // --> ici haute PIE1bits.TMR1IE = 1; // activation de l'interruption } //----------------------------------------------------------------------------// //--- Activation des Interruptions ---// //----------------------------------------------------------------------------// void activ_interrupt() { //activation des priorités sur les interuptions //--------------------------------------------- RCONbits.IPEN = 1; //activation des interruptions de manière globale //----------------------------------------------- INTCONbits.GIEL = 1; // interruption faible priorité INTCONbits.GIEH = 1; // interruption haute priorité IPR1bits.RCIP = 1; // interruption haute de priorité } //----------------------------------------------------------------------------// //--- Gestion de l'interruption de priorité haute ---// //----------------------------------------------------------------------------// #pragma code #pragma interrupt traitement_it_haute //fonction pour gérer l'interruption //---------------------------------- void traitement_it_haute(void) { // traitement si interruption sur timer1 if(PIR1bits.TMR1IF == 1) { if(compteur > 65535) compteur = 0; else compteur++; PIR1bits.TMR1IF = 0; // remise à zéro lié à l'interruption du Timer1 } } //----------------------------------------------------------------------------// //--- Vecteur d'interruption (priorité haute) ---// //----------------------------------------------------------------------------// #pragma code adresse_it_haute = 0x0008 //adresse de priorité haut //fonction d'appel aux interruptions de priorité haute //---------------------------------------------------- void goto_it_haute(void) { _asm goto traitement_it_haute _endasm } //----------------------------------------------------------------------------// //--- fonction affichage ---// //----------------------------------------------------------------------------// void fct_affichage() { // mode_affichage_normal if(mode_systeme.normal == 1) //&& (mode_systeme.veille == 0)) { NumH = compteur << 8; // 8bits de poids fort NumL = compteur; // 8bits de poids faible bin16_bcd(); //affichage sur la ligne 1 LCDLine_1(); temp_wr = 'C'; d_write(); temp_wr = 'P'; d_write(); temp_wr = 'T'; d_write(); temp_wr = '='; d_write(); temp_wr = '0' + TenK; //unité d_write(); temp_wr = '0' + Thou; //unité d_write(); temp_wr = '0' + Hund; //unité d_write(); temp_wr = '0' + Tens; //unité d_write(); temp_wr = '0' + Ones; //unité d_write(); } else if(mode_systeme.veille == 1) // && (mode_systeme.normal == 0)) { NumH = compteur_veille >> 8; // 8bits de poids fort du compteur NumL = compteur_veille; // 8bits de poids faible du compteur bin16_bcd(); //affichage sur la ligne 1 LCDLine_1(); temp_wr = 'C'; d_write(); temp_wr = 'P'; d_write(); temp_wr = 'T'; d_write(); temp_wr = '='; d_write(); temp_wr = '0' + TenK; //unité d_write(); temp_wr = '0' + Thou; //unité d_write(); temp_wr = '0' + Hund; //unité d_write(); temp_wr = '0' + Tens; //unité d_write(); temp_wr = '0' + Ones; //unité d_write(); //affichage sur la ligne 2 LCDLine_2(); temp_wr = '*'; d_write(); temp_wr = '*'; d_write(); temp_wr = '*'; d_write(); temp_wr = 'V'; d_write(); temp_wr = 'E'; d_write(); temp_wr = 'I'; d_write(); temp_wr = 'L'; d_write(); temp_wr = 'L'; d_write(); temp_wr = 'E'; d_write(); temp_wr = '*'; d_write(); temp_wr = '*'; d_write(); temp_wr = '*'; } else { //affichage sur la ligne 1 LCDLine_1(); temp_wr = '-'; d_write(); temp_wr = '-'; d_write(); temp_wr = '-'; d_write(); temp_wr = 'E'; d_write(); temp_wr = 'R'; d_write(); temp_wr = 'R'; d_write(); temp_wr = '0'; d_write(); temp_wr = 'R'; d_write(); temp_wr = '-'; d_write(); temp_wr = '-'; d_write(); temp_wr = '-'; d_write(); //affichage sur la ligne 2 LCDLine_2(); temp_wr = '-'; d_write(); temp_wr = '!'; d_write(); temp_wr = 'S'; d_write(); temp_wr = 'Y'; d_write(); temp_wr = 'S'; d_write(); temp_wr = 'T'; d_write(); temp_wr = 'E'; d_write(); temp_wr = 'M'; d_write(); temp_wr = '!'; d_write(); temp_wr = '-'; d_write(); } } //----------------------------------------------------------------------------// //--- fonction Leds ---// //----------------------------------------------------------------------------// void fct_Led() { // mode_affichage_normal if(mode_systeme.normal == 1) //&& (mode_systeme.veille == 0)) { PORTBbits.RB1 = 0; // led éteinte PORTBbits.RB2 = 1; // led allumée // clignotement if(compteur & 1) // mode impaire PORTBbits.RB3 = 1; // led allumée else // paire PORTBbits.RB3 = 0; // led éteinte } else if(mode_systeme.veille == 1) //&& (mode_systeme.normal == 0)) { PORTBbits.RB1 = 1; // led allumée PORTBbits.RB2 = 0; // led éteinte // clignotement if(compteur & 1) // mode impaire PORTBbits.RB3 = 1; // led allumée else // mode paire PORTBbits.RB3 = 0; // led éteinte } // erreur est tout s'allume else { PORTBbits.RB1 = 1; // led allumée PORTBbits.RB2 = 1; // led allumée PORTBbits.RB3 = 1; // led allumée } } //----------------------------------------------------------------------------// //--- fonction mode normal ---// //----------------------------------------------------------------------------// void fct_mode_normal() { //--- appel pour l'affichage fct_affichage(); //--- gestion des leds fct_Led(); } //----------------------------------------------------------------------------// //--- fonction mode veille ---// //----------------------------------------------------------------------------// void fct_mode_veille() { //--- appel pour l'affichage fct_affichage(); //--- passage en mode sleep _asm sleep _endasm //--- gestion des leds fct_Led(); } // ------------------------------------------------------------------ // --- programme principal // ------------------------------------------------------------------ void main() { //--- déclaration de variable dans le main //---------------------------------------- int compteur_actu; //--- initialisation entrée-sortie //-------------------------------- init_entree_sortie(); //--- initialisation du timer1 //---------------------------- init_timer1(); //--- initialisation des interruption //----------------------------------- init_interrupt(); activ_interrupt(); //--- initialisation LCD //---------------------- LCDInit(); //--- initialisation du mode de démarrage //--------------------------------------- mode_systeme.normal = 1; mode_systeme.veille = 0; while(1) { //--- détection appuie sur le bouton S3 --> port RB0 if(PORTBbits.RB0 == 0) { // mémorisation du compteur actuelle compteur_actu = compteur; //boucle d'attente (2 secondes) while(compteur_actu+2 < compteur){} //--- confirmation du long appui if(PORTBbits.RB0 == 0) { // changement de mode --> mode veille actif mode_systeme.normal = 0; mode_systeme.veille = 1; // enregistrement du compteur compteur_veille = compteur; } } // gestion du mode normal if(mode_systeme.normal == 1) fct_mode_normal(); else if(mode_systeme.veille == 1) { // boucle de 5s while(compteur_actu+5 < compteur) // appel à la fonction fct_mode_veille(); // une fois passer ces 5s passage en mode normal mode_systeme.normal = 1; mode_systeme.veille = 0; } } } */