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

Status
Not open for further replies.

Pat-21

New Member
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;
}
 
Status
Not open for further replies.
Cookies are required to use this site. You must accept them to continue using the site. Learn more…