1. Welcome to our site! Electro Tech is an online community (with over 170,000 members) who enjoy talking about and building electronic circuits, projects and gadgets. To participate you need to register. Registration is free. Click here to register now.
    Dismiss Notice

Why the intrrups doesn't work in my C program ? pic16F84A

Discussion in 'Microcontrollers' started by Pat-21, May 2, 2003.

  1. Pat-21

    Pat-21 New Member

    Joined:
    Apr 8, 2003
    Messages:
    4
    Likes:
    0
    This program is for a pic16F84, it's for decoding the bits from mt8870.The program is suppose to count like 30 seconds RB7 comes to a high level for off-hooking the line.


    #include <pic1684.h>

    void interrupt raccroche (void);

    void main (void) {
    unsigned char lecture=0x00;
    unsigned int delai=0;

    TRISA=0xFF; // PORTA en entree, RA0 a RA3 sont utilises pour le DTMF
    // RA4 est utiliseā€š comme bit qui provient de la broche STD
    // du decodeur DTMF. Ceci va permettre de decoder seulement
    // lorsque le decodeur DTMF aura decoder des tones


    TRISB=0x10; // PORTB: entierement en sortie, sauf RB5
    // RB0 a RB3 utilisees pour les commandes DTMF
    // RB4 est lentree de lindicateur de decrochage
    // RB5 est un indicateur de decrochage
    // RB6 indicateur de tones decode
    // RB7 est un bit qui est envoyer au compteur 74lS393
    // afin de faire raccrocher la ligne.

    T0CS=0; //Timer0 avec clock interne
    PS0=1; //Prescaler ajuste a 256
    PS1=1;
    PS2=1;
    PSA=0; //Prescaler assigne au module Timer0
    T0SE=1;
    T0IE=1; //flag dinterruption en marche



    RB7=0; // compteur de sonneries a zero
    RB6=0; // indicateur de decrochage a zero
    do
    {
    if (RB4==1) //le decrochage est effectue
    {
    TMR0=0;
    GIE=1;
    RB5=1; //on allume la led dincation de decrochage
    }
    else
    RB5=0;
    GIE=0;
    if (RA4==1) //decodage de tones DTMF valide
    {

    RB6=1; //la led dindication de decodage de bits valide
    //est allumee

    lecture=(PORTA&0x0F); //masque de lecture du PORTA

    switch (lecture) //Fonction de demultiplexage de la lecture
    {
    case 0b0001:

    RB0=1; //mise en marche des dispositifs 1 a 4 avec touches
    break; //1 a 4

    case 0b0010:

    RB1=1;
    break;

    case 0b0011:

    RB2=1;
    break;

    case 0b0100:

    RB3=1;
    break;

    case 0b0101:

    RB0=0; //arret des dispositifs 1 a 4 avec touches 5 a 8
    break;

    case 0b0110:

    RB1=0;
    break;

    case 0b0111:

    RB2=0;
    break;

    case 0b1000:

    RB3=0;
    break;

    case 0b1010:

    RB7=1; //la ligne se raccroche
    for (delai=0; delai<1000; delai++) //delai pour laisser du temps pour
    { //faire clipper le relais
    } //fin de la boucle de compte
    RB7=0; //le compteur se remet a 0
    break;
    } //Fin du switch
    } //Fin du IF
    } while (1); //Boucle de repetition du programme
    } //Fin du programme

    /********************routine dinterruption*********************/
    void interrupt raccroche (void) {
    unsigned int deborde=0;
    unsigned int compte=0;

    deborde=deborde+1;

    if(deborde>=1000) /****the counter***
    {
    RB7=1;
    for(compte=0; compte<4000; compte++)
    {
    }
    RB7=0;
    deborde=0;
    }
     

Share This Page