Autor Tema: mil vueltas... en una sencilla comunicación serie entre pic  (Leído 8586 veces)

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

Desconectado daltonico82

  • PIC12
  • **
  • Mensajes: 89
Re: mil vueltas... en una sencilla comunicación serie entre pic
« Respuesta #15 en: 20 de Mayo de 2011, 13:34:49 »
Hola, he borrado los delay que me dices y he comprobado que los bytes que visualizo en el puerto son el corrspondiente a valor[0], valor[2]. Creo que con eso será suficiente para poner a trabajar la aplicación.... pero me mosquea pues el fabricante del driver me dice:

                   
    " Tanto los comandos como los datos se transfieren entre el controlador y el host a nivel de bytes en hexadecimal, lo que permite una comunicación serie más ágil y rápida.
Una vez conectado el sistema conviene esperar unos 50ms para que el controlador realice sus ajustes internos. Cada vez que se toca el Touch Screen el controlador transmite 2 bytes para la coordenada X y otros 2 para la coordenada Y. La coordenada X representa en hexadecimal, la posición horizontal y la coordenada Y la posición vertical en pantalla...."


Un saludo :-/ :-/ :-/

Desconectado pablomanieri

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 639
Re: mil vueltas... en una sencilla comunicación serie entre pic
« Respuesta #16 en: 20 de Mayo de 2011, 14:54:59 »
Hola, prueba de comparar en la interrupción si el flag ya se puso en 0, tal vez estés mostrando los valores en el puerto D y aun no terminas y te vuelve a entrar en la interrupción. Es decir, que te asegures que has procesado todos los datos y recién ahí has caso a lo que recibes del touch. Porque como tienes unos delay de 2000ms, seguro que vuelve a entrar a la interrupción antes de que termines el ciclo de programa.

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: mil vueltas... en una sencilla comunicación serie entre pic
« Respuesta #17 en: 20 de Mayo de 2011, 15:03:25 »
pues si esta raro que haga eso, pero al parecer si se comunica, para asegurarte de que este recibiendo bien, porque no pruebas conectar tu touch con un cable serial a la computadora, y usas un hiperterminal para ver que esta enviando realmente, asi aseguras saber que recibes y despues checas que el pic reciba lo mismo.
"Nada es imposible, no si puedes imaginarlo"

Desconectado daltonico82

  • PIC12
  • **
  • Mensajes: 89
Re: mil vueltas... en una sencilla comunicación serie entre pic
« Respuesta #18 en: 20 de Mayo de 2011, 15:32:19 »
Interesantes consejos... Los pruebo!!!! y cuento :shock: :shock: :shock:

Desconectado daltonico82

  • PIC12
  • **
  • Mensajes: 89
Re: mil vueltas... en una sencilla comunicación serie entre pic
« Respuesta #19 en: 21 de Mayo de 2011, 07:29:33 »
OK AMIGOS!!!! buenos consejos.... he chequeado si el "flag==0" antes de realizar otra lectura y probe la conexión con el hiperterminal y sólo recibo 2bytes. Lo justo!!!! un byte referente a la coordenada X (posición horizontal en pantalla) y otro byte referente a la coordenada Y (posición vertical en pantalla).

Ahora me dispongo a hacer un pequeño programa que testée los datos que llegan a través de la UART para activar y desactivar salidas, a modo interruptor.

Un saludo y muchas gracias. Sus consejos me han ayudado a avanzar y como siempre en este foro a avanzar aprendiendo que es lo mejor!!!

Desconectado daltonico82

  • PIC12
  • **
  • Mensajes: 89
Re: mil vueltas... en una sencilla comunicación serie entre pic
« Respuesta #20 en: 25 de Mayo de 2011, 13:43:37 »
hOLA de nuevo!!!!

Aqui dejo un pequeño programa mediante el cuál activo las salidas asociadas al puerto D durante 1 segundo cuando pulso en una zona determinada del touch screen...

