Autor Tema: envío de datos puerto serial pic16f887  (Leído 3651 veces)

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

Desconectado jeison

  • PIC10
  • *
  • Mensajes: 19
envío de datos puerto serial pic16f887
« en: 22 de Septiembre de 2014, 20:21:38 »
hola amigos, necesito ayuda con algo que me tiene frenado en un proyecto; ya tengo la mayor parte que es poder enviar unas tramas con el pic16f887, pero como soy algo novato, necesito que al dejar un botón presionado por ejemplo en el pin A0, se pueda enviar dicha trama una sola vez. Se que lo más sencillo es usar interrupciones; pero no tengo idea de como usarlas en este caso y quisiera que me pudiesen dar una idea. estoy programando en CCS lenguaje C.
esto es porque de la forma en que tengo el código hasta el momento puedo enviar las tramas correctamente apenas pongo un "1" en un pin respectivamente, sin embargo lo que necesito es poder dejar el botón presionado, se muestre el mensaje y apenas suelte el botón el mensaje no aparezca más y el programa siga su curso, ya que de la forma en que lo tengo si dejo el botón presionado el programa se queda enviando el mensaje infinitamente.
muchas gracias, un saludo.

Desconectado jhozate

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1698
Re: envío de datos puerto serial pic16f887
« Respuesta #1 en: 23 de Septiembre de 2014, 13:26:34 »
no me quedó claro algo, cuando te refieres a "enviar el mensaje" y "mostrar el mensaje" son dos cosas distintas?

podrias intentar

Código: C++
  1. if(input(pin_a0)==1)
  2.   {
  3.      delay_ms(20);                                //antirrebote
  4.         if(input(pin_a0)==1)                    //comprueba pulsación valida
  5.           {
  6.               enviar mensaje.......              //enviar
  7.               while(input(pin_a0)==1){}    //se queda esperando a que sueltes el botón
  8.           }
  9.   }
Ser Colombiano es un Premio, Saludos desde CALI-COLOMBIA

Desconectado Diego E.

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1086
Re: envío de datos puerto serial pic16f887
« Respuesta #2 en: 23 de Septiembre de 2014, 15:31:01 »
Revisa este ejemplo,

Saludos.

Desconectado jeison

  • PIC10
  • *
  • Mensajes: 19
Re: envío de datos puerto serial pic16f887
« Respuesta #3 en: 23 de Septiembre de 2014, 16:41:44 »
no me quedó claro algo, cuando te refieres a "enviar el mensaje" y "mostrar el mensaje" son dos cosas distintas?

podrias intentar

Código: C++
  1. if(input(pin_a0)==1)
  2.   {
  3.      delay_ms(20);                                //antirrebote
  4.         if(input(pin_a0)==1)                    //comprueba pulsación valida
  5.           {
  6.               enviar mensaje.......              //enviar
  7.               while(input(pin_a0)==1){}    //se queda esperando a que sueltes el botón
  8.           }
  9.   }




hola, tienes razón, pero no son cosas distintas, solo lo escribí mal. la acción es una sola enviar una cadena de caracteres con el putc, pero si la idea es enviarlo solo una vez, estoy comprobando lo que me enviaste y espero me funcione.
muchisimas gracias, ahí te comentaré como me va con eso

Desconectado jeison

  • PIC10
  • *
  • Mensajes: 19
Re: envío de datos puerto serial pic16f887
« Respuesta #4 en: 25 de Septiembre de 2014, 10:52:14 »
Efectivamente me han servido, muchas gracias compañeros. Excelentes ejemplos y aclaraciones, ya solo me queda que el código pueda hacer su acción por defecto también solo una vez, pero ya con lo que me ayudaron creo que puedo efectuar la misma acción, sino los seguiré molestando.
De nuevo muuuchas gracias, si viven en medellin invito a cerveza jejeje

Desconectado jeison

  • PIC10
  • *
  • Mensajes: 19
Re: envío de datos puerto serial pic16f887
« Respuesta #5 en: 29 de Septiembre de 2014, 12:13:32 »
bueno, y si quiero hacer esto pero teniendo en cuenta el estado de varios pines?, osea realizar la acción una sola vez pero preguntando por el estado de un conjunto de pines.
por ejemplo: si A0=0 y A1=0 y C1=0, etc; el programa envíe la trama pero solo una vez. ya lo he escrito de varias formas y no me ha funcionado.

Muchas gracias.

Desconectado jhozate

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1698
Re: envío de datos puerto serial pic16f887
« Respuesta #6 en: 29 de Septiembre de 2014, 12:25:11 »
pon la forma en que lo has hecho y vemos donde está fallando.
Ser Colombiano es un Premio, Saludos desde CALI-COLOMBIA

Desconectado jeison

  • PIC10
  • *
  • Mensajes: 19
Re: envío de datos puerto serial pic16f887
« Respuesta #7 en: 29 de Septiembre de 2014, 16:52:42 »
Hola, aqui va el codigo que usé ahora para ver si me funcionaba y era activando un pin ya que no se como preguntar por el conjunto de pines como tal, en este caso estoy usando soo dos pines para ejemplificar pues en realidad los que necesito son 13 pero si me funciona con estos dos ya funcionará con más. me disculpas lo feo del código pues soy muy novato. muchas gracias.

include <16f887.h>
#include <stdio.h>
#fuses INTRC_IO,NOWDT,NoPROTECT,NOLVP,PUT
#use delay (clock = 4000000)
#use RS232 (baud = 57600,  xmit = pin_c6, rcv = pin_c7)//(baud = 9600, bits = 8, parity = N, xmit = pin_c6, rcv = pin_b1)




