#include std84.h #include bit84.h #include "int16CXX.h" //Definition des ports en variables globales. //Sorties : #define led_rouge porta.1 #define moteur_horaire porta.2 #define moteur_trigo porta.3 //Entres : #define erreur portb.0 #define presence_feuille portb.1 #define presence_tiroir portb.2 #define came_haute portb.3 // I - Programme d'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 = 0b00000000; //Sorties. trisb = 0b11111; //Entres. moteur_horaire = 0; //On arrte le moteur. moteur_trigo = 0; do { led_rouge = 1; //On fait clignoter la LED. delay(250); delay(250); led_rouge = 0; delay(250); delay(250); condition = portb & 0b00000110; //On ne surveille que les bits de poids 2^2 et 2^1 du port B (=> capteurs du tiroir et de la feuille). } while (condition != 0b00000110); //On excute la boucle tant que les bits 2^2 et 2^1 du port B sont diffrents de 1. do { led_rouge = 1; //On allume la LED, et on fait tourner le moteur. moteur_trigo = 1; } while (!came_haute); //Tant que la came n'est pas en position haute. moteur_trigo = 0; //On coupe ensuite le moteur, ainsi que la LED. led_rouge = 0; INTF = 0; //On remet INTF 0 manuellement. } int_restore_registers //On restitue l'tat des registres importants. } // II - Programme principal : void main() { //On configure les ports : trisa = 0b00000000; //Sorties. trisb = 0b11111; //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. //Boucle infinie : pour un nombre de cycle de perforation infini. for (;;) { //On commence par couper le moteur et la LED. moteur_horaire = 0; moteur_trigo = 0; led_rouge = 0; while (!presence_tiroir) //Tant qu'il n'y a pas de tiroir... { led_rouge = 1; //...on fait clignoter la LED. delay(250); delay(250); led_rouge = 0; delay(250); delay(250); } //Ensuite on regarde si la came est en haut. if (!came_haute) { //Si elle ne l'est pas, on allume la LED, et on fait tourner le moteur dans le sens inverse. led_rouge = 1; delay(250); delay(250); do moteur_trigo = 1; while (!came_haute); //Tant que la came n'est pas en position haute moteur_trigo = 0; //On coupe ensuite le moteur et on teind la LED. led_rouge = 0; } do led_rouge = 0; while (!presence_feuille); //On attend la prsence de feuilles //Ds qu'il y en a une... led_rouge = 1; //...on allume la led... delay(250); //...on attend... delay(250); do moteur_horaire = 1; //...et on fait tourner le moteur dans le sens horaire... while (!came_haute); //...tant que la came n'est pas en position haute. moteur_horaire = 0; ///On coupe ensuite le moteur et on teind la LED. led_rouge = 0; }//Un cycle de perforation est termin, on retourne au dbut. }