Autor Tema: Pic 16f628a no transmite  (Leído 3991 veces)

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

Desconectado Edwin_pe

  • PIC12
  • **
  • Mensajes: 82
Pic 16f628a no transmite
« en: 14 de Marzo de 2010, 21:39:29 »
Hola amigos tengo este problema quiero transmitir con el pic 16f628  a otro pic 16f876 (tiene un lcd) , pero no me sale nada lo estoy simulando en proteus portable 7.1 SP2  ahi dejo el codigo para que me ayuden, gracias y saludos.

// Codigo para transmitir

#include <16f628A.h>
#fuses   HS,INTRC_IO,NOWDT,NOPUT,MCLR
#use     delay(clock=20000000)
#use     rs232(baud=9600,parity=N,xmit=pin_b2,rcv=pin_b1,bits=8)
#use     fast_io(a)
#use     fast_io(b)


   void main (){ 
      int i=0;
     
      while(1){
         for(i=0;i<=10;i++){
            putc(i);
            delay_ms(1000);
            }
         }
   }


****************************************************

// codigo para recibir

#include <16f876.h>
#fuses   HS,NOWDT,NOPUT
#use     delay(clock=20000000)
#use     rs232(baud=9600,xmit=pin_c6,rcv=pin_c7, bits=8)
#define  LCD_RS    PIN_B1
#define  LCD_RW    PIN_B2
#define  LCD_E     PIN_B3
#define  LCD_DB4   PIN_B4
#define  LCD_DB5   PIN_B5
#define  LCD_DB6   PIN_B6
#define  LCD_DB7   PIN_B7
#include "flex_lcd.c"
#use     fast_io(a)

   int valor;
   
#int_RDA
   RDA_isr(){
      valor=GETC();        /* recibe caracter */ 
   }
   
   void main(){
      output_low(pin_a0);
      lcd_init();
      enable_interrupts(INT_RDA);
      enable_interrupts(GLOBAL);
      for(;;){
         lcd_gotoxy(1,1);
         printf(lcd_putc,"Recibiendo=%1D",valor);           
      } 
   
   }

Desconectado c4_esp_VR

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 735
    • www.muchotrasto.com
Re: Pic 16f628a no transmite
« Respuesta #1 en: 15 de Marzo de 2010, 05:10:58 »
Por probar de forma rápida pon:

printf(lcd_putc,"Recibiendo=%i",valor);

Y si puedes pon un esquemático para ayudarte mejor.

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Pic 16f628a no transmite
« Respuesta #2 en: 15 de Marzo de 2010, 08:01:51 »
Para el 628 debes elegir entre HS o INTRC_IO, seguramente es el primero porque colocas 20MHz  ;-) Y en el segundo agregaría una bandera para saber cuando llego un dato y pasar a visualizarlo en el LCD.

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

Desconectado Edwin_pe

  • PIC12
  • **
  • Mensajes: 82
Re: Pic 16f628a no transmite
« Respuesta #3 en: 15 de Marzo de 2010, 23:53:41 »
Hola a todos

Gracias por sus respuestas, mi programita ya esta funcionando al parecer el codigo estaba bien el problema era en el proteus ahora el sgte paso es crear una matriz y enviarla de un solo prorrazo.
En el receptor debo recibir esta matriz mas adelante encriptare la data a enviar  haber si me dan algunas luces al respecto, saludos.

Desconectado Edwin_pe

  • PIC12
  • **
  • Mensajes: 82
Re: Pic 16f628a no transmite
« Respuesta #4 en: 25 de Marzo de 2010, 00:45:36 »
Hola a todos

Estoy por aqui despues de algunas semanas, tengo este problema hice un programita para transmitir , por uart, un arreglo de 5 caracteres cada vez que se pulsa un boton RA2 ojo se transmite en uno por uno los 5 datos, la recepcion la hice por interrupciones y las muestro por el lcd (en la 2ª linea) deberia ver 8,4,3,1,0 con un retardo de 2 seg para poder ver los datos recibidos pero no me sale nada; que pude ser amigos adjunto el codigo gracias y saludos.

