Salut à tous!
je voudrais gérer 2 liaisons séries du PIC16F877 avec interruptions.
Mon code source ci-dessous fonctionne de la manière suivante:
Le pic regarde l'état de ses ports d'entrée(pinD0 et pinD1),si pinD0 est à 1 le port de sortie pinB1 passe à 1 et s'il est 0 pinB1 passe à 0. Simultanément les messages (pinB1 est à 1 ou pinB1 est à 0 ) selon l'état des ports d'entrée doit être envoyer sur 2 liaisons séries (xmit=PIN_B6,rcv=PIN_B0 reçu par une siemens C35 et xmit=PIN_C6,rcv=PIN_C7 reçu par un ORDINATEUR)
De même si pinD1 est à 1 le port de sortie pinB2 passe à 1 et s'il est 0 pinB2 passe à 0.
jusqu'ici ça fonctionne très bien, mais mon véritable problème se pause quand la siemens C35 veux envoyer un caractère au pic,le pic ne reçoit rien, mais quand j'envoie ce caractère par l'ordinateur le pic reçoit bien et exécute l'instruction que je lui demande.
Pour moi, je pense que le problème se pause au niveau de la gestion des deux liaisons séries que j'utilise et les interruptions.
S'il vous plaît aidez moi
voici mon code.C
#include "C:\Documents and Settings\Bernard The Gamorax\Bureau\BON\main.h"
#include <stdio.h>
#include <string.h>
#ZERO_RAM
#int_RDA
void RDA_isr(void)
{
gets(string);
}
void main()
{
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_psp(PSP_DISABLED);
setup_spi(SPI_SS_DISABLED);
setup_timer_0(RTCC_INTERNAL|RT CC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1) ;
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);
// TODO: USER CODE!!
initGSm();
AT();
CONFIGSMS(); //Indication automatique SMS
P:
do{
if(niveau1==0 )
{
if( input(PIN_D0)==1 )
{
output_high(PIN_B1);
if(r0==1)
{printf("pinB1 à 1\r\n");r0--;}
if(m0==0)
{ENVOIESMSR0();m0++;}
}
else
{output_low(PIN_B1);
if(r0==0)
{printf("pinB1 à 0\r\n");r0++;}
if(m0==1){m0--;}
}
if( input(PIN_D1)==1 )
{
output_high(PIN_B2);
if(r1==1)
{printf("PIN_B2 à 1\r\n");r1--;}
if(m1==1)
{ENVOIESMSR1();m1--;}
}
else
{output_low(PIN_B2);
if(r1==0)
{printf("PIN_B2 à 0\r\n");r1++;}
if(m1==0){m1++;}
}
}
}
}while(!string[0]);
if( string[0]=='O' )
{
output_high(PIN_B1);
niveau1=1;
if(r0==1)
{printf("PinB1 à 1\r\n");r0--;}
if(m0==0)
{ENVOIESMSR0();m0++;}
}
if( string[0]=='1' )
{
output_high(PIN_B2);
niveau1=1;
if(r1==1)
{printf("PIN_B2 à 1\r\n");r1--;}
if(m1==1)
{ENVOIESMSR1();m1--;}
}
#use rs232(baud=9600,parity=N,xmit= PIN_B6,rcv=PIN_B0,bits=8)
if( string[0]=='0' )
{
#use rs232(baud=9600,parity=N,xmit= PIN_B6,rcv=PIN_B0,bits=8)
output_high(PIN_C5);
ATD1();
delay_ms(3000);
ATH ();
#use rs232(baud=9600,parity=N,xmit= PIN_B6,rcv=PIN_B0,bits=8)
//goto P;
}
#use rs232(baud=9600,parity=N,xmit= PIN_B6,rcv=PIN_B0,bits=8)
else //MODEM NON CONNECTE
{
#use rs232(baud=9600,parity=N,xmit= PIN_C6,rcv=PIN_C7,bits=8)
LEDCMD();
}
goto p;
}
voici mon code.C
#include <16F877.h>
#device adc=8
#FUSES NOWDT //No Watch Dog Timer
#FUSES HS //High speed Osc (> 4mhz)
#FUSES NOPUT //No Power Up Timer
#FUSES PROTECT //Code protected from reads
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection
#FUSES NOWRT //Program memory not write protected
#FUSES NODEBUG //No Debug mode for ICD
#use delay(clock=20000000)
#use rs232(baud=9600,parity=N,xmit= PIN_B6,rcv=PIN_B0,bits=8)
char string[1];
int m0=0;
int m1=1;
int r0=1;
int r1=1;
int niveau1=0;
char buffer [16] ;
char appel []="ATD74580411;\r";
int i;
//CLIGNOTER LA DIODE
void LEDCMD()
{
output_high(PIN_C5);
delay_ms( 300 );
output_low(PIN_C5);
delay_ms( 300 );
}
/*INITIALISATION DU MODEM GSM*/
void initGSm()
{
#use rs232(baud=9600,parity=N,xmit= PIN_B6,rcv=PIN_B0,bits=8)
PUTS("ATZ\r"); // ATZ RESET MODEM
PUTS ("ATE0\r"); //ATE0
PUTS ("ATV\r");
#use rs232(baud=9600,parity=N,xmit= PIN_B6,rcv=PIN_B0,bits=8)
}
//TEST DE LA PRESENCE DU MODEM
void AT()
{
#use rs232(baud=9600,parity=N,xmit= PIN_B6,rcv=PIN_B0,bits=8)
PUTS ("AT\r");
//#use rs232(baud=9600,parity=N,xmit= PIN_B6,rcv=PIN_B7,bits=8)
}
//RACROCHAGE AUTOMATIQUE
void ATH ()
{
#use rs232(baud=9600,parity=N,xmit= PIN_B6,rcv=PIN_B0,bits=8)
PUTS ("ATH\r");
//#use rs232(baud=9600,parity=N,xmit= PIN_C6,rcv=PIN_C7,bits=8)
}
//CONFIGURATION DU MODEM POUR LES SMS
void CONFIGSMS ()
{
#use rs232(baud=9600,parity=N,xmit= PIN_B6,rcv=PIN_B0,bits=8)
PUTS("AT+CMGF=0\r"); //MODE PDU ACTIF
PUTS ("AT+CNMI=1,1\r"); //Detection nouveau SMS
//#use rs232(baud=9600,parity=N,xmit= PIN_B6,rcv=PIN_B7,bits=8)
}
//CONFIRMATION PAR APPEL: Numero unique: 74 58 04 11
void ATD1 () //OK
{
#use rs232(baud=9600,parity=N,xmit= PIN_B6,rcv=PIN_B0,bits=8)
PUTS (appel);
//#use rs232(baud=9600,parity=N,xmit= PIN_C6,rcv=PIN_C7,bits=8)
}
//envoie SMS
void ENVOIESMSR0()
{
#use rs232(baud=9600,parity=N,xmit= PIN_B6,rcv=PIN_B0,bits=8)
printf("AT+CMGF=0\r\n");
delay_ms(500);
printf("AT+CSMS=0\r\n");
delay_ms(500);
printf("AT+CMGS=31\r\n");
delay_ms(500);
printf("0011000891478540110000 AA15D2E2B008A516AB52100C547482 9A41E9105904\r\n");
#use rs232(baud=9600,parity=N,xmit= PIN_C6,rcv=PIN_C7,bits=8)
}
void ENVOIESMSR1()
{
#use rs232(baud=9600,parity=N,xmit= PIN_B6,rcv=PIN_B0,bits=8)
printf("AT+CMGF=0\r\n");
delay_ms(500);
printf("AT+CSMS=0\r\n");
delay_ms(500);
printf("AT+CMGS=31\r\n");
delay_ms(500);
printf("0011000891478540110000 AA15D2E2B008A516AB52500C547482 9A41E9105904\r\n");
#use rs232(baud=9600,parity=N,xmit= PIN_C6,rcv=PIN_C7,bits=8)
}
NB:je rappelle que j'ai simuler le fonctionnement avec ISIS PROTEUS donc l'ordinateur et la siemens étaient représentés des virtual terminal
-----