Este es el aperitivo a un programa que activará y desactivará salidas a modo interruptor. La base será la aquí mostrada: conocer los bytes que nos da el controlador al pulsar en cada una de las zonas y activar la salida correspondiente

Saludos picmaniacos!!!!

Código: [Seleccionar]
#include <16f877.h>
#fuses HS,NOWDT,NOPROTECT,NOPUT,NOBROWNOUT,NOLVP,NOCPD,NOWRT
#use delay(clock=20000000)
#use RS232 (baud=38400, bits=8,parity=N, xmit=PIN_C6, rcv=PIN_C7)

#use fast_io(A)
#use fast_io(B)
#use fast_io(C)                   
#use fast_io(D)                   
#use fast_io(E)                   

#byte PORTA = 0X05
#byte PORTB = 0X06
#byte PORTC = 0X07                     
#byte PORTD = 0X08
#byte PORTE = 0X09

int SX1=0X2B;//coordenadas max y min: X
int SX2=0X61;

int S0Y1=0X26;//coordenadas max y min: y
int S0Y2=0x3C;

int lectura=0;
int valor[4];
int i=0;
int1 flag=0;

#int_rda
void RDA_isr()
{
           
      if(kbhit())
      {
        lectura=getc();
        valor[i]=lectura;
        i++;
         if(i==4)
         {
              flag=1;
              i=0;
         }
      }
}

void main()
{
   delay_ms(50);
   SET_TRIS_A (0xFF);
   SET_TRIS_B (0x0F);
   SET_TRIS_C (0x80);
   SET_TRIS_D (0X00);
   /*for(i=0;i<4;i++)
      {
         valor[i]=0;   
      }*/
   //flag=0;
   //lectura=0x00;
   PORTD=0X00;
   //int e=0;
   enable_interrupts(INT_RDA);
   enable_interrupts(GLOBAL);
   //delay_ms(300);
   
   while(true)
      {
        // delay_ms(100);
       // valor[0]=(valor[0])&&(0xF0);
         if(flag==1)
         {
     
         
         if (valor[2]<(SX2))//las X
         {
         if (valor[2]>(SX1))
         {
         if (valor[0]<S0Y2)//las Y
         {
         if (valor[0]>S0Y1)
         {
       
         PORTD=0XFF;
         delay_ms(1000);
         PORTD=0X00;
         flag=0;
         }
         }
         }
         }
       
         }
        // PORTD=0;
         
       
       
      }
}

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: mil vueltas... en una sencilla comunicación serie entre pic
« Respuesta #21 en: 26 de Mayo de 2011, 00:36:03 »
muy bien!, que bueno que ya puedes leer los datos, solo una duda, si dices que ya confirmaste que tu touch te envia solamente 2 datos, porque en tu funcion de la interrupcion por rs232 no cambias para que "flag" se haga 1 cuando recibes 2 datos en lugar de 4
}
"Nada es imposible, no si puedes imaginarlo"

Desconectado daltonico82

  • PIC12
  • **
  • Mensajes: 89
Re: mil vueltas... en una sencilla comunicación serie entre pic
« Respuesta #22 en: 31 de Mayo de 2011, 15:49:11 »
Hola!!!

Así tengo el programa. Ya recibo los datos y soy capaz de conseguir un ofecto interrupor al tocar  el panel táctil (3 teclas).

Ahora me dispongo a comunicar en rs232 pero enviando datos e intentar emitir un "beep" cada vez que se realice una pulsación válida.

Estamos en contacto. Iré poniendo los avances.

Código: [Seleccionar]
#include <16f877.h>
#fuses HS,NOWDT,NOPROTECT,NOPUT,NOBROWNOUT,NOLVP,NOCPD,NOWRT
#use delay(clock=20000000)
#use RS232 (baud=38400, bits=8, parity=N, xmit=PIN_C6, rcv=PIN_C7)
//#use RS232 (baud=38400, xmit=PIN_C6, rcv=PIN_C7)

