• 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.

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.

Latest threads

EE World Online Articles

Loading
Top