#include std84.h #include bit84.h #include "int16CXX.h" //Definition des ports en variables globales. //Sorties : #define bool led_rouge porta.1 #define bool moteur_trigo porta.2 #define bool moteur_horaire porta.3 //Entres : #define bool erreur portb.0 #define bool presence_feuille portb.1 #define bool presence_tiroir portb.2 #define bool came_haute portb.3 /*------------------------------Fonctions------------------------------*/ void clignotement() { led_rouge = 1; delay(250); delay(250); led_rouge = 0; delay(250); delay(250); } void arrets() //On stoppe moteur, et la LED. { moteur_horaire = 0; moteur_trigo = 0; led_rouge = 0; } void rotation(char sens[]) { led_rouge = 1; //On allume la LED. delay(250); delay(250); do //On fait tourner le moteur. { if(sens=="trigo"){ moteur_trigo = 1; } else if(sens=="horaire"){ moteur_horaire = 1;} } while (!came_haute); //Tant que la came n'est pas en position haute. arrets(); //Et on arrte tout. } /*------------------------------Interruption------------------------------*/ #pragma origin 4 //On crit partir de l'adresse 4. interrupt probleme(void) { int_save_registers // W, STATUS (and PCLATH if required). if (INTE)//On vrifie qu'il y a toujours une erreur. { char condition; //On dclare la variable "condition". //On configure les ports : trisa = 0b00000; //Sorties. trisb = 0b11111111; //Entres. arrets(); do { clignotement(); } while (!presence_tiroir); //On fait clignoter jusqu' ce qu'on remette le tiroir rotation("trigo"); //On remet la came dans sa position initiale. INTF = 0; //On remet INTF 0 manuellement. } int_restore_registers // W, STATUS (and PCLATH if required) } /*------------------------------Fonction Principale------------------------------*/ void main() { //On configure les ports : trisa = 0b00000; //Sorties. trisb = 0b11111111; //Entres. INTCON = 0b00010010; //L'interruption se fait en surveillant le changement de front de RB0. OPTION = 0b01000000; //L'interruption se fait sur le front MONTANT de RB0. for (;;) //Boucle infinie : pour un nombre de cycle de perforation infini. { arrets(); //On commence par couper le moteur et la LED. while (!presence_tiroir) //Tant qu'il n'y a pas de tiroir on fait clignoter la LED. { clignotement(); } if (!came_haute)//Ensuite on regarde si la came est en haut. { rotation("trigo"); //Si elle ne l'est pas, on la remet en haut. } do led_rouge = 0; while (!presence_feuille); //On attend la prsence de feuilles rotation("horaire"); }//Un cycle de perforation est termin, on retourne au dbut. }