Autor Tema: Enviar 2 Byte desde un PC puerto Serial a un PIC18F4550  (Leído 5308 veces)

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

Desconectado adoher

  • PIC10
  • *
  • Mensajes: 13
Enviar 2 Byte desde un PC puerto Serial a un PIC18F4550
« en: 29 de Agosto de 2016, 02:53:31 »
Mucho gusto, quedo muy agradecido por su atención.

En el momento estoy necesitando asesoría en PIC 18F4550 Microchip.

Estoy enviando por puerto serial los números del 0 al 9 al PIC indicado y se
ejecuta el requerimiento, como se observa en código.


Cuando envió el numero 10, el programa primero me captura el 1 y después el cero, por que son dos Byte diferentes. Donde puedo ubicar un código que me capture en Buffer el numero 10.

Adicional en


switch (cdna)
      {
      case '0':PORTB=0B00000000; BREAK;

      case '10'


Cuando voy a crear el case '10' se presenta el error al compilar "Character constant constructed incorreltly"

Cogido:

#include "C:\Documents and Settings\Adminest\Escritorio\Prueba Serie PIC PC\p_led\main.h"
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
#include <string.h>
#define usart.h

#BYTE PORTA = 0XF80
#BYTE PORTB = 0XF81
#BYTE PORTC = 0XF82
#BYTE PORTD = 0XF83
#BYTE PORTE = 0XF84
#BYTE TRISA = 0XF92
#BYTE TRISB = 0XF93
#BYTE TRISC = 0XF94
#BYTE TRISD = 0XF95
#BYTE TRISE = 0XF96

char cdna[2];

#int_rda
void rda_isr(void)
{
 cdna=getch();
}

void main()
{
//Setup_Oscillator parameter not selected from Intr Oscillator Config tab
  PORTB=0X00;
  TRISB=0B00000000;
  PORTD=0X00;
  TRISD=0B00000000;
  enable_interrupts(int_rda);
  enable_interrupts(global);

  while(TRUE)
  { 
      switch (cdna)
      {
      case '0':PORTB=0B00000000; BREAK;
      case '1':PORTB=0B00000001; BREAK;
      case '2':PORTB=0B00000010; BREAK;
      case '3':PORTB=0B00000011; BREAK;
      case '4':PORTB=0B00000100; BREAK;
      case '5':PORTB=0B00000101; BREAK;
      case '6':PORTB=0B00000110; BREAK;
      case '7':PORTB=0B00000111; BREAK;
      case '8':PORTB=0B00001000; BREAK;
      case '9':PORTB=0B00001001; BREAK;
      case 't':PORTB=0B00001010; BREAK;
      case 'a':PORTB=0B11111111; BREAK;
      case 'b':PORTB=0B01010101; BREAK;
      case 'c':PORTB=0B10101010; BREAK;
      case 'd':PORTB=0B11110000; BREAK;
      case 'e':PORTB=0B00001111; BREAK;
      case 'f':PORTD=0B10101111; BREAK;
      }
  }
}

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Enviar 2 Byte desde un PC puerto Serial a un PIC18F4550
« Respuesta #1 en: 29 de Agosto de 2016, 08:56:00 »
El case solo funciona con numeros.

el '1' en si es un 0x31, cuando vos pones '10' ya es imposible, primero por como funcionan los string en C y segundo eso ya no es mas un caracter.

En todo caso seria una "10" en ves de '10', ahora una string estaria formada por '1','0',0x00

------------

La solucion a tu problema es tener un numero fijo de letras en tu trama o un delimitador, me explico, es imposible distinguir si solo envias '1' que "10", por que si envias el 1 primero no sabes cual de los 2 es. Distinto es algo asi:

"1n", "10n"

por que luego de recibir el 1, si llega una 'n' se que ahi termina, entonces paso ese '1' a un un numero ( le resto 0x30 ) y me queda 1.
Si llega un '1', luego un '0' y luego la 'n' entonces procedo a restarle 0x30 al '1' y al '0', multiplico el primer valor por 10 y le sumo las unidades, como salida tendria 10

Es decir estoy convirtiendo ese conjunto de caracteres que estaban en ASCII en decimales, una ves que llego la n y terminaste todo lo de la conversion, activas una variable de 1 bit asi con un if en el loop principal entras al switch, antes de salir del if procedes a ponerlo en 0, asi que solo se va a actualizar cuando le pongas un 1 desde la interrupcion

Desconectado adoher

  • PIC10
  • *
  • Mensajes: 13
Re:Enviar 2 Byte desde un PC puerto Serial a un PIC18F4550
« Respuesta #2 en: 01 de Septiembre de 2016, 11:54:48 »
Mil gracias KILLERJC.

La explicación es bien fundamentada, Pero hay que realizar el código, donde ubico un ejemplo para PIC C y así implementar la solución.

Desconectado adoher

  • PIC10
  • *
  • Mensajes: 13
Re:Enviar 2 Byte desde un PC puerto Serial a un PIC18F4550
« Respuesta #3 en: 05 de Septiembre de 2016, 12:27:56 »
Mucho gusto, con base explicación he realizado los ajustes y aun no obtengo los resultados.

#include "C:\Documents and Settings\Adminest\Escritorio\Prueba Serie PIC PC\p_led\main.h"
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
#include <string.h>
#include <stdlib.h>
#define usart.h

#BYTE PORTA = 0XF80
#BYTE PORTB = 0XF81
#BYTE PORTC = 0XF82
#BYTE PORTD = 0XF83
#BYTE PORTE = 0XF84
#BYTE TRISA = 0XF92
#BYTE TRISB = 0XF93
#BYTE TRISC = 0XF94
#BYTE TRISD = 0XF95
#BYTE TRISE = 0XF96

char cdna;
int cont=0;
char texto[4];
int num;

#int_rda
void rda_isr(void)
{
 cdna=getch();

}

void main()
{
//Setup_Oscillator parameter not selected from Intr Oscillator Config tab
  PORTB=0X00;
  TRISB=0B00000000;
  PORTD=0X00;
  TRISD=0B00000000;
  enable_interrupts(int_rda);
  enable_interrupts(global);

  while(TRUE)
  {   
     if ( cdna == 'n')
     {
     
      if (cont== 1 )
      { texto[0] = texto[0] - 0x30 ;
      }
      if (cont== 2 )
      { texto[0] = (texto[0] - 0x30) *10  ;
        texto[1] = texto[1] - 0x30 ;
      }
      num=atoi(texto[0]);
      cont=0;
      switch (num)
      {
      case "0":PORTB=0B00000000; BREAK;
      case "1":PORTB=0B00000001; BREAK;
      case "2":PORTB=0B00000010; BREAK;
      case "3":PORTB=0B00000011; BREAK;
      case "4":PORTB=0B00000100; BREAK;
      case "5":PORTB=0B00000101; BREAK;
      case "6":PORTB=0B00000110; BREAK;
      case "7":PORTB=0B00000111; BREAK;
      case "8":PORTB=0B00001000; BREAK;
      case "9":PORTB=0B00001001; BREAK;
      case "10":PORTB=0B00001010; BREAK;
      case "11":PORTB=0B11111111; BREAK;
      case "12":PORTB=0B01010101; BREAK;
      case "13":PORTB=0B10101010; BREAK;
      case "14":PORTB=0B11110000; BREAK;
      case "15":PORTB=0B00001111; BREAK;
      case "16":PORTD=0B10101111; BREAK;
      }
      }else {
        texto[cont] = cdna;
        ++cont;
      }
     
  }
 
}

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Enviar 2 Byte desde un PC puerto Serial a un PIC18F4550
« Respuesta #4 en: 06 de Septiembre de 2016, 08:36:57 »
Tenes varios errores de concepto de lo que es C, imagino que primero deberias de mirar un tutorial de C, especialmente en el tipo de datos.

Otra cosa mas, bajate el manual de CCS si es que vas a usar ese compilador.

Código: C
  1. #use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
  2.  
  3. char cdna[2];
  4. int cont=0,indice=0;
  5. int num;
  6. int1 datolisto;
  7.  
  8. #int_rda
  9. void rda_isr(void)
  10. {
  11.         cdna[indice]=getch() - 0x30;
  12.         if(cdna[indice] < 9)
  13.         {
  14.                 // Solo aumento si lo que llego es un dato valido
  15.                 indice++;
  16.         }
  17.         if(indice == 2 )
  18.         {
  19.                 indice = 0;
  20.                 datolisto = true;
  21.         }
  22. }
  23.  
  24. void main()
  25. {
  26.        
  27.         output_b(0);
  28.         output_d(0);
  29.         enable_interrupts(int_rda);
  30.         enable_interrupts(global);
  31.  
  32.         while(TRUE)
  33.         {  
  34.                 if ( datolisto == true )
  35.                 {
  36.                         datolisto = false;
  37.                        
  38.                         num = cdna[0] * 10 + cdna[1];
  39.                         switch (num)
  40.                         {
  41.                                 case 0:
  42.                                         output_b(0);
  43.                                         break;
  44.                                 case 1:
  45.                                         output_b(0b00000001);
  46.                                         break;
  47.                                 default:
  48.                                         break;
  49.  
  50.                 }
  51.       }
  52. }

Desconectado adoher

  • PIC10
  • *
  • Mensajes: 13
Enviar 2 Byte desde un PC puerto Serial a un PIC18F4550
« Respuesta #5 en: 11 de Septiembre de 2016, 21:05:22 »
Quiero presentar mis agradecimiento a KILLERJC, por todo su apoyo, con base a su explicación y el ejemplo logre realizar mi requemamiento. Ya puedo enviar un numero de 0 a 255 y lo presentarlo por el puerto B o D.

El código lo  ajuste a mi necesidad y es el siguiente:

#include "C:\Prueba Serie PIC PC\p_led\main.h"
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
#include <string.h>
#include <stdlib.h>
#define usart.h

#BYTE PORTB = 0XF81
#BYTE PORTC = 0XF82
#BYTE PORTD = 0XF83
#BYTE TRISB = 0XF93
#BYTE TRISC = 0XF94
#BYTE TRISD = 0XF95

char cdna[4];  //Almacena Cuatro Bytes
int indice=0;
int num;
int1 datolisto;

#int_rda
void rda_isr(void)
{
  cdna[indice]=getch() - 0x30;
  if(cdna[indice] < 9)
    {
     // Solo aumento si lo que llego es un dato valido
    indice++;
    }
  if(indice == 4 )
    {
     indice = 0;
     datolisto = true;
    }
}

void main()
{
//Setup_Oscillator parameter not selected from Intr Oscillator Config tab
  PORTB=0X00;
  TRISB=0B00000000;
  PORTD=0X00;
  TRISD=0B00000000;
  enable_interrupts(int_rda);
  enable_interrupts(global);

  while(TRUE)
  {
    if ( datolisto == true )
    {  datolisto = false;
               
        if ( cdna[0] == 0 )
        {
          if ( cdna[1] == 0 ){ num = cdna[2];  }
          if ( cdna[1] > 0 ){ num = cdna[1] * 10 + cdna[2];  }
        }
       
        if ( cdna[0] > 0 ){num = cdna[0] * 100 + cdna[1] * 10 + cdna[2];}
        //Seleccona el puerto 1: PortB  2:PortD e imprime un valor de 0 a 255
        if ( cdna[3] == 1 ){  output_b(num); }
        if ( cdna[3] == 2 ){  output_d(num); }
    }
  }
}

Desconectado adoher

  • PIC10
  • *
  • Mensajes: 13
Re:Enviar 2 Byte desde un PC puerto Serial a un PIC18F4550
« Respuesta #6 en: 14 de Septiembre de 2016, 16:49:31 »
Mil gracias por el apoyo que pueda brindar.

En mi ultima respuesta, indico que el código esta funcionando correctamente, pues en simulador Proteus Release 7.6 funciona a la perfección.

Grabo en PIC18F4550 la aplicación, y realizo las conexiones con MAX232 tal como están el simulador. Envió el dato y no se enciende ningún led.

Que me puede hacer falta.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Enviar 2 Byte desde un PC puerto Serial a un PIC18F4550
« Respuesta #7 en: 14 de Septiembre de 2016, 18:30:43 »
fijate los FUSES, Proteus no tiene en cuenta los FUSES ni el oscilador

Desconectado adoher

  • PIC10
  • *
  • Mensajes: 13
Enviar 2 Byte desde un PC puerto Serial a un PIC18F4550
« Respuesta #8 en: 17 de Septiembre de 2016, 00:55:33 »
Nuevamente muchas gracias KILLERJC.

Efectivamente modifique los parámetros FUSES y ya esta funcionando.

Al ultimo programa se debe reemplazar los parámetros FUSES por los siguientes.

#fuses HS,NOWDT,NOPROTECT,NOLVP,NODEBUG,NOBROWNOUT,USBDIV,PLL5,CPUDIV1,VREGEN,PUT,MCLR

Desconectado adoher

  • PIC10
  • *
  • Mensajes: 13
Re:Enviar 2 Byte desde un PC puerto Serial a un PIC18F4550
« Respuesta #9 en: 24 de Julio de 2017, 12:06:53 »
Mucho gusto, mi última consulta fue en Septiembre del 2017.

Quedo muy agradecido por todo el apoyo recibido.

Hasta hace un mes me funciono perfecto el código que indico a continuación. logre enviar 0001 al 2551 y 0002 al 2552 sin problemas por el puerto serie en diferentes equipos, empleo MAX232 y igual envié datos Wifi con el modulo ESP8266. Todo funciono sin novedad.

En este momento envió datos y el PIC no responde, he cambiado de PIC y MAX232 y no funciona, no recibe datos, igual tengo una aplicación que envía datos TxD a un computador y funciona, pero cuando empleo la aplicación para que reciba Byte.

En simulador PROTEUS funciona de todas las formas. Pero no se que error estoy cometiendo en la programación del PIC18F4550

Para alimentar el circuito, empleo una fuente de 20 de un portátil y un regulador de voltaje LM7805

Código:


#include "D:\Rcrss_Acdmcos\MAESTRIA_INF_IND\SEAS\13_T_INFINDU\003_DTesis\003_lzonas\z_activar_iluminacion\main.h"
#fuses XT,NOWDT,NOPROTECT,NOLVP,NODEBUG,NOBROWNOUT,PUT
//#fuses HS,NOWDT,NOPROTECT,NOLVP,NODEBUG,NOBROWNOUT,USBDIV,PLL5,CPUDIV1,VREGEN,PUT,MCLR
#use rs232(baud=9600,xmit=pin_c6,rcv=pin_c7,parity=N,bits=8)
// xmit=pin_c6 RC6 TxD;  rcv=pin_c7  RC7 RxD
#include <string.h>
#include <stdlib.h>
#define usart.h

#BYTE PORTA = 0XF80
#BYTE PORTB = 0XF81
#BYTE PORTC = 0XF82
#BYTE PORTD = 0XF83
#BYTE TRISB = 0XF93
#BYTE TRISC = 0XF94
#BYTE TRISD = 0XF95

#Bit  RC5 = PORTC.5

char cdna[4];  //Almacena Cuatro Bytes  0011
int indice=0;
int num;
int1 datolisto;

#int_rda
void rda_isr(void)
{
  cdna[indice]=getch() - 0x30;
  if(cdna[indice] <= 9)
    {
     // Solo aumento si lo que llego es un dato valido
     indice++;
    }
  if(indice == 4 )
    {
     indice = 0;
     datolisto = true;
    }
}

void main()
{
//Setup_Oscillator parameter not selected from Intr Oscillator Config tab
//  port_b_pullups(FAlSE);
  PORTB=0X00;
  TRISB=0B00000000;
  PORTC=0X00;
  TRISC=0B10000000;
  PORTD=0X00;
  TRISD=0B00000000;
  enable_interrupts(int_rda);
  enable_interrupts(global);
 
 
  while(TRUE)
  { //PORTB=cdna;
    //delay_ms(200);
    if ( datolisto == true )
    {  datolisto = false;
        RC5=1;
           
        if ( cdna[0] == 0 )
        {
          if ( cdna[1] == 0 ){ num = cdna[2]; }
          if ( cdna[1] > 0 ) { num = cdna[1] * 10 + cdna[2];  }
        }
        if ( cdna[0] > 0 ){num = cdna[0] * 100 + cdna[1] * 10 + cdna[2];}
        if ( cdna[0] == 0 )
           {
           if ( cdna[1] == 0 )
              { 
              if ( cdna[2] == 0 )
              {num = cdna[0] + cdna[1] + cdna[2];}
              }
        }
       
        //0011  El ultimo digito define el puerto
        //Seleccona el puerto 1: PortB  2:PortD e imprime un valor de 0 a 255
        if ( cdna[3] == 1 ){  PORTB=num; cdna[0]="";cdna[1]="";cdna[2]="";cdna[3]="";}
        if ( cdna[3] == 2 ){  PORTD=num; cdna[0]="";cdna[1]="";cdna[2]="";cdna[3]="";}
       }
       
  }
 
}

Desconectado Pinolillo16

  • PIC18
  • ****
  • Mensajes: 324
Re:Enviar 2 Byte desde un PC puerto Serial a un PIC18F4550
« Respuesta #10 en: 25 de Julio de 2017, 00:13:43 »
Que tal Adoher no leí el código, pero te puedo comentar que el problema puede estar en tu regulador de voltaje. Ya que me ha pasado que estos reguladores en distintas marcas soportan algunos menos voltaje. He probado 7805 chinos y con 12v se calientan demasiado perdiendo funcionalidad. Algunos americanos soportan bien hasta 18v sin calentarse, la solución a esto he puesto diodos en serie antes de Vin para bajar un poco la tensión de entrada y evitar calentones. Si tú programa funciona bien en el simulador puede que este en el regulador el problema. También podrías intentar con otro tipo de regulador un dc-dc para mayor eficiencia. Espero te ayude a algo mi comentario. Saludos

Desconectado adoher

  • PIC10
  • *
  • Mensajes: 13
Re:Enviar 2 Byte desde un PC puerto Serial a un PIC18F4550
« Respuesta #11 en: 30 de Julio de 2017, 01:10:06 »
Mil gracias por la orientación. 

El tema lo solucione cambiando de Protoboard, por lo tanto ya esta funcionando y realice las pruebas funcionales. El paso siguiente, conformare los elementos en una PCB, que ya están elaborando.

Los reguladores los estoy buscando que sean como se me recomienda.

El protoboard es un elemento que permite ensamblar circuitos electrónicos, estos pueden presentar fallas, que en primera instancia, creemos que los componentes están malos o hay una mala conexión. Si se cambian de posición o de protoboard funcionan los circuitos ensamblados.

Gracias.