All pastes #429985 Raw Edit

perfo

public c v1 · immutable
·published 2007-04-08 17:11 UTC
rendered paste body
#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.}