==================================================
==== Transmisor ======

#include <16f628a.h>
#fuses   HS,NOWDT
#use     delay(clock=20000000)
#use     rs232(baud=9600,xmit=pin_b2,rcv=pin_b1)
#include <stdlib.h>
#use     fast_io(a)

   void main (){ 
      int j=0;
      int vector[5]={8,4,3,1,0};
      set_tris_A(0x04);
     
      while(1){
         if(input(pin_a2)==0){            /* pulsaron RA2 */
            delay_ms(10);                 /* retardo para rebotes */
            if(input(pin_a2)==0){         /* pregunta si es que sigue pulsado */
               while(input(pin_a2)==0){   /* se queda aqui si aun esta pulsado */
               }               
            }
            for(j=0;j<=4;j++){
               putc(vector[j]);
            }
         }             
      }
   }

==================================================
==== Receptor ======

#include <16f876.h>
#fuses   HS,NOWDT
#use     delay(clock=20000000)
#use     rs232(baud=9600,xmit=pin_c6,rcv=pin_c7,bits=8)
#define  LCD_RS    PIN_B1
#define  LCD_RW    PIN_B2
#define  LCD_E     PIN_B3
#define  LCD_DB4   PIN_B4
#define  LCD_DB5   PIN_B5
#define  LCD_DB6   PIN_B6
#define  LCD_DB7   PIN_B7
#include "flex_lcd.c"
#use     fast_io(a)

   int FLAG_INT_RX=0;
   int valor;

/**********************************************************/
/*************** RUTINA DE INTERRUPCION  ******************/
#int_RDA
   void RDA_isr(){
        valor=GETC();        /* recibe caracter */
        FLAG_INT_RX=1;
   }
   
/**********************************************************/
/***************   PROGRAMA PRINCIPAL    ******************/
   
   void main(){
      output_low(pin_a0);
      lcd_init();
      enable_interrupts(INT_RDA);
      enable_interrupts(GLOBAL);
     
      lcd_gotoxy(1,1);
      printf(lcd_putc,"Recibiendo:");
     
      while(true){
         if(FLAG_INT_RX==1){
            FLAG_INT_RX=0;
            lcd_gotoxy(1,2);
            printf(lcd_putc,valor);
            delay_ms(2000);                     
         }
       
         do{       
         }while(FLAG_INT_RX==0);   /* espera k acurra una int */
      }     
   }



Desconectado micronet3

  • PIC18
  • ****
  • Mensajes: 288
Re: Pic 16f628a no transmite
« Respuesta #5 en: 25 de Marzo de 2010, 20:52:20 »
hola amigo, lo que estas transmitiendo es el codigo ascci.
por ejemplo
cuando tu envias putc(64) lo que estas transmitiendo no es el numero 64 sino el arroba
ahora tu envias putc(vector[0]),  esto es lo mismo que putc(8) y si te fijas en el codigo ascii el 8 es un backspace


Desconectado micronet3

  • PIC18
  • ****
  • Mensajes: 288
Re: Pic 16f628a no transmite
« Respuesta #6 en: 25 de Marzo de 2010, 20:58:56 »
mmm que tal si el codigo del tx es asi?

#include<16f628a.h>
#fuses HS,NOWDT
#use   delay(clock=20000000)
#use   rs232(baud=9600,xmit=pin_b2,rcv=pin_b1)
#include<stdlib.h>
#use fast_io(a)

   void main (){ 
      int j=0;
      char vector[5]={'8','4','3','1','0'};
      set_tris_A(0x04);

      while(1){
         if(input(pin_a2)==0){
            while(input(pin_a2)==0){};                                       /* pulsaron RA2 */
            for(j=0;j<=4;j++){
               putc(vector[j]);
            }
         }             
      }
   }

