#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 // W, STATUS (and PCLATH) 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)}/*------------------------------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.}