void TRAMA14 (void);
void TRAMA2 (void);                           
void TRAMA1 (void);                           
                           

                             
const unsigned char vectrama1[52]={0xA5,0x00,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x4A,0x05,0x01,0x01,0x01,0x01,
                                   0x00,0x00,0x00,0x00,0x02,0x01,0x01,0x0A,0x03,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                                   0x00,0x00,0x55,0x45,0x54,0x20,0x54,0x30,0x31,0x03,0x03,0xAE};// UET-T01
                                   
const unsigned char vectrama2[52]={0xA5,0x00,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x4A,0x05,0x01,0x01,0x01,0x01,
                                   0x00,0x00,0x00,0x00,0x02,0x01,0x01,0x0A,0x03,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                                   0x00,0x00,0x55,0x45,0x54,0x20,0x54,0x31,0x34,0x07,0x03,0xAE};// UET-T14                                   
                                   
                                   
const unsigned char vectrama14[48]={0xA5,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x4A,0x05,0x01,0x01,0x01,0x01,
                                    0x00,0x00,0x00,0x00,0x02,0x01,0x01,0x0A,0x03,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                                    0x00,0x00,0x20,0x4F,0x4B,0xF6,0x01,0xAE};// OK

                                   
unsigned char i=0;



void main()
{

SET_TRIS_A(0xFF);
SET_TRIS_E(0xFF);
SET_TRIS_C(0xFF);
SET_TRIS_B(0xFF);


while(1)
  { 
 

 
 
  if(input(pin_A0)==0)
   {
   if(input(pin_A1)==0)
      {
      output_high(pin_B0);
      }
   }
//-------------------   
 
if(input(pin_B0)==1)
     {
     delay_ms(20);
  if(input(pin_B0)==1)
      {
      TRAMA14();       
while(input(pin_B0)==1){}
      }
     }
 
   
 
else if(input(pin_A0)==1)
     {
     delay_ms(20);
  if(input(pin_A0)==1)
      {
      TRAMA1();       
while(input(pin_A0)==1){}
      }
     }
//-------------------- 

if(input(pin_A1)==1)
     {
     delay_ms(20);
  if(input(pin_A1)==1)
      {
      TRAMA2();       
while(input(pin_A1)==1){}
      }
     }
//-----------------     
   
 
  }
}

void TRAMA2 (void)
 {
    for(i=0;i<=51;i++)   
    putc(vectrama2);
    delay_ms(500);
    for(i=0;i<=51;i++)   
    putc(vectrama2);
   
 }
 
  void TRAMA1 (void)
 {
    for(i=0;i<=51;i++)   
    putc(vectrama1);
    delay_ms(500);
    for(i=0;i<=51;i++)   
    putc(vectrama1);
   
 }
 
void TRAMA14 (void)
 {
    for(i=0;i<=47;i++)   
    putc(vectrama14);
    delay_ms(500);
    for(i=0;i<=47;i++)   
    putc(vectrama14);
   
 }



el código es  muy sencillo, pero pues con mi poca experiencia me toca preguntar mucho.
saludos

Desconectado jhozate

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1698
Re: envío de datos puerto serial pic16f887
« Respuesta #8 en: 29 de Septiembre de 2014, 19:58:00 »
puedes declarar una variable tipo char y guardar en ella el estado del puerto con input_X();
donde X es el literal o nombre del puerto A,B,C etc  Y luego evaluas la variable con un if
por ejemplo
Código: C
  1. portb=input_b();
  2. if(portb==21)                    // B0=1  B2=1   B4=1
  3.  {
  4.    aqui codigo
  5.  }
Ser Colombiano es un Premio, Saludos desde CALI-COLOMBIA

Desconectado jeison

  • PIC10
  • *
  • Mensajes: 19
Re: envío de datos puerto serial pic16f887
« Respuesta #9 en: 30 de Septiembre de 2014, 12:22:05 »
Entiendo muy bien lo que me dicen, pero el problema es que por ejemplo cuando uso esta instrucción: while(input(pin_A0)==1){} el programa hace lo que  necesito que es realizar la instrucción una sola vez, ahora necesito es hacer esto mismo pero con varios pines como en la descripción anterior. hice esto:

if (input(PIN_A0) && input(PIN_A1)==0)   
     {
      TRAMA14();
      while(input(PIN_A0) && input(PIN_A1)==0){}
     }

pero aún así no me funciona y de la forma que me dijo jhozate me aparecen errores y mne dice que "expecting (", y ahí si no idea.
Saludos

Desconectado jhozate

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1698
Re: envío de datos puerto serial pic16f887
« Respuesta #10 en: 30 de Septiembre de 2014, 13:57:13 »
da doble click en el error y te lleva a la linea donde se encuentra, en un algun lado sobra o falta un parentesis
Ser Colombiano es un Premio, Saludos desde CALI-COLOMBIA

Desconectado jeison

  • PIC10
  • *
  • Mensajes: 19
Re: envío de datos puerto serial pic16f887
« Respuesta #11 en: 02 de Octubre de 2014, 10:11:33 »
Exactamente; se ejecuta hasta que desactivo el pin, pero lo importante es que no se queda enviando la trama; pues como lo tenía antes sino desactivaba el pin se quedaba enviando y enviando, en vez de hacerlo solo una vez.

Tal vez no me entiendas es por lo siguiente: cuando me refiero a enviar es porque esas tramas corresponden a unos mensajes en una pantalla led, entonces cuando se queda enviando no alcanza a mostrar el mensaje cuando de nuevo envía el otro y así infinitamente, es por eso que con el bucle que hice si me funciona pues no se queda haciendo esto.

Saludos !