TODOPIC
Microcontroladores PIC => Primeros pasos - Iniciación a los microcontroladores => Mensaje iniciado por: antoniojdobarro en 28 de Junio de 2011, 10:34:08
-
Bien, desde el pc puedo controlar el pic, ya que así lo hago, para controlar unos anchos de pulso, luego el max232 lo tengo bien conectado.
El problema es cuando trato de leer desde hiperterminal lo que me envía el pic.
En el pic le digo que envie primero una "H", luego "o", luego "l", luego "a" y no recibo nada en el hiperterminal, habiendo conectado todo bien en el max232.
El problema es que cuando lo simulo en proteus con el terminal virtual si lo hace perfecto.
Alguien sabe donde esta el problema del hiperterminal, o como configurarlo?
-
Ummm, la verdad es que es muy raro, ya que lo normal es que sea al contrario, quiero decir, que recibas pero no transmitas.
El hiperterminal es un poco sensible al envio, hasta que no esta todo coreecto no te deja, pero para la recepción no. El hiperterminal, si estas utilizando el que tiene windows, no hay que configurar nada, únicamente la velocidad.
Te diria que tienes mal configurada la velocidad, pero no creo que sea eso, ya que dices que si que puedes enviar bien, así que descartado.
Una prueba sencilla es unir TX y RX de tu max232 para ver si lo que envias lo recibes (un eco), es una manera sencilla de comprobar si lo tienes bien montado y funcionando.
En el caso de que la prueba anterior sea satisfactoria, podrías poner como has configuardo el pic, quiero decir un trozo de código, para mirar el lenguaje y si te has podido olvidar de algo???.
Salu2
-
Hola Muchachos, estoy teniendo el mismo problema. Previamente hice la prueba de conectar los pines del max 232 (los que van al pic) y puedo ver el eco en el HyperTerminal por lo que desde el max232 hasta la pc esta todo correcto (max bien conectado)
Estoy usando un pic 18f4550, he comprobado infinidad de veces y ambos estan 9600 baudios 8N1 y el condenado pic sigue sin responderme. Lo peor de todo es que en proteus con el virtual terminal funciona correctamente. Ademas por curiosidad lo probe con un pic 16f88 en la implementacion practica y tambien funciona.
Hay algun secreto sobre los 18Fxxxx que se me pueda estar escapando??? cualquier sugerencia sera muy bien recibida. adjunto los archivos para q puedan verlos.
Gracias
Saludos
-
yo he trabajado con el 4550 enviando y recibiendo datos y trabaja perfectamente, no se que pueda ser.podrias poner tu programa para verlo,
-
Hola Muchachos, estoy teniendo el mismo problema. Previamente hice la prueba de conectar los pines del max 232 (los que van al pic) y puedo ver el eco en el HyperTerminal por lo que desde el max232 hasta la pc esta todo correcto (max bien conectado)
Estoy usando un pic 18f4550, he comprobado infinidad de veces y ambos estan 9600 baudios 8N1 y el condenado pic sigue sin responderme. Lo peor de todo es que en proteus con el virtual terminal funciona correctamente. Ademas por curiosidad lo probe con un pic 16f88 en la implementacion practica y tambien funciona.
Hay algun secreto sobre los 18Fxxxx que se me pueda estar escapando??? cualquier sugerencia sera muy bien recibida. adjunto los archivos para q puedan verlos.
Gracias
Saludos
OK, te paso parte de código en hitech que estoy utilizando y por ahora funciona:
#define _XTAL_FREQ 4000000
#define DS3232_PWR LATA6
#define RS232_BAUD 9600
#define DIVIDER ((int)(_XTAL_FREQ/(16UL * RS232_BAUD) -1))
#include <htc.h>
#include <stdio.h>
void putch(unsigned char);
void putch(unsigned char c){
while(!TRMT) // TRMT1 vacio cuando TSR esta libre
continue;
TXREG = c;
}
void main(void){
//Puerto serie
SPBRG = DIVIDER;
RCSTA = 0x90;
TXSTA = 0x24;
while(1){
printf("Hola, esto es una prueba para ivanbv4\r\n");
}
}
Soló que lo corro en un 18F26J50, tedrías que mirar para el 4550, pero supongo que será parecido, también puedes comprobar si lo tienes bien a la uart 1...
Lo malo que el proteus da mucha cosas por hecho, si no configuras cristal tb va, si no pones las alimentaciones bien...
Espero que te sirve, Salu2
-
rivale he subido el codigo en el txt adjunto, garcias por responder. DaYeS muchas gracias por tu aporte, mañana voy a tratar de verificar todo...y si, es el gran problema de proteus. pero cristal, frecuencia, alimentaciones, master clear a 5V..creo tener todo controlado. Seguire intentando y les cuento. Se agradecerá cualquier otro aporte.
Saludos muchachos
-
#include <18f4550.h>
#fuses HS, NOWDT, NOLVP, NOBROWNOUT, NOPROTECT, PUT
#use delay(clock=20000000)
#use rs232(uart1, baud=9600, xmit=PIN_D2, rcv=PIN_D3, BITS=8, stop=1, PARITY=N,ENABLE=PIN_D1 ) //uart1, tiene q ir por lo menos para q funciones el virtual terminal
int8 buffer1;
void main()
{
while( TRUE )
{
putc('P');
delay_ms(500);
buffer1=getc();
putc(buffer1);
}
}
porque no haces la lectura por interrupcion, ya que asi como tienes tu codigo siempre trata de leer algo del puerto rs232, pero no creo que siempre tengas algun dato en tu buffer. tal vez eso te cause problemas
-
Gracias por el aporte. Haré esta prueba que me decis hoy mismo por las dudas. He implementado el mismo programa pero para un 16F88 y no he tenido inconvenientes, pero puede que haya conflicto como decis.
Sobre algun minimo avance que logre es dejando en el codigo solo la parte de esperar un caracter y luego enviarlo (como espejo) y usando el Virtual Terminal y por lo menos me parecen cruces (xxxxx) una por cada tecla que presiono. Me esta volviendo loco esto jajaja
-
Gracias por el aporte. Haré esta prueba que me decis hoy mismo por las dudas. He implementado el mismo programa pero para un 16F88 y no he tenido inconvenientes, pero puede que haya conflicto como decis.
Sobre algun minimo avance que logre es dejando en el codigo solo la parte de esperar un caracter y luego enviarlo (como espejo) y usando el Virtual Terminal y por lo menos me parecen cruces (xxxxx) una por cada tecla que presiono. Me esta volviendo loco esto jajaja
Aquí tienes un proxy (espejo) del uart mediante interrupción:
void interrupt isr(void) {
//Lo que llegue por UART se manda por UART
if (RC1IF && RC1IE) //miramos si esta habilitado y a saltado interrupción
{
if (RCSTA&0x02 || RCSTA&0x04){ //por si ha fallado el puerto serie lo reiniciamos
RCSTA &= 0xEF;
RCSTA |= 0x10;
}
else //sino a fallado sacamos lo que entra
putch(RCREG);
RC1IF=0;
}
}
Es de uno que tiene 2 uarth, pero será muy parecido.
Lo que es raro es lo de las x????? :shock:
Salu2
-
las x supongo que son los caracteres que tu hiperteminal no conoce y te las ecribe todas como x.
para hacer un echo puedes usar algo asi:
char dato;
#int_rda
void recepcion()
{
dato=getc();
putc(dato);
}
void main()
{
enable_interrupts(global);
enable_interrupts(int_rda);
while(true);
}
-
las x supongo que son los caracteres que tu hiperteminal no conoce y te las ecribe todas como x.
¿?¿?¿? que caracteres no reconoce el hiperterminal??
En todo caso caracteres no imprimibles, como intro, tab....
De todas maneras decia que le salia con todo, es raro raro raro...
Salu2
-
Parece problema de velocidades, o almenos me da esa sensación... Teneis el PLL bien configurado?
Saludos
-
Ok, ya he conseguido reproducir tú error. No se da en todos, debe ser una errata, en el caso que hayas habilitado las interupciones de recepción tienes que escrbir la interrupción, quiero decir código dentro de una rutina de interrupción, o los caracteres son todas x.
Así que el problema no es del hiperterminal, sino del pic, o mejor dicho, de la programación del pic.
Salu2
-
Hola muchachos agradezco sus respuestas. He retomado con esta tarea ya que tuve que colgarla unos días.
DaYeS el primer programa que escribí no usaba interrupciones y no tenia habilitada las interrupciones, todo estaba desarrollado en el main y es ahí cuando "logre" lo de las xx en el hyperterminal. Este programa corre bien y sin errores en Proteus. el programa es:
#include <18f4550.h>
#fuses HS, NOWDT, NOLVP, NOBROWNOUT, NOPROTECT, PUT
#use delay(clock=20000000)
#use rs232(uart, baud=9600, xmit=PIN_D2, rcv=PIN_D3, BITS=8, stop=1, PARITY=N,ENABLE=PIN_D1 )
int8 buffer1;
void main()
{
while( TRUE )
{
buffer1=getc();
putc(buffer1);
}
}
Luego hice la prueba que sugirió rivale. Intente lo mismo pero con la interrupción de recepción de rs232, pero a este programa no pude ni hacerlo andar en Proteus.
#include <18f4550.h>
#fuses HS, NOWDT, NOLVP, NOBROWNOUT, NOPROTECT, PUT
#use delay(clock=20000000)
#use rs232(uart, baud=9600, xmit=PIN_D2, rcv=PIN_D3, BITS=8, stop=1, PARITY=N,ENABLE=PIN_D1 )
char dato;
#INT_RDA
void recepcion()
{
dato=getc();
putc(dato);
}
void main()
{
enable_interrupts(GLOBAL);
enable_interrupts(INT_RDA);
while(true)
{
output_toggle(PIN_D0);
delay_ms(100);
}
}
No puedo entender como algo que parecía sencillo se ha vuelto tan complejo. Les agradeceré cualquier sugerencia muchachos
Saludos
-
Hola, lo que pasa que para que funcione la interrupción #INT_RDA, el UART debe estar implementado por hardware, y los únicos pines que están habilitados para esto son: el RC6 (TX) y el RC7 (RX).
-
Este programa corre bien y sin errores en Proteus. el programa es:
#include <18f4550.h>
#fuses HS, NOWDT, NOLVP, NOBROWNOUT, NOPROTECT, PUT
#use delay(clock=20000000)
#use rs232(uart, baud=9600, xmit=PIN_D2, rcv=PIN_D3, BITS=8, stop=1, PARITY=N,ENABLE=PIN_D1 )
int8 buffer1;
void main()
{
while( TRUE )
{
buffer1=getc();
putc(buffer1);
}
}
El código debería funcionar, la verdad es que no utilizo CCS, pero los fuses parecen buenos. Lo que puedes probar es poner un cristal de 4 Mhz con los condensadores de 27 pF. Lo digo por que en el Datasheet el cristal de 20 Mhz lo ponen con dos de 15 pF pero dice que no esta optimizado.
Lo que puedes hacer es utilizar el cristal interno, hasta 8 Mhz, para quitarte de problemas, más ique nada por que si el proteus esta tirando bien casi seguro que sea un tema de alimentaciones, acoples o relojes...
Otra cosa, no puedes hacer esto:
while( TRUE )
{
putc(getc());
}
De esta manera no lo estas cambiando de tipo, tb habría que mirar la función putc y getc, pero si crees que estan bien nada...
Bueno, a espera que nos vayas contando si con estas pruebas va bien...
Salu2
-
el problema es lo que comenta pablo, cambia tus pines de rs232
#use rs232(uart, baud=9600, xmit=PIN_c6, rcv=PIN_c7, BITS=8, stop=1, PARITY=N,ENABLE=PIN_D1 )
cambia esta line y prueba con la interrupcion
-
Hola muchachos..nuevamente gracias por sus aportes. Como bien me dijeron cambie los pines y la simulación el proteus corrió perfectamente. En cuanto a al circuito real, sigo viendo las xx, desarme y arme el circuito dos veces y sigue con lo mismo. Mañana continuare con mas pruebas. Por las dudas..este es el programa q tiene cargado el micro. Saludos
#include <18f4550.h>
#fuses HS, NOWDT, NOLVP, NOBROWNOUT, NOPROTECT, PUT
#use delay(clock=20000000)
#use rs232(uart, baud=9600, xmit=PIN_C6, rcv=PIN_C7, BITS=8, stop=1, PARITY=N,ENABLE=PIN_D1 )
#INT_RDA
void recepcion()
{
putc(getc());
}
void main()
{
enable_interrupts(GLOBAL);
enable_interrupts(INT_RDA);
while(true)
{
output_toggle(PIN_D0);
delay_ms(100);
}
}
-
con que hiperterminal estas trabajando?, modrias porner una impresion de pantalla, si estas configurando la velocidad de la hiperterminal adecuadamente?
-
Por las dudas usa la instrucción #use fast_io(C)
y configura el RC6 como salida y el Rc7 como entrada
Set_tris_c(0b10000000)
para así dejar fijos los pines.
-
#include <18f4550.h>
#fuses HS, NOWDT, NOLVP, NOBROWNOUT, NOPROTECT, PUT
#use delay(clock=20000000)
#use rs232(uart, baud=9600, xmit=PIN_C6, rcv=PIN_C7, BITS=8, stop=1, PARITY=N,ENABLE=PIN_D1 )
#INT_RDA
void recepcion()
{
putc(getc());
}
void main()
{
enable_interrupts(GLOBAL);
enable_interrupts(INT_RDA);
while(true)
{
output_toggle(PIN_D0);
delay_ms(100);
}
}
Te dejo un código que me funciona el hardware (18f26j50), esta con hitech:
#define _XTAL_FREQ 4000000
#define DS3232_PWR LATA6
#define RS232_BAUD 9600
#define DIVIDER ((int)(_XTAL_FREQ/(16UL * RS232_BAUD) -1))
#include <htc.h>
#include <stdio.h>
__CONFIG(1, DEBUG_OFF & XINST_OFF & STVREN_ON & PLLDIV_1 & WDTEN_OFF & CP0_OFF & CPUDIV_OSC1);
__CONFIG(2, IESO_OFF & FCMEN_OFF & LPT1OSC_ON & T1DIG_OFF & OSC_INTOSC & WDTPS_4096);
__CONFIG(3, DSWDTPS_8192 & DSWDTEN_OFF & DSBOREN_OFF & RTCOSC_INTOSCREF & DSWDTOSC_INTOSCREF & MSSP7B_EN_MSK7 & IOL1WAY_OFF);
__CONFIG(4, WPDIS_OFF);
void main(){
TRISA = 0xFF; //Todo entrada
TRISB = 0xF5; //Todo entrada menos rb1 y rb3
LATB = 0;
//Configuracíon Puerto serie
SPBRG = DIVIDER;
RCSTA = 0x90;
TXSTA = 0x24;
//Interrupciones
RC1IE = 1;
GIE = 1;
PEIE = 1;
while(1)
}
void interrupt isr()
{
if (RC1IF && RC1IE){
char rc="";
while((RCREG)!=0)
rc = rc + RCREG;
printf("He recibido %s",rc);
RC1IF=0;
}
}
Espero que te sirva, más que nada para que lo pruebes para verificar circuito y micro.
Salu2
-
Hola muchachos, adjunto imágenes del hiperterminar y su versión para que puedan decirme si hay algo mal.
Pablo realice los cambios que sugeriste y el comportamiento sigue siendo el mismo. Para descartar que el micro podía estar dañado hice la prueba con otro 18F4550 que tengo y el resultado a sido el mismo. Curiosamente si corro el mismo programa en un 16f88 corre perfectamente.
DaYeS gracias por tu aporte.. ahora mismo hago la prueba con el código que me has pasado.
Subo también fotos del circuito...su calidad es pobre por que las tome con un celular sepan disculpar. Gracias por sus aportes
Me olvidaba en cuanto al hiperterminal: Versión 5.1 (Build 2600.xpsp.080413-2111 Service Pack 3)
-
Ummm, podrias tb probar con otra proboard, ya que tb puede ser, no hay que fiarse mucho de ellas...
El cristal puedes utilizar el suyo interno, y bajar un poco la velocidad, a unos 8 o 4 Mhz. Mira tb si se te esta reseteando por algo, por ejemplo hacer parpadear un led cuando inicia y que luego para, a lo mejor se te estaba reseteando...
Salu2
-
Hola muchachos, yo de nuevo y con el mismo problema. Suspendí para armar una fuente de +12 -12 +5 1A que si a alguien le hace falta la publico.
Seguí con pruebas y descubrí algo. El pic recibe los datos que le envío..logre verlo a través del siguiente programita
#include <18f4550.h>
#fuses HS, NOWDT, NOLVP, NOBROWNOUT, NOPROTECT, PUT
#use delay(clock=20000000)
#use rs232(uart, baud=9600, xmit=PIN_C6, rcv=PIN_C7, BITS=8, stop=1, PARITY=N,ENABLE=PIN_D1 )
char dato;
void main()
{
while(true)
{
if(kbhit())
{
dato=getc(); // solo para actualizar el estado de la kbhit()
output_toggle(PIN_D0);
}
}
}
Lo que no logre hacer es que el pic transmita un carácter y poder verlo en el hiperterminal. He probado con dos pic´s, verifique conexiones, reloj, velocidades, alimentaciones. Como notaran en la linea del use rs232 coloque ENABLE=PIN_D1que hace destellar un led que tengo colgado en este pin cuando envia un dato. Durante la prueba de envio lo hacia...pero nada aparecia en la pc. Alguna otra sugerencia?
Desde ya muchas gracias
Saludos
-
Se me olvido agregar que también cambié de protoboard
-
Hola muchachos... Agrego un nuevo avance. Logre que todo funcionara como debía hacerlo luego de usar el oscilador interno del pic en lugar del externo de 20Mhz que estaba usando (mas los correspondientes capacitores de 15p). No entiendo realmente cual es el problema del oscilador externo ya que solo es conectarlo entre los pines 13 y 14 con los cap a masa. Creería que el programa que previamente publiqué tiene los fuses de manera correcta. Cualquier idea que se les venga a la cabeza será muy bien recibida.
Saludos y espero que puedan ayudarme