Autor Tema: 2 USART con PIC18F26J50  (Leído 3764 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado sebalitter

  • PIC10
  • *
  • Mensajes: 5
2 USART con PIC18F26J50
« en: 29 de Diciembre de 2015, 13:20:31 »
Buenos dias, soy nuevo en el foro.

Dispongo de una plaqueta WIFI de MCelectronics con el modulo RN-171 y USB para conectarme a la computadora por Teraterm o hyperterminal.

Mi programa consiste en mandarle en modo comando($$$) codigo ASCII escrito en el teclado por teraterm hacia el PIC18F26J50 y que este se lo mande por USART2 al modulo WIFI (RN-171) . Que este lo procese y mande una respuesta de nuevo al pic y este lo repita a la maquina por medio del cable usb.

La secuencia seria asi:
teraterm->UART1usb->PIC18F26j50->UART2rn->RN-171->uart2rn->PIC18F26j50->uart1usb->teraterm

La parte del usb (mandar y recibir funciona.)
La segunda parte, que es la que se comunica el Pic con el modulo WIFI no anda nada.

Si alguien hice algo parecido usando dos RS232 o en este caso  (usb_cdc.h para el USB y  RS232 para la usart con el rn171)

Detalle:

CCS 5.015
IDE MPLAB X 3.15

La plaqueta esta funcionando correctamente ya que con otro programa compilado con el XC8 funciona correctamente.

Este es el codigo que hice hasta ahora:

Código: [Seleccionar]



 #include <18F26J50.h>
 #include <string.h>
 #include <ctype.h>

 #FUSES NOWDT
 #FUSES NODEBUG
 #FUSES NOXINST
 #FUSES NOPROTECT
 #FUSES NOFCMEN
 #FUSES NOIESO
 #FUSES NOCPUDIV
 #FUSES HSPLL
 #FUSES PLL3
 #FUSES RTCOSC_INT

 #use delay(crystal=12Mhz, clock=48Mhz)
 

 #PIN_SELECT U2TX=PIN_C6
 #PIN_SELECT U2RX=PIN_C7
 #USE RS232(UART2,ERRORS,BAUD=9600,STREAM=WIFI,ERRORS)
 
 #include <usb_cdc.h>

 #define BUFFER_SIZE 32
 BYTE buffer[BUFFER_SIZE];
 BYTE next_in = 0;
 BYTE next_out = 0;

 #int_rda
 void serial_isr() {
    int t;

    buffer[next_in]=fgetc(WIFI);
    t=next_in;
    next_in=(next_in+1) % BUFFER_SIZE;
    if(next_in==next_out)
      next_in=t;           // Buffer full !!
 }

 #define bkbhit (next_in!=next_out)

 BYTE bgetc()
 {
    BYTE c;

    while(!bkbhit) ;
    c=buffer[next_out];
    next_out=(next_out+1) % BUFFER_SIZE;
    return(c);
 }
 
 void inicbuff(void){ // Inicia a \0 cbuff -------------------
   int i;

   for(i=0;i<BUFFER_SIZE;i++){   // Bucle que pone a 0 todos los
     buffer[i]=0x00;          // caracteres en el buffer
   }
 
 }

 void main() {
     
    char palabra[BUFFER_SIZE];
    delay_ms(100);
    usb_init();
    delay_us(100);
    inicbuff(); // Borra buffer al inicio
   
    enable_interrupts(int_rda);
    enable_interrupts(global);
    int i=0;
 
    delay_ms(50);
   
    while(TRUE)
    {
        delay_ms(50);
       
        while(bkbhit) {   
            printf(usb_cdc_putc,"something: %c" ,fgetc(WIFI));
            delay_ms(50);
        }
        delay_ms(50);
        usb_task();
        if (usb_enumerated())
        {


            if (usb_cdc_kbhit())
            {
           
                printf(usb_cdc_putc,"\r\n");      //limpia la pantalla
                get_string_usb(palabra,BUFFER_SIZE);     //obtiene la palabra escrita en el teclado
                printf(usb_cdc_putc,"\r\n");
               
                i=0;
                while(palabra[i]!=0x00){
                    fputc(palabra[i],WIFI);
                    delay_ms(50);
                    i++;
                }
            }
        }
       
    }

 }



Saludos
Saludos

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:2 USART con PIC18F26J50
« Respuesta #1 en: 29 de Diciembre de 2015, 13:37:02 »
 #PIN_SELECT U2TX=PIN_C6
 #PIN_SELECT U2RX=PIN_C7
 #USE RS232(UART2,ERRORS,BAUD=9600,STREAM=WIFI,ERRORS)


Pero esos pines son de la UART1 , no de la UART2, proba usar la UART1, tal ves por que le estas pidiendo UART2, y encima esos pines lo haga por software.

Con respecto a lo de UART1usb, lo entendiste mal creo. Si tenes USB como tiene ese PIC, el CDC, hace de cuenta como que es una comunicacion serie.. es decir desde la PC lo verias como una comunicacion RS232, pero desde el PIC estarias usando el USB y no la UART1. Asi que la UART1 la tenes libre.

Desconectado sebalitter

  • PIC10
  • *
  • Mensajes: 5
Re:2 USART con PIC18F26J50
« Respuesta #2 en: 31 de Diciembre de 2015, 13:26:31 »
haa gracias!


El UART1 tiene definidos los pines C6 y C7 siempre.

Código: [Seleccionar]
#USE RS232(UART1,ERRORS,BAUD=9600,STREAM=WIFI,ERRORS)

El uart2 puede usar las sentencias select para definir los puertos.

Código: [Seleccionar]
  #PIN_SELECT U2TX=PIN_C6
  #PIN_SELECT U2RX=PIN_C7



La comunicación no logra conectarse correctamente.
A veces no recibe nada de la usart.
Otras veces recibe basura.


 - get mac
 Mac Addr=00:06:66:9c:

 - $$$
 ERR: ?-Cmd
 <4.41>

 - get ip
 IF=UP
 DHCP=SERVER
 IP2TG

 - get ssid
 SleepTmr=0
 WakeTmr=oxb

 A veces la primera leyenda es:
 &«Kc#Ó&‹VvƦ
 otras muestra bien:
 server init

Este es el codigo. No siempre anda.


Código: [Seleccionar]

#include <18F26J50.h>
  #include <string.h>
  #include <ctype.h>


  #FUSES NOWDT
  #FUSES NODEBUG
  #FUSES NOXINST
  #FUSES NOPROTECT
  #FUSES NOFCMEN
  #FUSES NOIESO
  #FUSES NOCPUDIV
  #FUSES HSPLL
  #FUSES PLL3
  #FUSES RTCOSC_INT

  #use delay(crystal=12Mhz, clock=48Mhz)

  #USE RS232(UART1,ERRORS,BAUD=9600,STREAM=WIFI,ERRORS)
   
  #include <usb_cdc.h>

  #define BUFFER_SIZE 32
  BYTE buffer[BUFFER_SIZE];
  BYTE next_in = 0;
  BYTE next_out = 0;

  #int_rda
  void serial_isr() {
     int t;

     buffer[next_in]=fgetc();
     t=next_in;
     next_in=(next_in+1) % BUFFER_SIZE;
     if(next_in==next_out)
       next_in=t;           // Buffer full !!
  }

  #define bkbhit (next_in!=next_out)

  BYTE bgetc()
  {
     BYTE c;

     while(!bkbhit) ;
     c=buffer[next_out];
     next_out=(next_out+1) % BUFFER_SIZE;
     return(c);
  }
   
  void inicbuff(void){ // Inicia a \0 cbuff -------------------
    int i;

    for(i=0;i<BUFFER_SIZE;i++){   // Bucle que pone a 0 todos los
      buffer[i]=0x00;          // caracteres en el buffer
    }
   
  }

  void main() {
       
     char palabra[BUFFER_SIZE];
     delay_ms(100);
     usb_init();
     delay_us(100);
     inicbuff(); // Borra buffer al inicio
     
     enable_interrupts(int_rda);
     enable_interrupts(global);
     int i=0;
     delay_ms(50);
     
     while(TRUE)
     {
         delay_ms(50);
         if(bkbhit)
             printf(usb_cdc_putc,"%c" ,bgetc());
   
         usb_task();
         if (usb_enumerated())
         {
             if (usb_cdc_kbhit())
             {
               
                 printf(usb_cdc_putc,"\r\n");      //limpia la pantalla
                 get_string_usb(palabra,BUFFER_SIZE);     //obtiene la palabra escrita en el teclado
                 printf(usb_cdc_putc,"\r\n");
                 inicbuff();
               
                 if(palabra[0]!=0x00)
                     fputs(palabra,WIFI);                  //  manda la palabra del teclado al modulo
               
             }
             
         }
         
         
     }

  }



Feliz año nuevo!
« Última modificación: 02 de Enero de 2016, 11:58:26 por sebalitter »
Saludos

Desconectado sebalitter

  • PIC10
  • *
  • Mensajes: 5
Re:2 USART con PIC18F26J50
« Respuesta #3 en: 03 de Enero de 2016, 21:39:45 »
Logre conectar el modulo RN-171 a internet y en el momento en que se conecta deja de transmitir/recibir por la uart. Por que pasa esto?

Saludos
Saludos

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:2 USART con PIC18F26J50
« Respuesta #4 en: 03 de Enero de 2016, 23:19:52 »
No tengo respuesta para eso. Yo jamas use ese modulo

Desconectado sebalitter

  • PIC10
  • *
  • Mensajes: 5
Re:2 USART con PIC18F26J50
« Respuesta #5 en: 17 de Marzo de 2016, 15:54:30 »
Alguien me puede ayudar con esto?
Saludos

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:2 USART con PIC18F26J50
« Respuesta #6 en: 17 de Marzo de 2016, 17:24:28 »
Una pregunta que tal ves se me paso, todo esto lo estas alimentando desde el USB ¿?

Probaste alimentar el modulo con una fuente aparte? Tal ves el USB no entrega toda la corriente que uno desea y cuando se conecta a internet que es cuando deberia consumir mas energia muere por no tener buena alimentacion. Es una de las cosas que se me ocurrio.

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7918
Re:2 USART con PIC18F26J50
« Respuesta #7 en: 17 de Marzo de 2016, 19:50:38 »
Tengo un modulo de esos durmiendo en la caja en que vino y ese PIC también.
Si me pasas el esquemático de tu placa, lo armo igual, así puedo ayudarte, y viceversa.
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado sebalitter

  • PIC10
  • *
  • Mensajes: 5
Re:2 USART con PIC18F26J50
« Respuesta #8 en: 17 de Junio de 2016, 12:12:35 »
Buenas,

Estuve mejorando un poco el codigo.
Logre que se vea la informacion correctamente pero a veces es necesario resetear la terminal en el Hyperterminal. No se a que se debe ese problema.
Este codigo es para conectarse al RN171 a traves de un pic ( 18F26J50 ) por RS232  y obtener informacion de algun servido. Usando el compilador CCS.
Hay una pagina web, que esta el codigo PHP abajo. donde modifica valores de una base de datos. El modulo hace una consulta a esa base de datos y manda el dato al PIC que maneja I/O.

Al ingresar al CMD sale el siguiente error ERR: ?-Cmd.

Si alguien tiene un codigo mejor o algo para poder mejorarlo seria bueno.


Código: [Seleccionar]

#include <18F26J50.h>   // -> PCH
#device adc=16
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
#include <stdio.h>
#include <pic18_usb.h> //Microchip PIC18Fxx5x Hardware layer for CCS's PIC USB driver
#include <usb_cdc.h> // Descripción de funciones del USB.
#include <usb_desc_cdc.h> // Descriptores del dispositivo USB.

#FUSES NOWDT      //No Watch Dog Timer
//#FUSES NODEBUG    //No Debug mode for ICD
#FUSES NOXINST    //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
#FUSES NOPROTECT  //Code not protected from reading
#FUSES NOFCMEN
#FUSES NOIESO
#FUSES NOCPUDIV
//#FUSES HSPLL      //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES PLL3
#FUSES RTCOSC_INT

#use delay(crystal=12Mhz, clock=48Mhz)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, parity=N ,stop=1, bits=8, stream = RN171)  //// RS232 Configuration with RN171

#use rs232(baud=9600, xmit=PIN_C4, rcv=PIN_C5, parity=N, stop=1,  bits=8, stream = PC)  // RS232 Configuration with PC
#use standard_io(c)
#use fast_io(b)




#define CTS PIN_B2     //wake RN171 to receive data RX  GPIO_12  clear to send
#define RTS PIN_B1     //wake RN171 to receive data RX  GPIO_13  ready to send
#define BUFFER_SIZE 150
char buffer[BUFFER_SIZE];
char palabra[BUFFER_SIZE];
char delimitar[] = "|||";
int next_in = 0;
int next_out = 0;
char *tokens[10];

int segundos=0 , segundos_ant = 0 ;      // A running seconds counter

//int8 int_count = 0;    // Number of interrupts left before a second has elapsed

int cant_tokens=0;


//Functions
void inicbuff(void){ // Inicia a \0 cbuff -------------------
  int i;

  for(i=0;i < BUFFER_SIZE;i++){   // Bucle que pone a 0 todos los
    buffer[i]=0x00;          // caracteres en el buffer
  }

}

void inicpalabra(void){ // Inicia a \0 cbuff -------------------
  int i;

  for(i=0;i < BUFFER_SIZE;i++){   // Bucle que pone a 0 todos los
    palabra[i]="";          // caracteres en palabra
  }
}

#define bkbhit (next_in!=next_out)

BYTE bgetc()
{
   BYTE c;

   while(!bkbhit) ;
   c = buffer[next_out];
   next_out=(next_out+1) % BUFFER_SIZE;
   return(c);
}

int almacenarDatos(char *string, char *delim) //, char *tokens[])
{
    int count=0;
    char *stringp;
   
    stringp = string;
    char* token;

    for (token = strtok(stringp, delim); token; token = strtok(NULL, delim))
    {
        tokens[count]= token;
        count++;
    }
   
    return count;
}

void mostrarDatos( int cant)   //char *dat[],
{
    int i;
    //printf(usb_cdc_putc,"\n\rcount %d, %s , %s , %s , %s", cant, tokens[0], tokens[1], tokens[2], tokens[3]);
    for (i = 0; i < cant; i++)   //  condicion final   MIENTRAS QUE i sea menor a count
        printf(usb_cdc_putc,"\n\r %d/%d - %s ",i,cant, tokens[i]);
}




/*
ps:Pre escaler   256   
tinst:4/frecuencia del cristal   (4/4000000)    PLL3 -> 12000000/3  = 4000000 Hz
carga:Valor a cargar en el timer 0
temp: tiempo deseado a temporizar   1 seg
 *
 * temp = tinst * 256 * (65536 - carga)
 * 1seg = 4/4000000 * 256 * (65536 - carga)
 *
*/


//interrupts
#int_timer0                       
void  TIMER0_isr(void)
{
    segundos++;
    if(segundos > 59)
        segundos=0;
   
}

#int_rda
void serial_isr() {
    int t=0;
   
    buffer[next_in]= getch(RN171);
    t=next_in;
    next_in=(next_in+1) % BUFFER_SIZE;
    if(next_in==next_out) {
        next_in=t;           // Buffer full !!
         
    }
}
 

void main() {

   //inputs 1, outputs 0
   SET_TRIS_C( 0b11010111 );   // pone C como entradas y C4 y C6 como salidas (Sensor)
   SET_TRIS_B(0x00 );           //Configuramos el puerto b como salidas   
   
   output_b(0x00);
   usb_cdc_init(); // Configuramos al puerto virtual.
   
   delay_ms(100);
   
   usb_init();        // Inicializamos el stack USB.
   usb_task();                      //habilita periferico usb e interrupciones
   usb_wait_for_enumeration();      //esperamos hasta que el PicUSB sea configurado por el host
   
   while(!usb_cdc_connected()) {} // espera a detectar una transmisión de la PC
   inicbuff(); // Borra buffer al inicio
   inicpalabra();
   
   setup_oscillator (OSC_PLL_ON);   //IMPORTANTIIIISIMO SI NO NO FUNCIONA USB NI USART
   
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256);
   set_timer0(3906);
   
   //interrupts
   enable_interrupts(int_rda);
   enable_interrupts(INT_TIMER0);
   enable_interrupts(global);
   
   
   output_high(CTS);   //ready to send
   printf(usb_cdc_putc,"\n\r :--------------Start-----------------:\n\r");
   while(TRUE)
   {
       
       delay_us(1000);
       if(palabra[0]!=0x00)
       {
           
            buffer[BUFFER_SIZE-1]='\0';
            palabra[BUFFER_SIZE-1]='\0';
            //printf(usb_cdc_putc,"\n\r --------------PALABRA:%S", palabra);    //ver en la PC lo que se manda al modulo
            delay_ms(100);
         
           
            fprintf(RN171,"%S",palabra);          //  manda la palabra del teclado al modulo
            delay_ms(100);
            inicpalabra();

           
        }
       
        delay_ms(100);
        while(bkbhit)
        {
            putc( bgetc() ); 
        }
       
        delay_us(100);
        usb_task();
     
        if( !bkbhit )
        {
       
            cant_tokens = almacenarDatos(buffer,delimitar);
           
            if (usb_enumerated())
            {
                if (usb_cdc_kbhit())
                {
                    get_string_usb(palabra,BUFFER_SIZE);     //obtiene la palabra escrita en el teclado
                }   
            }
           
        }
       
        if(segundos != segundos_ant)
        {
           
            delay_us(50);
            mostrarDatos(cant_tokens); 
           
            segundos_ant=segundos;
        }     
       
   }
}
 




Código: [Seleccionar]

<?php 
//data format ->  |||tipo-valor|||tipo-valor|||tipo-valor|||tipo-valor|||
date_default_timezone_set('America/Argentina/Buenos_Aires');

include_once 'action/conexion.php';
$sql "SELECT * FROM registros order by id desc limit 1";
$con=conexion();

$result=  mysqli_query($con,$sql);
$count=0;
while($dato mysqli_fetch_object($result))
{
echo '||| TIEMPO='.$dato->temperatura;
echo '||| MODO='.$dato->modo;
echo '||| VELOCIDAD='.$dato->velocidad
echo '||| DURACION='.$dato->duracion;
//echo ($dato->fecha_inicio=='0000-00-00 00:00:00')?'':'|Fi='.$dato->fecha_inicio;
//echo ($dato->fecha_fin=='0000-00-00 00:00:00')?'':'|Ff='.date("F j, g:i a"); 
echo "||| \n\r";
$count++;
}

if($count==0)
echo "\n\rNo hay registros";

?>


« Última modificación: 28 de Agosto de 2016, 20:33:28 por sebalitter »
Saludos


 

anything