/********************************************************** Projet : tp42.prj Fichier(s) : TP_42.c Objet : Convertisseur analogique numérique Auteurs : VILLERMIN Julien / SCHULLER Fabien Groupe : Auto Date création : 04/12/2000 **********************************************************/ // Fichiers à inclure : #include // Commandes du moniteur de mise au point : pour cible XEVA + XEVA_DEMO #include // Fichier de déclaration des registres interne au µC 80C535 (SFR) #include // Commandes le l'afficheur LCD #include // E/S standard (ex. printf...) // Equivalences : // Fonctions locales (Prototypes) : void it_CAN(void)interrupt 8 using 1; // Fonction interruption CAN void it_P10_MARCHE(void) interrupt 10 using 1; // Fonction marche void it_P11_ARRET(void) interrupt 11 using 2; // Fonction arret void it_T2(void)interrupt 5 using 3; //fonction gestion de l'affichage // Definitions particulières (zone SFR ou RAM externe) : 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; // out_aff4 est le nom donne a la ligne P1.7 (commande afficheur 4) at 0x8000 xdata unsigned char low_BG; //definition partie basse barregraphe at 0x9000 xdata unsigned char high_BG; //definition partie haute barregraphe sfr16 at 0xCA CRCHL; // definition de [CRCH,CRCL] a l'adresse 0xCB comme un registre de 16 bits sfr16 at 0xCC THL2; // definition de [TH2,TL2] a l'adresse 0xCC comme un registre de 16 bits // Variables Globales : long val_ddp; int etat,num_aff,val; unsigned int tab_aff[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x08,0x04}; //tableau pour mise on Leds barregraphe // ================ ZONE PROGRAMME ============================================================== /******************************************************** Nom : main() Objet : Paramètres : - d'appel : aucun - de retour : aucun *********************************************************/ void main () { clrscr(); printf("TP42 VOLTMETRE\n"); printf("ARRET\n\n"); // affichage LCD // phase d'initialisation : P5 = 0; // Reset des afficheurs 7 segments low_BG=0; //reset partie basse barregraphe high_BG=0; //reset partie haute barregraphe I3FR=0; //Front montant sur P1.0 (marche) IEX3=0; //Reset drapeau EX3=1; //Autorisation IRQ IEX4=0; //Reset drapeau EX4=1; //Autorisation IRQ ADM=0; //mode monocoup sur CAN MX2=0 , MX1=1 , MX0=1; //choix du canal P6.3 CRCHL=-2000; //periode T2=2ms T2PS=0; //Timer a FQ/12 THL2=CRCHL; //chargement T2R0=0; T2R1=1; //auto-reload T2I0=1; T2I1=0; //mode timer TF2=0; ET2=1; //reset flag autorisation IRQ IP0=(IP0&0xD7)|0x18; //priorite maximum sur arret puis sur timer IP1=(IP1&0xD7)|0x10; EAL=1; //autorisation globale etat=0,val_ddp=0,num_aff=0; //initialisation variables globales // PROGRAMME PRINCIPAL : while(1) // boucle infinie { } // end 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 val_ddp=ADDAT; //recuperation valeur conversion CAN val_ddp=val_ddp*196/100+1; //Affichage en dizaine de mV } //Retour /******************************************************** Nom : Sous programme 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("MARCHE \n\n"); //affichage IADC=0; //reset flag CAN EADC=1; //autorise IRQ CAN DAPR=0x00; // demarrage conversion } /******************************************************** Nom : Sous programme arret Objet : Arret conversion Paramètres : - d'appel : aucun - de retour : aucun *********************************************************/ void it_P11_ARRET(void)interrupt 11 using 2 { etat=0; //mise etat arret printf("ARRET \n\n"); //affichage IEX4=0; //reset Flag EADC=0; //blocage des IRQ du CAN } /******************************************************** Nom : Sous programme timer Objet : GEstion de l'affichage par table de transcodage Paramètres : - d'appel : aucun - de retour : aucun *********************************************************/ void it_T2(void)interrupt 5 using 3 { TF2=0; //rest flag num_aff=num_aff+1; //ecrit sur afficheur suivant switch(num_aff) { case 1: //gestion du + P1=P1&0x0F; //eteint les 4 afficheurs P5=tab_aff[10]; //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]; //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; }//end switch if(num_aff>4) //test si tout les afficheurs ont ete allumes num_aff=0; //revient premier afficheur }