/********************************************************** Projet : tpxx.prj Fichier(s) : TP_xx.c Objet : Introduction au C sur microcontroleur Gestion des entrees / sorties Auteurs : Hensinger Benoît / Cuenot Gaël Binome : 3 Groupe : RLI 1 Date création : **********************************************************/ // Fichiers à inclure : #include // Commandes du moniteur de mise au point #include // déclaration des registres interne au µC 80C535(SFR) #include // Commandes de l'afficheur LCD #include // Equivalences : #define OFF 0 #define ON 1 // Fonctions externes : // Fonctions locales (Prototypes) : void tempo(unsigned int); // Fonction temporisation (delai) void chan_select(void); void it_P10_MARCHE(void) interrupt 10 using 1; void it_P10_ARRET(void) interrupt 11 using 1; void it_T2(void)interrupt 5 using 1; // Definitions particulières (zone SFR ou RAM externe) : sfr16 at 0xCA CRCHL; // definition de [CRCH,CRCL] a l'adresse 0xCB comme un registre de 16 bits sfr16 at 0xCC THL2; at 0x8000 xdata unsigned char low_BG; at 0x9000 xdata unsigned char high_BG; at 0x94 sbit out_aff1; // out_aff1 est le nom donne a la ligne P1.4 (commande afficheur 1) at 0x95 sbit out_aff2; // out_aff2 est le nom donne a la ligne P1.5 (commande afficheur 2) at 0x96 sbit out_aff3; // out_aff3 est le nom donne a la ligne P1.6 (commande afficheur 3) at 0x97 sbit out_aff4; // Variables Globales //unsigned int tab_aff[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; unsigned int tab_aff[12]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x08,0x04}; bit etat,signe; unsigned int val_ddp1,val_ddp2,val; unsigned int canal=2; int val_ddp,cpt,free_cpt; char num_aff; // ================ ZONE PROGRAMME ============================== /******************************************************** Nom : main() Objet : gestion de la led on/off P5.4 par le bouton mode P1.0 Paramètres : - d'appel : aucun - de retour : aucun *********************************************************/ void main() { clrscr(); printf("---> TP4_S <---\n"); // Affichage "TP_4S" (1e ligne LCD) printf("\n\n---> ARRET <---"); // Affichage "Arret" (2e ligne LCD) low_BG=0; // Extinction leds BG high_BG=0; // Extinction leds BG //Definition sur P1.0: I3FR=1; //FD sur P1.0 IEX3=0; //Reset flag P1.0 EX3=1; //autorisation P1.0 //definition sur P1.1: IEX4=0; //Reset flag sur P1.1 EX4=0; //Inhibition P1.1 //Param CAN: ADM=0; //Can en mode monocoup IADC=0; //Reset du flag EADC=0; //Inhibition Interruptions du CAN // Parametres du timer T2: CRCHL=-2000/1; // Periode T2=2ms THL2=CRCHL; // init Timer T2PS=0; // FTimer = Fquartz/12 T2R0=0; // mode 0 auto-reload T2R1=1; // mode 0 auto-reload T2I0=1; // mode Timer T2I1=0; // mode Timer TF2=0; // Reset flag de T2 ET2=1; // Reset flag autorisation IRQ du timer // Definition des priorites des IRQ IP0=(IP0&0xF9)|0x02; // Priorite 0 -> can & timer ; 1 -> marche ; 2 -> arret IP1=(IP1&0xF9)|0x04; EAL=1; // Autorisation globale IRQ val_ddp=0; // RAZ de la variable de la ddp entre P6.2 et P6.3 val_ddp1=0; // RAZ de la variable de la ddp de P6.2 val_ddp2=0; // RAZ de la variable de la ddb de P6.3 etat=0; // RAZ de la variable de l'etat num_aff=0; // RAZ de la variable de l'afficheur 7 segments en cours while(1); } // end main /******************************************************** Nom : can Objet : analyse resultat conversion Paramètres : - d'appel : aucun - de retour : aucun *********************************************************/ void it_CAN(void)interrupt 8 using 1 { IADC=0; //reset flag if(canal > 3) canal=2; chan_select(); // Appel a la fonction de selection du canal if(canal == 2) // Si on utilise le canal 2 { val_ddp1=ADDAT; // Recuperation valeur conversion CAN val_ddp1=val_ddp1*196/100+1; // Affichage en dizaine de mV } else { val_ddp2=ADDAT; // Recuperation valeur conversion CAN val_ddp2=val_ddp2*196/100+1; // Affichage en dizaine de mV } canal++; // Incrementation de la variable canal } //Retour /******************************************************** Nom : it_P10_MARCHE Objet : Mise en marche Paramètres : - d'appel : aucun - de retour : aucun *********************************************************/ void it_P10_MARCHE(void) interrupt 10 using 1 { etat=1; //mise etat marche printf("\n\n MARCHE "); //affichage IADC=0; //reset flag CAN EADC=1; //autorise IRQ CAN DAPR=0x00; // demarrage conversion EX4=1; //Autorisation P1.1 pour arret } /******************************************************** Nom : it_P10_ARRET Objet : Arret Paramètres : - d'appel : aucun - de retour : aucun *********************************************************/ void it_P10_ARRET(void) interrupt 11 using 1 { etat=0; //mise etat marche printf("\n\n ARRET "); //affichage IEX4=0; //reset du flag EADC=0; //autorise IRQ CAN } /******************************************************** Nom : it_T2 Objet : Affichage multiplexé Paramètres : - d'appel : aucun - de retour : aucun *********************************************************/ void it_T2(void)interrupt 5 using 3 { TF2=0; //rest flag num_aff++; //ecrit sur afficheur suivant val_ddp=val_ddp2-val_ddp1; //printf("\n\n val_ddp = %d ",val_ddp); if(val_ddp < 0) { val_ddp=-val_ddp; signe=1; } else signe=0; if(val_ddp >= 100) { P1=P1&0x0F; //eteint les 4 afficheurs printf("\n\n1 > val_ddp > -1"); low_BG=0xFF; high_BG=0x03; tempo(400); low_BG=0; high_BG=0; tempo(400); DAPR=0x00; } else { printf("\n\n MARCHE "); //affichage switch(num_aff) { case 1: //gestion du + P1=P1&0x0F; //eteint les 4 afficheurs if(signe != 1) P5=tab_aff[10]; // Affiche + else P5=tab_aff[11]; // Affiche - out_aff1=1; //active afficheur 1 break; case 2: //gestion des centaines val=val_ddp/100; //isole chiffre centaines P1=P1&0x0F; //eteint les 4 afficheurs P5=tab_aff[val]|0x80; //mets centaine sur afficheur out_aff2=1; //active afficheur 2 break; case 3: //gestion des dizaines val=(val_ddp-(val_ddp/100*100))/10; //isole chiffre dizaines P1=P1&0x0F; //eteint les 4 afficheurs P5=tab_aff[val]; //mets dizaine sur afficheur out_aff3=1; //active afficheur 3 break; case 4: //gestion des unites val=(val_ddp-(val_ddp/10*10)); //isole chiffre unites P1=P1&0x0F; //eteint les 4 afficheurs P5=tab_aff[val]; //mets unite sur afficheur out_aff4=1; //active afficheur 4 if(etat==1) //test si etat marche DAPR=0x00; //relance conversion break; } if(num_aff>4) //test si tout les afficheurs ont ete allumes num_aff=0; //revient premier afficheur } } // End it_T2 /******************************************************** Nom : chan_select Objet : fonction de selection du canal du can Paramètres : - d'appel : numero de canal (2 ou 3) - de retour : aucun *********************************************************/ void chan_select(void) { switch(canal) { case 1: MX0=1; MX1=0; MX2=0; break; case 2: MX0=0; MX1=1; MX2=0; break; case 3: MX0=1; MX1=1; MX2=0; break; default: printf("\n\n ERREUR DE CANAL"); break; } } // End canal /******************************************************** Nom : tempo Objet : base de temps logicielle de 1 ms Paramètres : - d'appel : durée de la tempo en ms - de retour : aucun *********************************************************/ void tempo(unsigned int t) { int ttempo; while (t != 0) { for (ttempo = 1;ttempo < 493;ttempo++); t--; // décrémentation de la variable de contrôle } } // end tempo