Autor Tema: Problema con Rs232 en PIC16f886 en C  (Leído 3937 veces)

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

Desconectado ferorts

  • PIC10
  • *
  • Mensajes: 36
Problema con Rs232 en PIC16f886 en C
« en: 23 de Noviembre de 2010, 20:48:52 »
Hola,soy estudiante de Ingenieria de Teleco y llevo poco mas de un mes indagando en el mundo de la programacion en C de pics,asi que no seais muy duro conmingo xf, tengo que realizar un proyecto con un PIC16f886, una parte del proyecto consta en recibir un dato a traves del pc por una conexion USB-Rs232 a los pines del pic habilitados para comunicacion Rs232, una vez recibido ese dato tengo que diferenciar si es un caracter u otro y segun el tipo de caracter (para simplificar solo diferencia si es un numero o una letra) y dependiendo si es un numero enciende un led o si no es un numero enciende otro, pues bien me puse a compilar en principio parace que lo tenia,pero a la hora de flashearlo y testearlo,por cierto tengo el pickit 2 de microchip con la demo board de 28 pines,no me da ningun error al compilar y al testearlo me he dado cuenta que solo me enciende/apaga el led de (si es un numero)con la tecla 2 y 6 del teclado y el led de cuando no es un numero me lo enciende/apaga con el resto del teclado,incuyendo todos los numero menos el 2 y el 6, claro esta que hay algo mal, pero no encuentro el que (y eso que el codigo no es precisamente largo..xDD) ,os agradeceria si alguien pudiera ayudar a este pekeño aprendiz.

Gracias.

PD.Perdonar por mi poca experiencia con los pics, si veis algun error os agracederia que me lo comentaseis.
-----------------------------------Posteo el codigo--------------------------
#include <16F886.h>
#device adc=8
#FUSES NOWDT //No Watch Dog Timer
#FUSES INTRC_IO //Internal RC Osc, no CLKOUT
#FUSES NOPUT //No Power Up Timer
#FUSES MCLR //Master Clear pin enabled
#FUSES NOPROTECT //Code not protected from reading
#FUSES NOCPD //No EE protection
#FUSES BROWNOUT //Reset when brownout detected
#FUSES IESO //Internal External Switch Over mode enabled
#FUSES FCMEN //Fail-safe clock monitor enabled
#FUSES LVP //Low Voltage Programming on B3(PIC16) or B5(PIC18)
#FUSES NODEBUG //No Debug mode for ICD
#FUSES BORV40 //Brownout reset at 4.0V
#FUSES NOWRT //Program memory not write protected

#use delay(clock=4000000) //Osc Interno a 4 Mhz
#use RS232(BAUD=9600, BITS=8 ,PARITY=N, XMIT=PIN_C6, RCV=PIN_C7) //Configuracion de Rs232



char caracter; //Creamos una varible de intercambio

void main()
{
set_tris_b(0xF9); //puerto B como salida salidas el RB1 y RB2

do{
if(kbhit()) //se ha recibido un caracter?
{
caracter=getc(); //Guarda caracter recibido en variable caracter
if(caracter>='0' && caracter<='9') // Si es un número?
{
output_toggle(PIN_B1); //Activamos la Salida DS2
}
else //Si no es un número
{
output_toggle(PIN_B2); //Activamos la Salida DS3
}
}
}
while(1); //bucle que siempre se pone,necesario.
}

Desconectado erdanieee

  • PIC10
  • *
  • Mensajes: 44
Re: Problema con Rs232 en PIC16f886 en C
« Respuesta #1 en: 24 de Noviembre de 2010, 10:42:54 »
comprueba en el datasheet los valores por defecto del ADC, quizás esté ahí el problema

Desconectado ferorts

  • PIC10
  • *
  • Mensajes: 36
Re: Problema con Rs232 en PIC16f886 en C
« Respuesta #2 en: 24 de Noviembre de 2010, 20:01:59 »
comprueba en el datasheet los valores por defecto del ADC, quizás esté ahí el problema

Primero de todo,gracias por responder, dices que mire los valores por defecto en el datasheet del convertidor analogico digital,en el datasheet se encontrarlos, pero una vez sepa los valores, donde o como modifico los valores del ADC en el programa para ajustarlos a los del datasheet?.

Gracias.
« Última modificación: 24 de Noviembre de 2010, 20:40:44 por ferorts »

Desconectado ferorts

  • PIC10
  • *
  • Mensajes: 36
Re: Problema con Rs232 en PIC16f886 en C
« Respuesta #3 en: 25 de Noviembre de 2010, 07:49:55 »
comprueba en el datasheet los valores por defecto del ADC, quizás esté ahí el problema

No estoy usando ningun circuito entre el pc y el pic ademas del conversor, seria posible que no me reconociera los caracteres porque no estoy utilizando el MAX232 o similares?,es necesario circuiteria extra para la comunicacion entre el PC-->PIC por Rs232?yo creia que solo era para PIC-->PC.

Gracias.

Desconectado bmfranky

  • PIC16
  • ***
  • Mensajes: 165
    • La Tienda De Fran
Re: Problema con Rs232 en PIC16f886 en C
« Respuesta #4 en: 25 de Noviembre de 2010, 09:43:39 »
Tienes que colocar un max232, o no reconocerá la transmisión desde el pic, ademas si recibes del PC , te abra quemado la entrada, ya que varia de +12 a -12, o +/-8 en los portátiles antiguos y algunos converso res, mucho mas de los 5.6 máximos que soporta un pic normal.
Visiten La Tienda De Fran ;-) Aqui. y mi nueva Web Aqui.