Desconectado micronet3

  • PIC18
  • ****
  • Mensajes: 288
Re: Pic 16f628a no transmite
« Respuesta #7 en: 25 de Marzo de 2010, 21:29:13 »
y el codigo del rx asi

//#define LCD_DB4 PIN_B4
//#define LCD_DB5 PIN_B5
//#define LCD_DB6 PIN_B6
//#define LCD_DB7 PIN_B7

//#define LCD_RS PIN_A0
//#define LCD_RW PIN_A1
//#define LCD_E  PIN_A2

#include <16f628a.h>
#fuses   HS,NOWDT
#use     delay(clock=20000000)
#use     rs232(baud=9600,xmit=pin_b2,rcv=pin_b1,bits=8)

#include <flex_lcd.c>

   int FLAG_INT_RX=0;
   int valor;

/**********************************************************/
/*************** RUTINA DE INTERRUPCION  ******************/
#int_RDA
   void RDA_isr(){
        valor=GETC();        /* recibe caracter */
        FLAG_INT_RX=1;
   }
   
/**********************************************************/
/***************   PROGRAMA PRINCIPAL    ******************/
   
   void main(){
      lcd_init();
      enable_interrupts(INT_RDA);
      enable_interrupts(GLOBAL);
     
      lcd_gotoxy(1,1);
      printf(lcd_putc,"Recibiendo:");
      lcd_gotoxy(1,2);
      while(true){
         if(FLAG_INT_RX==1){
            FLAG_INT_RX=0;
            lcd_putc(valor);                   
         }
         do{       
         }while(FLAG_INT_RX==0);   /* espera k acurra una int */
      }     
   }

Desconectado Edwin_pe

  • PIC12
  • **
  • Mensajes: 82
Re: Pic 16f628a no transmite
« Respuesta #8 en: 26 de Marzo de 2010, 00:36:12 »
Hola Micronet3

Gracias por tu rpta, ya estoy recibiendo datos en el lcd pero solo aparece en primero y el ultimo dato (8,0) en cuanto al codigo de rx solo cambie printf(lcd_putc,valor) por lcd_putc(valor)    voy a seguir revisando el programa; gracias y saludos.   
       

Desconectado micronet3

  • PIC18
  • ****
  • Mensajes: 288
Re: Pic 16f628a no transmite
« Respuesta #9 en: 26 de Marzo de 2010, 07:36:20 »
ten en cuenta que el codigo de tu pic receptor tu le das una pausa de 2 segundos .
saludos amigo.

Desconectado Edwin_pe

  • PIC12
  • **
  • Mensajes: 82
Re: Pic 16f628a no transmite
« Respuesta #10 en: 27 de Marzo de 2010, 00:47:36 »
Hola Micronet3

Si, uso un retardo de dos segundos y el objetivo es ver por este lapso de tiempo cada dato que se recibe, hoy tuve algunos problemas con mi pc seguire revisando el codigo

Desconectado micronet3

  • PIC18
  • ****
  • Mensajes: 288
Re: Pic 16f628a no transmite
« Respuesta #11 en: 28 de Marzo de 2010, 12:36:19 »
pues entonces me parece que ese delay debes ponerlo  en el pic transmisor.
y otro opcion seria que almacenes todos los datos que le llegan al pic receptor en un buffer y despues mostrarlo a tu manera.
 te digo esto porque el pic transmisor tarda decimas de segundo en enviar todos esos caracteres  y tu le das una pausa de 2 segundos para mostrar un solo caracter, por eso no se muestra los valores intermedios.


saludos amigo.

Desconectado Edwin_pe

  • PIC12
  • **
  • Mensajes: 82
Re: Pic 16f628a no transmite
« Respuesta #12 en: 28 de Marzo de 2010, 21:44:15 »
Hola Micronet3

