UART con 18F4550

Hola !!

Estoy trabajando en un proyecto escolar y necesito enviar datos a una computadora mediante UART. (No necesariamente UART pero creo que es la mas simple).

Tengo el convertidor USB-TTL y uso HyperTerminal. El compilador es MikroC.

Mi problema es que no he logrado ni enviar, ni recibir datos jaja. No se donde esté el problema. Uso la libreria existente en el mismo compilador, he puesto el codigo de ejemplo y otros que he encontrado pero... nada.

HyperTerminal creo que es simple, solo escoger el baud rate y el puerto a usar entonces descarto el error de ahi. (A menos de que haya algun truquillo)

He pensado que puede ser la configuracion de los registros o la frecuencia del reloj. A decir verdad no estoy seguro sobre si lo tengo a 1MHz, ya que para lograrlo hice prueba y error con la ventada de configuración.

Agradecería mucho si alguien me hecha una mano con esto.

Anexo la ventana en que he configurado el micro y el simple codigo que intento usar.
 

Adjuntos

  • Captura de pantalla (45).jpg
    Captura de pantalla (45).jpg
    88.5 KB · Visitas: 26
no he manejado mikroC pero funciona mas omenos parecido al C18

1.- no es necesario poner 100 ms de retardo para el baudrate

2.- el oscilador depende del cristal que le pongas al micro

si el cristal es de 20Mhz trabaja a 20Mhz

pero si tienes configurados los PLL y los CPUdiv ahi si trabaja distinto al cristal
ejemplo cristal 20Mhz PLL 5 el oscilador se va a los 48Mhz

eso es un detalle que a muchos se les patina eso pasa por el Bootloader en caso que le hayas metiodo bootloader

hay que leer la hoja del pic18f4550 para entender por que pasa esto
 
Es de lo que no estoy muy seguro, si utilizar cristal externo o no. Acabo de comprar uno de 20MHz, pero si se puede usar el interno de 8MHz para UART, mucho mejor.



Ajusté el reloj interno a 8MHz, pero me da un error de 6.99% en el baud rate. Tal porcentaje no aparece en las hojas del fabricante.
 
Última edición:
Hola.
Para usar el OSC interno, ver los fuses (Oscillator) que inicien con INTOSC, luego escribir el valor adecuado en el registro OSCCON y poner el mismo valor de la frecuencia donde pide Oscillator Frequency.

Es decir que si configuras el interno a 8Mhz, este mismo valor va en el recuadro de Oscillator Frequency. Ojo que el interno no funciona para el USB.

Si utilizas el externo ya tienes que jugar con todas las posibles configuraciones que hay, PLL, divisores, etc. y cuando tengas un valor, ese mismo va en el recuadro de Oscillator Frequency.

Igual, revisa el cuadro Clock Diagram en la hoja de datos del PIC y compara con la ventana de configuración del compilador.

Saludos.
 
Hola !

Trabajo con un micro PIC18F4550 y compilo en MikroC.

Intento convertir un string a un float. Para lo cual utilizo atof.
Pero sigue dandome el problema - Illegal typecast \'can not convert to pointer\' - en la linea de "Lcd_Out(1,1, val);"

float val;
char str[20];

void main() {


Lcd_Init();
Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_CURSOR_OFF);

strcpy(str, "98993489");
val = atof(str);
Lcd_Out(1,1, val);
Delay_ms(1000);

}


El codigo (excepto las partes del LCD) lo saqué de internet. Se supone que funciona en C.
Saben a que puede deberse ese error?

Saludos ! ...

Este es el codigo de donde saqué la conversion

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
float val;
char str[20];

strcpy(str, "98993489");
val = atof(str);
printf("String value = %s, Float value = %f\n", str, val);

strcpy(str, "tutorialspoint.com");
val = atof(str);
printf("String value = %s, Float value = %f\n", str, val);

return(0);
}
 
Convierte los valores numéricos a string usando las funciones de conversión:

  • ByteToStr
  • ShortToStr
  • WordToStr
  • IntToStr
  • LongToStr
  • LongWordToStr
  • FloatToStr
  • WordToStrWithZeros
  • IntToStrWithZeros
  • LongWordToStrWithZeros
  • LongIntToStrWithZeros
Saludos.
 
