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

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
#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|RTCC_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.h

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
#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("0011000891478540110000AA15D2E2B008A516AB52100C5474829A41E9105904\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("0011000891478540110000AA15D2E2B008A516AB52500C5474829A41E9105904\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