Autor Tema: dos puertos usart  (Leído 2292 veces)

0 Usuarios y 3 Visitantes están viendo este tema.

Desconectado pachomil

  • PIC12
  • **
  • Mensajes: 70
dos puertos usart
« en: 04 de Noviembre de 2010, 20:43:11 »
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

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: dos puertos usart
« Respuesta #1 en: 04 de Noviembre de 2010, 21:43:29 »
Hola, no puedo ayudarte porque no uso Pics, pero gracias a que tengo un par de birras ( cervezas ) encima voy a comentarte algunas cositas a nivel programación C. En primer lugar todo lo que sea código deberia ser agrupado entre estos tags {code=c} ... {/code} de esta manera se ve mucho mejor, para que los pueda usar  reemplaza las llaves por corchetes.

Esto lo podes hacer asi

Código: C
  1. printf("A") ;
  2.     delay_ms(50) ;
  3.    printf ("T") ;  
  4.     delay_ms (50) ;  
  5.    printf ("+") ;
  6.     delay_ms (50) ;    
  7.    printf ("I") ;
  8.     delay_ms (50) ;
  9.    printf ("P") ;      
  10.     delay_ms (50) ;      
  11.    printf ("R") ;
  12.     delay_ms (50) ;
  13.    printf ("=") ;
  14.     delay_ms (50) ;
  15.    printf ("9") ;
  16.     delay_ms (50) ;
  17.    printf ("6") ;      
  18.     delay_ms (50) ;
  19.     printf ("0") ;
  20.     delay_ms (50) ;
  21.    printf ("0") ;  
  22.     printf ("\r\n""") ;

Se podria escribir asi

Código: C
  1. printf( "AT+IPR=9600\n\r" );

Los incrementos en C se manejan asi,

Código: C
  1. conta_1=conta_1+1;

Código: C
  1. conta_1 ++;

Esto es lo mismo y queda mas prolijo,

Código: C
  1. conta_1=read_EEPROM(cero);

Código: C
  1. conta_1=read_EEPROM( 0 );

Escribiendo mejor el código seguramente alguien pueda ayudarte mas.

Saludos !

Desconectado pachomil

  • PIC12
  • **
  • Mensajes: 70
Re: dos puertos usart
« Respuesta #2 en: 04 de Noviembre de 2010, 21:57:53 »

RICHI777  gracias por la ayuda lo hago asi

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""") ;   

y no asi:

printf( "AT+IPR=9600\n\r" );


por que si le mando al modem los comandos sin temporizacion se me broquea mientras que con temporizadores entre letras no se me broquea, claro que seria mejor pero ya he trabajado con ese moden en asambler es mas ya lo tengo trabajando solo que quiero aprender a programarlo en c para poder facilitar mi trabajo ahora lo de los contadores esa sugerencia es buena lo mismo que con la lectura de la memoria gracias por tu ayuda.

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: dos puertos usart
« Respuesta #3 en: 04 de Noviembre de 2010, 22:03:57 »
Hola, que marca de modem es ? es rarisimo lo que te pasa. Conectaste las lineas de protocolo por hadrware ( CTS / RTS ) porque no conozco ningun modem que se comporte como mencionas. Tene en cuenta que los modem normalmente llevan un ARM interno y tienen mucha RAM interna como para bufferearte una trama de datos de muchos bytes.

Saludos !

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: dos puertos usart
« Respuesta #4 en: 04 de Noviembre de 2010, 22:05:17 »
Hola.

Ojala y tomaras ron RICHI777 !!!!!  ;-)

Es recomendable que dentro de la interrupción no haya funciones que tomen mucho tiempo.

Si quieres definir dos puertos USART puedes hacerlo de la siguiente manera:
Código: C#
  1. #use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8,stop=1,stream=USART_1)
  2. #use rs232(baud=4800,parity=N,xmit=PIN_C4,rcv=PIN_C5,bits=8,stop=1,stream=USART_2)

y para usarlas:
Código: C#
  1. fprintf(USART1,"AT+IPR=9600\n\r");

Saludos

El papel lo aguanta todo

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: dos puertos usart
« Respuesta #5 en: 04 de Noviembre de 2010, 22:08:54 »
Tienes desactivado el eco del modem? eso puede generar problemas a veces ....
El papel lo aguanta todo

Desconectado pachomil

  • PIC12
  • **
  • Mensajes: 70
Re: dos puertos usart
« Respuesta #6 en: 04 de Noviembre de 2010, 22:57:24 »
MLO y RICHI777  mil gracias por la ayuda


el modem es un sim508 que trae modem y gps ya lo tengo trabajando en una aplicacion y es muy bueno pero lo he cacharriado mucho y pues fue la forma de que me funcionara muy bien, MLO ahora no le he quitado el eco lo voy a probar y les cuento es una buena idea y voy a probar las dos usart.


 

anything