TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Edwin_pe 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);
}
}
-
Por probar de forma rápida pon:
printf(lcd_putc,"Recibiendo=%i",valor);
Y si puedes pon un esquemático para ayudarte mejor.
-
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!
-
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.
-
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 */
}
}
-
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
-
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]);
}
}
}
}
-
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 */
}
}
-
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.
-
ten en cuenta que el codigo de tu pic receptor tu le das una pausa de 2 segundos .
saludos amigo.
-
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
-
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.
-
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
-
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);
}
}
-
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);
}
}