#include std84.h #include bit84.h #include "int16CXX.h" //Definition des ports en variables globales. //Sorties : #define led_rouge porta.1 #define moteur_trigo porta.2 #define moteur_horaire porta.3 //Entres : #define erreur portb.0 #define presence_feuille portb.1 #define presence_tiroir portb.2 #define 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 //On sauvegarde l'tat des registres importants. 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 //On restitue l'tat des registres importants. } /*------------------------------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. }