Ya todo esta funcionando como queria, tenias razon el retardo deberia de ir en el tx y todo quedo correcto.
Ahora el sgte paso el enviar desde un buffer del tx y recibirlo, almacenarlo en un buffer del rx para luego procesar la informacion recibida.
Mi objetivo a largo plazo es hacer lo mismo pero en rf, los datos a enviar deben entrar por un teclado del tx y en el rx debo de reconocer y procesar la data recibida.
Modificare el codigo y estare por este foro en unos dias, saludos

Desconectado Edwin_pe

  • PIC12
  • **
  • Mensajes: 82
Re: Pic 16f628a no transmite
« Respuesta #13 en: 27 de Abril de 2010, 21:50:45 »
Hola a todos luego de algunas semanas estoy por aqui saludos a todos .
Tengo este problema haber si me echan una mano, he hecho dos programas un para transmitir y otro para recibir esta por uart.

El transmisor (pic16f628) solo envia datos cuando se pulsa el RA2,  envio una cadena de 10 bytes primero los almaceno en un arreglo ya definido (DataTx[]), los primeros 5 caracteres son la cabecera (PicRF) los otros cinco son solo datos y vuelve a enviar cuando se preciona de nuevo el RA2.

El receptor (pic16f876) esta por int. el programa primero reconoce la cabecera  para despues mostrarlo en el LCD si la cabecera no coincide con PicRF entonces muestra error, cuando llega un caracter pasa por el filtro logico y se almacena en DataRX[] uno por uno al final lo muestra en el lcd.

El programa funciona bien si muestra en el lcd , mi problema es que el programa deberia funcionar en la primera pulsada de RA2, pero funciona en la segunda pulsada.
Espero es que me alla dejado entender, algo mas amigos existe algun comando para borrar solo una linea del lcd; gracias y saludos.


/****************************************************/
/********** Programa del transmisor *********************/
#include <16f628a.h>
#fuses   HS,NOWDT
#use     delay(clock=20000000)
#use     rs232(baud=9600,xmit=pin_b2,rcv=pin_b1)
#use     fast_io(a)

   void main (){ 
      int j=0;
      int header[5]={'P','i','c','R','F'},DataTx[10];
     
      while(TRUE){
         if(input(pin_a2)==0){            /* pulsaron RA2 */
            delay_ms(10);                 /* retardo para rebotes */
            if(input(pin_a2)==0){         /* pregunta si es que sigue pulsado */
               while(input(pin_a2)==0){   /* se queda aqui si aun esta pulsado */
               }               
            }

            for(j=0;j<=4;j++){     
               datatx[j]=header[j];
            }
            for(j=0;j<=4;j++){         /* bucle para enviar data de cabecera */
               putc(DataTx[j]);        /* envio de cabecera */ 
               delay_ms(70);
            }
            j=5;
            while(j<=9){
               DataTx[j]=j+68;
               putc(DataTx[j]);
               delay_ms(70);
               j++;
            }
         }             
      }
   }


/****************************************************/
/************ Programa del receptor ********************/

#include <16f876.h>
#fuses   HS,NOWDT
#use     delay(clock=20000000)
#use     rs232(baud=9600,xmit=pin_c6,rcv=pin_c7,bits=8)
#define  LCD_RS    PIN_B1
#define  LCD_RW    PIN_B2
#define  LCD_E     PIN_B3
#define  LCD_DB4   PIN_B4
#define  LCD_DB5   PIN_B5
#define  LCD_DB6   PIN_B6
#define  LCD_DB7   PIN_B7
#include "flex_lcd.c"
#use     fast_io(a)


   int   FLAG_INT_RX=0,valor;

/***********************************************************/
/**************** RUTINA DE INTERRUPCION *******************/
#int_RDA
   void RDA_isr(){
        valor=GETC();        /* recibe caracter */
        FLAG_INT_RX=1;
   }
   