#use fast_io(A)
#use fast_io(B)
#use fast_io(C)                   
#use fast_io(D)                   
#use fast_io(E)                   

#byte PORTA = 0X05
#byte PORTB = 0X06
#byte PORTC = 0X07                     
#byte PORTD = 0X08
#byte PORTE = 0X09

#bit D0=PORTD.0
#bit D1=PORTD.1
#bit D2=PORTD.2

const int SX1=0X2B;//coordenadas max y min: X
const int SX2=0X61;

const int S0Y1=0X26;//coordenadas max y min: Y_TECLA S0
const int S0Y2=0x3C;

const int S1Y1=0X40;//coordenadas max y min: Y_TECLA S1
const int S1Y2=0x59;

const int S2Y1=0X5B;//coordenadas max y min: Y_TECLA S2
const int S2Y2=0x73;

int1 Xok=0;
int lectura=0;
int valor[4];
int i=0;
int1 flag=0;

#int_rda

void RDA_isr()
{
           
        lectura=getc();
        valor[i]=lectura;
        i++;
         if(i==4)
         {
              flag=1;
              i=0;
         }
     
}

/*void RDA_isr()
{
         
         lectura=getc();
         if(flag==0){
           valor[i]=lectura;
           i++;
            if(i==4)
            {
                 flag=1;
                 i=0;
            }
        }     
} */


void main()
{
   
   delay_ms(50);//incialización controlador
   SET_TRIS_A (0xFF);
   SET_TRIS_B (0x00);
   SET_TRIS_C (0x80);
   SET_TRIS_D (0X00);
 
   setup_adc(ADC_OFF);
   setup_spi(FALSE);
   setup_psp(PSP_DISABLED);
   /*for(i=0;i<4;i++)
      {
         valor[i]=0;   
      }*/
   //flag=0;
   //lectura=0x00;
   PORTD=0X00;
   PORTB=0X00;
   
   enable_interrupts(INT_RDA);
   enable_interrupts(GLOBAL);
   
   
    while(true)
    {
         if(flag==1)
      {   
     
     delay_ms(50);
         flag=0;
         
         if((valor[2]<(SX2))&&(valor[2]>(SX1)))//las X; las 3 teclas en este caso están alineadas verticalmente==>mismas coordenadas X
         {
            Xok=1;
         }
         
         if ((Xok==1)&&(valor[0]<S0Y2)&&(valor[0]>S0Y1))
         {
         Xok=0;
         output_toggle(PIN_D0);
         }
         
         if ((Xok==1)&&(valor[0]<S1Y2)&&(valor[0]>S1Y1))
         {
         Xok=0;
         output_toggle(PIN_D1);
         }
   
         if ((Xok==1)&&(valor[0]<S2Y2)&&(valor[0]>S2Y1))
         {
         Xok=0;
         output_toggle(PIN_D2);
         }

         
   
      }//flag==1
     
   
}//while(1)
}//main()

Saludos :-/ :-/ :-/

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: mil vueltas... en una sencilla comunicación serie entre pic
« Respuesta #23 en: 31 de Mayo de 2011, 15:54:39 »
muy bien, que bueno que ya quedo, ire siguiendo tus post a ver como va tu proyecto.
"Nada es imposible, no si puedes imaginarlo"

Desconectado daltonico82

  • PIC12
  • **
  • Mensajes: 89
Re: mil vueltas... en una sencilla comunicación serie entre pic
« Respuesta #24 en: 31 de Mayo de 2011, 17:17:56 »
Hola; una aclaración que necesito antes de seguir: mi proyecto se divide en un mando, donde estará la "touch screen" y dónde albergaré el controlador y un PIC16F877 (1)que recoge los datos de la pulsación (lo que tengo hasta el momento) comunicando estos por RS232 y una placa remota dónde estará otro PIC16F877 (2) que comunicará bidireccionalmente en RS232 con el primer PIC.