Gracias ! Supongo que asi deberia funcionar ya, pero me he metido en otro problemilla, cuando intento compilar, me dice "Demo Limit" y creo que es por alcanzar un limite de funciones o algo asi. La cosa es, que si quito la funcion "atof" se quita el error aunque ponga las demas librerias que necesitare mas adelante (Soft_SPI, UART).

Alguien tiene la definicion de esa funcion? para ponerla directamente en el codigo a ver si es la solucion?


Sé que la solucion ideal es comprar el compilador completo, pero tratandose de un proyecto escolar, no vale gastar los $139 USD que cuesta comprarlo.
 
Última edición:
Hola !

Estoy teniendo inconvenientes con un programa que recibe un string de numeros, los hace float, les suma X cantidad y los vuelve a convertir en string para regresarlos. Solo que al regresar la cadena, en vez de decir ''13.88'' dice ''13.87999''.
Alguien sabe a que se debe eso o cual podria ser la solucion?
Al parecer el problema esta tambien en '' FloatToStr(val,lol); ''

Uso MikroC, no se si influya en esto, aunque no creo.

Código:
double res;
 float val;
 char lol[20];
 char txt[20];
 
void main() {

  OSCCON = 0x77;
  OSCTUNE = 0x80;
  ADCON1 = 0x07;
  Delay_ms(100);

  Lcd_Init();
  Lcd_Cmd(_LCD_CLEAR);
  Lcd_Cmd(_LCD_CURSOR_OFF);

while(1)
{
   strcpy(txt,"13.88");
   val = atof(txt);
   
    /*
        Aqui modificaria "val"
    */
    
   FloatToStr(val,lol);
        Lcd_Out(1,1,lol);
        Lcd_Out(2,1,txt);
}
}

Saludos ! ...
 
Hola.
Mira en floatToStr function... básicamente no se puede hacer nada ya que la librería trabaja así...
Hace tiempo que no trabajo con MikroC y no se si actualmente se pueda configurar la precisión con valores flotantes... aunque dudo que se pueda.

Prueba reduciendo el array a solo la cantidad de caracteres que quieras que tenga el resultado. También hay formas de trabajar solo con enteros y representar flotante... es un truco ya que trabajar con flotante en un PIC de 8 bits consume mucha memoria... en fin.

Saludos.
 
Encontré esto, un usuario de otro foro hizo el código para pasar de float a string y es el que estoy usando.

http://www.mikroe.com/forum/viewtopic.php?f=72&t=54703&sid=6447c1d9ed9b02a7aa72fcdd4c5090de&start=15


Ahora tengo otro problemilla jaja, espero que ya sea el ultimo.

Como leo la señal digital en un PIC? he puesto varias formas de hacerlo que ponen en manuales y foros y no me ha servido. Solo una, que es la de MCLR/RE3.

Código:
  ADCON1 = 0x0F;
  TRISE = 0b00001111;                                 // Configure PORTC as output
  PORTE = 0b0001000;                                  // Initial PORTC value

while(RE3_bit=1)
         {
         if (RE0_bit=1)              
         {
          val+=0.16;
          Delay_ms(200);
          }
         if (RE1_bit=1)              
         {
          val+=0.18;
          Delay_ms(200);
          }
         if (RE2_bit=1)              
         {
          val+=0.21;
          Delay_ms(200);
          }
        }

Se supone que debe sumar distintos valores al presionar los pushbutton conectados a RE0, RE1 y RE2. Y al presionar RE3, pasará a la siguiente parte del código. (Esto ultimo es lo que si hace).

Saludos !
 
¿Cómo leo la señal digital en un PIC? He puesto varias formas de hacerlo que ponen en manuales y foros y no me ha servido. Solo una, que es la de MCLR/RE3.
Se supone que debe sumar distintos valores al presionar los pushbutton conectados a RE0, RE1 y RE2. Y al presionar RE3, pasará a la siguiente parte del código. (Esto ultimo es lo que si hace).

Si únicamente quieres que el puerto E trabaje en modo digital, debes poner el registro ADCON1 con el valor 0x0A

¿Que es lo que no hace?
Me parece que existe una función Button en MikroC, sería mejor que la usaras para evitar que al mantener presionados los pulsadores, la cuenta se siga incrementando.
También podrías utilizar bucles while para el control de los pulsadores.

Suerte.
 
Última edición:
No aumenta el valor de 'val'. Se queda igual, como si no estuviera recibiendo señal alguna. También use ya la función de button :S . Veré si sirve con los bucles while.
Gracias !
 
Atrás
Arriba