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
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
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; }
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
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) }
Partager