Desconectado erdanieee

  • PIC10
  • *
  • Mensajes: 44
Re: Problema con Rs232 en PIC16f886 en C
« Respuesta #5 en: 26 de Noviembre de 2010, 07:15:42 »
Tienes que colocar un max232, o no reconocerá la transmisión desde el pic, ademas si recibes del PC , te abra quemado la entrada, ya que varia de +12 a -12, o +/-8 en los portátiles antiguos y algunos converso res, mucho mas de los 5.6 máximos que soporta un pic normal.

Olvida lo que te dije sobre ADC, si no adaptas los niveles PIC-PC lo más seguro es que te hayas cargado el PIC. Comprueba que sigue funcionando con algún programa sencillito que encienda y apague leds y busca en el foro ejemplos RS232, que hay muchísimos

saludos

Desconectado ferorts

  • PIC10
  • *
  • Mensajes: 36
Re: Problema con Rs232 en PIC16f886 en C
« Respuesta #6 en: 28 de Noviembre de 2010, 10:09:15 »
En primer lugar gracias a todos por las respuestas tan rapidas, la verdad es que estoy bloqueado con este asunto,he probado flashear el pic con otros programitas que tenia de temporizadores y interruptores y de momento se encienden los leds, espero que no me lo haya cargado....,ahora he decidido similular primero el circuito en proteus,para eliminar posibles fallos electricos y asi simplificar errores, utilizo el proteus 7, y y el virtual serial port kit, y el terminal V1.8 para simular la conxion rs232 con el hiperterminal en el proteus.Subo los .dsn,.hex

El programa de terminal lo tengo configurado a los mismos baudios que el proteus y el programa en c,
He creado una conexion entre el COM 2 yCOM3 con el virtual serial port,en propiedades de conexion tengo marcado( PIN out Hadstake --> Full-->DTR to DCD)y el eneable bitarate emulation desactivado.

Configuro el programa terminal con la misma velocidad y bits(adjunto screnshot)y a la hora de arrancar la simulacion de proteus y mandar algo por hyperterminal ademas de no aparecer nada, se ponen dos luces rojas sobre los pines del COMPIM sobre el DCD y DSR,a donde conecto estos pines, me hacen falta para la TX/RX de caracteres ascii entre el pic y el hyperterminal ?.

Es la primera vez que utilizo el proteus,ya que yo soy mas de orcad, hasta hace cosa de un mes que empeze con los pics,antes de ponerme con este programa he hecho un par mas facilitos de programar el pic y encender un led o mandar un caracter definido en la memoria ram del pic al hyperterminal para ir entrenando con este programa,aun asi que por favor si veis alguna cagada, decirmela xf.

Gracias a todos.

Aqui pongo el programa de nuevo.
--------------------------------------------------------
#include <16F886.h>
#device adc=8
#FUSES NOWDT //No Watch Dog Timer
#FUSES INTRC_IO //Internal RC Osc, no CLKOUT
#FUSES NOPUT //No Power Up Timer
#FUSES MCLR //Master Clear pin enabled
#FUSES NOPROTECT //Code not protected from reading
#FUSES NOCPD //No EE protection
#FUSES BROWNOUT //Reset when brownout detected
#FUSES IESO //Internal External Switch Over mode enabled
#FUSES FCMEN //Fail-safe clock monitor enabled
#FUSES LVP //Low Voltage Programming on B3(PIC16) or B5(PIC18)
#FUSES NODEBUG //No Debug mode for ICD
#FUSES BORV40 //Brownout reset at 4.0V
#FUSES NOWRT //Program memory not write protected

#use delay(clock=4000000) //Osc Interno a 4 Mhz
#use RS232(BAUD=9600, BITS=8 ,PARITY=N, XMIT=PIN_C6, RCV=PIN_C7) //Configuracion de Rs232



char caracter; //Creamos una varible de intercambio

void main()
{
set_tris_b(0xF9); //puerto B como salida salidas el RB1 y RB2

do{
if(kbhit()) //se ha recibido un caracter?
{
caracter=getc(); //Guarda caracter recibido en variable caracter
if((caracter>='0' && caracter<='9')) // Si es un número?
{
output_toggle(PIN_B1); //Activamos la Salida DS2
}
else //Si no es un número
{
output_toggle(PIN_B2); //Activamos la Salida DS3
}
}
}
while(1); //bucle que siempre se pone,necesario.
}

Desconectado cantman

  • PIC10
  • *
  • Mensajes: 3
Re: Problema con Rs232 en PIC16f886 en C
« Respuesta #7 en: 02 de Diciembre de 2010, 22:01:23 »
hola Amigo,
Yo tengo bastante experiencia programado en C, te recomiendo que busques una tabla con el código ASCII, aqui encontraras los valores que son asignados a los datos numericos y los asigandos a los de tipo caracter.
con respecto a tu código, es preciso que la variable con la cual recibes el dato sea de tipo enetero int, porque al ser de tipo char, el compilador no mira el valor numerico sino el código ASCII del caracter leido, por eso se te enciende el led cuando envias un numero y un char. Si la variable es un int, el compilador evaluará su valor numérico, así podrá distinguir si es un numero o un char.
saludos desde Colombia
Espero haber sido de  ayuda.


 

anything