/********************************************************** Projet : tp3_2.prj Fichier(s) : TP_32.c Objet : Utilisation du Timer / Counter T2 en tant que compteur: MODE COMPTEUR Auteurs : Hensinger Benoît / Cuenot Gaël Binome : 3 Groupe : RLI 1 Date création : 23/11/2001 **********************************************************/ // 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 #define VALCPT 12 // Fonctions externes : // Fonctions locales (Prototypes) : void tempo(unsigned int); // Fonction temporisation (delai) void IRQ_P15_T2(void) interrupt 5 using 1; // Definitions particulières (zone SFR ou RAM externe) : at 0xF8 sbit out_led; // out_led est le nom donné à la led P5.4 (jour) at 0xCC sfr16 THL2; at 0xCA sfr16 CRCHL; at 0x95 sbit in_P15; // Variables Globales : // ================ 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("--> TP 3.2 <--\n"); //1ere ligne printf("\n\n COMPTEUR "); //2eme ligne P4=0; P5=0; // Initialisation du Timer T2 CRCHL=-VALCPT; THL2=CRCHL; T2PS=0; T2R0=1; T2R1=0; // Blocage de rechargement T2I0=0; // Mode compteur T2I1=1; // Mode compteur TF2=0; ET2=1; //Interruption sur P1.0 I3FR=0; // Front Descendant sur P1.0 IEX3=0; // Reset du drapeaux EX3=1; //autorisation IRQ //Interruption sur P1.5 (Arret) EXF2=0; EXEN2=1; ET2=1; IP0=(IP0 & 0xDF)|0x20; //Priorite 0 sur /INT3,/INT2 IP1=(IP1 & 0xDF)|0x20; EAL=1; // Boucle infinie while(1) { printf("\n\n Restant: %u ",-THL2); } } // end main /******************************************************** Nom : arret Objet : Mise a l'arret Paramètres : - d'appel : aucun - de retour : aucun *********************************************************/ void IRQ_P15_T2(void) interrupt 5 using 1 { if(TF2 == 1) { TF2=0; out_led=ON; T2R1=1; printf("\n\nFin de Comptage "); } else { EXF2=0; if(T2R1 == 1) { T2R1=0; out_led=OFF; printf("\n\nComptage en cour"); } } EXF2=0; } /******************************************************** 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