un saludo a todos:
estoy comunicando un pic 18f2550 con un moden gsm y con otro pic 16f628a el moden gsm me comunico por el puerto usart y el 16f628a por el pin C2, el 16f628a le envio los datos cuando se activa la interrupcion por rb0, en esta interrupcion configuro el pic c2 como salida serial, les paso el codigo:
#include <18F2550.h>
#device adc=8
#FUSES NOWDT //No Watch Dog Timer
#FUSES WDT128 //Watch Dog Timer uses 1:128 Postscale
#FUSES XT //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
#FUSES NOPROTECT //Code not protected from reading
#FUSES NOBROWNOUT //No brownout reset
#FUSES BORV20 //Brownout reset at 2.0V
#FUSES NOPUT //No Power Up Timer
#FUSES NOCPD //No EE protection
#FUSES STVREN //Stack full/underflow will cause reset
#FUSES NODEBUG //No Debug mode for ICD
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOWRT //Program memory not write protected
#FUSES NOWRTD //Data EEPROM not write protected
#FUSES IESO //Internal External Switch Over mode enabled
#FUSES FCMEN //Fail-safe clock monitor enabled
#FUSES PBADEN //PORTB pins are configured as analog input channels on RESET
#FUSES NOWRTC //configuration not registers write protected
#FUSES NOWRTB //Boot block not write protected
#FUSES NOEBTR //Memory not protected from table reads
#FUSES NOEBTRB //Boot block not protected from table reads
#FUSES NOCPB //No Boot Block code protection
#FUSES MCLR //Master Clear pin enabled
#FUSES LPT1OSC //Timer1 configured for low-power operation
#FUSES NOXINST //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
#FUSES PLL12 //Divide By 12(48MHz oscillator input)
#FUSES CPUDIV4 //System Clock by 4
#FUSES USBDIV //USB clock source comes from PLL divide by 2
#FUSES VREGEN //USB voltage regulator enabled
#use fast_io(B)
#use delay(crystal=20000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,errors)
#include <stdlib.h>
char var[115];
int16 clave_1=0x31;
int16 clave_2=0x32;
int16 clave_3=0x33;
int16 clave_4=0x34;
int16 clave_grabada=0x30;
char cero=0;
char uno=1;
char dos=2;
char tres=3;
char cuatro=4;
char cinco=5;
char seis=6;
char siete=7;
char ocho=8;
char nueve=9;
int16 conta_1=0x00;
int16 conta_2=0x00;
int16 conta_3=0x00;
int16 conta_4=0x00;
int16 conta_5=0x00;
#int_EXT
void EXT_isr(void)
{
#use rs232(baud=9600, xmit=PIN_C2)
conta_1=read_EEPROM(cero); //leo la memoria de los contadores
conta_5=read_EEPROM(uno);
conta_2=read_EEPROM(dos);
conta_3=read_EEPROM(tres);
conta_4=read_EEPROM(cuatro);
conta_1=conta_1+1; //incremento los contadores
IF( conta_1== 10) conta_1=0, conta_2++;
IF (conta_2 == 10) conta_2 = 0, conta_3++;
IF (conta_3 == 10) conta_3 = 0, conta_4++;
IF (conta_4 == 10) conta_4 = 0, conta_5++;
IF (conta_5 == 10) conta_5 = 0;
write_eeprom(cero,conta_1); //guardo contadores en la memoria
write_eeprom(uno,conta_2);
write_eeprom(dos,conta_3);
write_eeprom(tres,conta_4);
write_eeprom(cuatro,conta_5);
printf("%x ",conta_5); //mando los contadores al visor
printf("%x ",conta_4),
printf("%x ",conta_3),
printf("%x ",conta_2),
printf("%x ",conta_1);
}
#int_RDA
void RDA_isr(void)
{
gets(var);
}
void modem(void)
{
//disable_interrupts(INT_RDA);
//output_high (PIN_B6) ;
printf("A") ;
delay_ms(50) ;
printf ("T") ;
delay_ms (50) ;
printf ("+") ;
delay_ms (50) ;
printf ("I") ;
delay_ms (50) ;
printf ("P") ;
delay_ms (50) ;
printf ("R") ;
delay_ms (50) ;
printf ("=") ;
delay_ms (50) ;
printf ("9") ;
delay_ms (50) ;
printf ("6") ;
delay_ms (50) ;
printf ("0") ;
delay_ms (50) ;
printf ("0") ;
printf ("\r\n""") ;
//*************************************AT+IPR=9600*******************
delay_ms (1000) ;
printf("A") ;
delay_ms(50) ;
printf ("T") ;
delay_ms (50) ;
printf ("+") ;
delay_ms (50) ;
printf ("I") ;
delay_ms (50) ;
printf ("P") ;
delay_ms (50) ;
printf ("R") ;
delay_ms (50) ;
printf ("=") ;
delay_ms (50) ;
printf ("9") ;
delay_ms (50) ;
printf ("6") ;
delay_ms (50) ;
printf ("0") ;
delay_ms (50) ;
printf ("0") ;
printf ("\r\n""") ;
//*************************************AT+IFC=0,0*******************
delay_ms (1000) ;
printf("A") ;
delay_ms(50) ;
printf ("T") ;
delay_ms (50) ;
printf ("+") ;
delay_ms (50) ;
printf ("I") ;
delay_ms (50) ;
printf ("F") ;
delay_ms (50) ;
printf ("C") ;
delay_ms (50) ;
printf ("=") ;
delay_ms (50) ;
printf ("0") ;
delay_ms (50) ;
printf (",") ;
delay_ms (50) ;
printf ("0") ;
delay_ms (50) ;
printf ("\r\n""") ;
//*************************************AT+CMGF=1*******************
delay_ms (1000) ;
printf ("A") ;
delay_ms (50) ;
printf ("T") ;
delay_ms (50) ;
printf ("+") ;
delay_ms (50) ;
printf ("C") ;
delay_ms (50) ;
printf ("M") ;
delay_ms (50) ;
printf ("G") ;
delay_ms (50) ;
printf ("F") ;
delay_ms (50) ;
printf ("=") ;
delay_ms (50) ;
printf ("1") ;
delay_ms (50) ;
printf ("\r\n""") ;
//*************************************AT+CMGD=1*******************
delay_ms (1000) ;
printf ("A") ;
delay_ms (50) ;
printf ("T") ;
delay_ms (50) ;
printf ("+") ;
delay_ms (50) ;
printf ("C") ;
delay_ms (50) ;
printf ("M") ;
delay_ms (50) ;
printf ("G") ;
delay_ms (50) ;
printf ("D") ;
delay_ms (50) ;
printf ("=") ;
delay_ms (50) ;
printf ("1") ;
delay_ms (50) ;
printf ("\r\n""") ;
delay_ms (1000) ;
// enable_interrupts(INT_RDA);
//output_low (PIN_B6) ;
}
void leer()
{
disable_interrupts(INT_RDA);
delay_ms (50) ;
printf ("A") ;
delay_ms (50) ;
printf ("T") ;
delay_ms (50) ;
printf ("+") ;
delay_ms (50) ;
printf ("C") ;
delay_ms (50) ;
printf ("M") ;
delay_ms (50) ;
printf ("G") ;
delay_ms (50) ;
printf ("R") ;
delay_ms (50) ;
printf ("=") ;
delay_ms (50) ;
printf ("1") ;
delay_ms (50) ;
enable_interrupts(INT_RDA);
printf ("\r\n""");
}
void grabar_clave()
{
//clave_grabada=0x31;
write_eeprom(cinco,clave_1); //guardo clave de configuracion
write_eeprom(seis,clave_2);
write_eeprom(siete,clave_3);
write_eeprom(ocho,clave_4);
write_eeprom(nueve,clave_grabada);
}
void leer_clave()
{
clave_1=read_EEPROM(cinco);
clave_2=read_EEPROM(seis);
clave_3=read_EEPROM(siete);
clave_4=read_EEPROM(ocho);
//RETURN
}
void main()
{
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,errors)
setup_adc_ports(NO_ANALOGS|VSS_VDD);
setup_adc(ADC_CLOCK_DIV_2);
//setup_spi(SPI_SS_DISABLED);
setup_wdt(WDT_OFF);
setup_timer_0(RTCC_INTERNAL);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
setup_ccp1(CCP_OFF);
setup_comparator(NC_NC_NC_NC);
enable_interrupts(INT_EXT);
enable_interrupts(GLOBAL);
clave_grabada = read_EEPROM(nueve);
IF (clave_grabada != 0x31) grabar_clave ();
/*clave_grabada = 0x30;
write_eeprom(nueve,clave_grabada);
*/
modem();
enable_interrupts(INT_RDA);
// enable_interrupts(INT_TBE);
// enable_interrupts(INT_SSP);
output_low (PIN_A5) ;
output_low (PIN_B5) ;
output_low (PIN_B6) ;
output_low (PIN_B7) ;
delay_ms (1000) ;
puts("hola mundo");
int x=0;
//TODO: User Code
while(true)
{
enable_interrupts(INT_RDA);
if (var[8]==0x4D) leer(), leer_clave(), var[8]=0;
IF (var[5] == clave_1) if (var[6] == clave_2) if (var[7] == clave_3) if (var[8] == clave_4) if (var[10] == clave_4) if (var[11] == clave_4) var[5]=0x00,
disable_interrupts(INT_RDA), clave_1=var[13], clave_2=var[14], clave_3=var[15],clave_4= var[16], clave_grabada = 0x31, grabar_clave(), puts("la clave ha sido cambiada");
IF (var[5] == clave_1) if (var[6] == clave_2) if (var[7] == clave_3) if (var[8] == clave_4) if (var[10] == clave_3) if (var[11] == clave_3) modem(),
disable_interrupts(INT_RDA),var[5]=0x00, x=0 ;
}
}
el problema es que cuando activo el pic c2 como salida serial no me deja configurar la salida usart pines c6 y c7 o me broquea la interrupcion serial (usart)
gracias por la ayuda que me puedan dar