/***********************************************************/
/****************** PROGRAMA PRINCIPAL *********************/
   
   void main(){
     
      int  cont=0,i,DataRX[10];   /* variables locales */
     
      lcd_init();
      enable_interrupts(INT_RDA);
      enable_interrupts(GLOBAL);
     
      lcd_gotoxy(1,1);
      printf(lcd_putc,"Recibiendo:");
     
      while(true){
         if(FLAG_INT_RX==1){     /* solo entra si hay recepcion */
            FLAG_INT_RX=0;
            if(cont<5){         
               switch(valor){         
               
                  case 'P' : if(cont==0){
                                 DataRX[cont]=valor;
                                 cont++;                                 
                              }
                             break;
                  case 'i' : if(cont==1){
                                 DataRX[cont]=valor;
                                 cont++;                 
                              }
                             break;
                  case 'c' : if(cont==2){
                                 DataRX[cont]=valor;
                                 cont++;                 
                              }     
                             break;
                  case 'R' : if(cont==3){
                                 DataRX[cont]=valor;
                                 cont++;                 
                              }     
                             break;
                  case 'F' : if(cont==4){
                                 DataRX[cont]=valor;
                                 cont++;                 
                              }
                             break;         
                  default  : cont=0;
                             lcd_gotoxy(1,2);
                             printf(lcd_putc,"Error");
               }               
            }
            else{                  /* aqui entra si ya reconocio la cabecera (cont>=5)*/
               if(cont<10){       
                  DataRX[cont]=valor;       
                  cont++;                           
               }               
               else{                     /* aqui entra si llegaron los 10 datos (cont>=10) */
                  lcd_gotoxy(1,2);       /* voy a escribir en la segunda linea del LCD */
                  for(i=0;i<=9;i++){     /* los envia al LCD */                   
                     lcd_putc(DataRX);
                     delay_ms(300);
                  }   
                  cont=0;
               }
            }       
         }           /* aqui termina el if principal */
       
         do{         /* bucle infinito espera int de recepcion */
         }
         while(FLAG_INT_RX==0);
      }     
   }

Desconectado Edwin_pe

  • PIC12
  • **
  • Mensajes: 82
Re: Pic 16f628a no transmite
« Respuesta #14 en: 27 de Abril de 2010, 21:59:08 »
Algo mas amigos, he probado el mismo codigo del tx con otro prgograma par el rx y funciona muy bien a la primera pulsada de RA2 todo sale muy bien aqui dejo este codigo.
Otra cosa con respecto al mensaje anterior dije que el programa funciona bien con la segunda pulsada en el lcd aparece PicRFIJKLM pero al instante cambia ErrorIJKLM es como si llegara un caracter que no pasa el filtro logico y por eso muestra error.


#include <16f876.h>
#fuses   HS,NOWDT
#use     delay(clock=20000000)
#use     rs232(baud=9600,xmit=pin_c6,rcv=pin_c7,bits=8)
#define  LCD_RS    PIN_B1
#define  LCD_RW    PIN_B2
#define  LCD_E     PIN_B3
#define  LCD_DB4   PIN_B4
#define  LCD_DB5   PIN_B5
#define  LCD_DB6   PIN_B6
#define  LCD_DB7   PIN_B7
#include "flex_lcd.c"
#use     fast_io(a)

   int FLAG_INT_RX=0;
   int valor;

/***********************************************************/
/**************** RUTINA DE INTERRUPCION  ******************/
#int_RDA
   void RDA_isr(){
        valor=GETC();        /* recibe caracter */
        FLAG_INT_RX=1;
   }
   
/***********************************************************/
/****************   PROGRAMA PRINCIPAL    ******************/
   
   void main(){
      output_low(pin_a4);
      lcd_init();
      enable_interrupts(INT_RDA);
      enable_interrupts(GLOBAL);
     
      lcd_gotoxy(1,1);
      printf(lcd_putc,"Recibiendo:");
     
      while(true){
         if(FLAG_INT_RX==1){
            FLAG_INT_RX=0;
            lcd_gotoxy(1,2);
            lcd_putc(valor);
         }
       
         do{   
         }while(FLAG_INT_RX==0);
      }     
   }