La pregunta es la siguiente: El PIC16F877 (1) comunica tanto con el controlador (lee) y con el otro PIC (transmite y lee) por RS232. ¿Esto me lleva necesariamente a utilizar para una comunicación la UART y para la otra establecer una comunicación serie por soft???. ¿Cuál emplearíais para el controlador y cuál para comunicar con el PIC16F877 (2) que estará más lejos???

Gracias, debo aclarar ciertas cosas para no pisar sobre falso.

Saludos

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: mil vueltas... en una sencilla comunicación serie entre pic
« Respuesta #25 en: 31 de Mayo de 2011, 17:27:12 »
lo que te recomiendo es usar comunicacion I2c, con esta puedes conectar varios dispositivos con solo 2 pines.

pero si necesitas usar las los con rs232 te recomiendo que uses por hardware en la que vas a leer unicamente, para que en cualquier momento puedas recibir los datos por interrupcion.

"Nada es imposible, no si puedes imaginarlo"

Desconectado daltonico82

  • PIC12
  • **
  • Mensajes: 89
Re: mil vueltas... en una sencilla comunicación serie entre pic
« Respuesta #26 en: 02 de Junio de 2011, 13:51:08 »
Hola!!!!

En principio voy hacer las comunicaciones por RS232.

Entonces; el PIC1 ( el que está escuchando al controlador) recibe los datos de este por la USART y se producirá una interrupción. A su vez transmite y recibe del PIC2 utilizando la rs232 por software.

Voy a elavorar un programa pero es correcto esto para configurar ambas comunicaciones serie:

#include <16f877.h>
#fuses HS,NOWDT,NOPROTECT,NOPUT,NOBROWNOUT,NOLVP,NOCPD,NOWRT
#use delay(clock=20000000)
#use RS232 (baud=38400, bits=8, parity=N, xmit=PIN_C6, rcv=PIN_C7)
#use RS232 (baud=9600, xmit=PIN_C4, rcv=PIN_C5, FORCE_SW)

GraciaS

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: mil vueltas... en una sencilla comunicación serie entre pic
« Respuesta #27 en: 02 de Junio de 2011, 13:53:30 »
Podrías aprovechar la interrupción externa por flanco descendente para detectar cuando se recibe un dato desde el otro microcontralador en la comunicación serial por software  ;-)


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: mil vueltas... en una sencilla comunicación serie entre pic
« Respuesta #28 en: 02 de Junio de 2011, 16:01:12 »
buena idea la de suky, asi tendiras interrupcion para recibir datos de los 2 dispositivos. puedes configurar asi tus modulos rs232


Código: [Seleccionar]
#use rs232(baud=9600,xmit=PIN_C6,rcv=PIN_C7,stream=p1)//se configura el puerto rs232 por hardware, el comando "stream" sirve para dar un nombre al puerto
#use rs232(baud=9600,xmit=PIN_b1,rcv=PIN_b0,stream=p2)//se configura el puerto rs232 por software
"Nada es imposible, no si puedes imaginarlo"

Desconectado daltonico82

  • PIC12
  • **
  • Mensajes: 89
Re: mil vueltas... en una sencilla comunicación serie entre pic
« Respuesta #29 en: 02 de Junio de 2011, 18:45:24 »
OK rivale...

El controlador envía a 38400 bps y tengo en el PIC que recibe de este un cuarzo de 20MHz. La otra comunicación, la que yo establezco entre "mis PIC"  deseo sea a 9600 bps poniendo en el segundo PIC un cristal de 8MHz.

¿Es posible, verdad?:

#use rs232(baud=38400,xmit=PIN_C6,rcv=PIN_C7,stream=p1)//se configura el puerto rs232 por hardware, el comando "stream" sirve para dar un nombre al puerto
#use rs232(baud=9600,xmit=PIN_b1,rcv=PIN_b0,stream=p2)//se configura el puerto rs232 por software

En la confuguración por soft no debo incluir FORCE_SW???

Saludos amigos :-/ :-/