TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Micom en 04 de Marzo de 2013, 02:04:43

Título: Porque que sera que el C no se me da??
Publicado por: Micom en 04 de Marzo de 2013, 02:04:43
Soy un hombre viejo que durante el tiempo que tengo de programar pics (casi 10 años), Solo aprendi a hacerlo con Ensamblador, he jugado mucho con los viejos y descontinuados pics 16f84a y los 16fxxx y el ensamblador a sido suficiente para jugar con ellos. Pero dice un dicho "Si no te actualizas mueres un poco cada dia" y he decidido aprender a programar en C18 ya que los viejos sistemas de comunicacion como era el puerto paralelo y serial de la plataforma PC rayan la obsolencia, el USB es lo de hoy, y estos pics lo traen nativo, el ensamblador es lo mejor para programar pero a estas alturas resulta mas que tedioso querer utilizarlo para los pics 18fXXX. Y ahi esta el problema, Estoy tan acostumbrado al ensamblador que no puedo proyectar mis viejas rutinas para el C, he hechos multiples programas con el mikroC y si me han funcionado pero solo han sido programas sencillos rutinas mas complejas no se como proyectarlas con las rutinas del C.
Por ejemplo aca les pongo un  fragmento de codigo en ensamblador que sirve para entrar en un modo de programacion para realizar ajustes que se guardaran en la eeprom interna del pic y se basa en mantener presionado un pulsador por 5 segundos y si el pulsador se suelta antes de los 5 segundos este recarga el registro que cuenta los 5 segundos y va a revisar de nuevo el pulsador. Pues no lo pude implementar en microC.

Código: [Seleccionar]
PROGRAMAR_TIEMPO
MOVLW .5
MOVWF CONTA

BTFSC PULSA_STOP
GOTO PROGRAMAR_TIEMPO
CALL Retardo_1s
DECFSZ CONTA,F
GOTO $-4
LED_ON
SLEEP

 
Haber si alguien me puede iluminar un poco el camino.
Título: Re: Porque que sera que el C no se me da??
Publicado por: AngelGris en 04 de Marzo de 2013, 09:48:54
  De una forma genérica podría ser algo asi...

Código: C
  1. while (PORTBbits.RB1 == 0)
  2. {
  3.   __delay_ms(200);
  4.   contador++;
  5. }
  6.  
  7.   if (contador >= 25) .....

  Dicha rutina se mantiene en el ciclo while mientras el pin B1 se encuentre en 0. Se ejecuta un delay de 200 ms y se incrementa un contador. Cuando el pin B1 pasa a estado 1 se evalua la variable contador y si es mayor o igual a 25 sería que pasaron más de 5 segundo y se actúa en consecuencia.

  Si necesitas sí o sí entrar a dicha rutina se podría utilizar un while anidado. Tal vez algo así...

Código: C
  1. programar = 0;
  2. contador = 0;
  3. while (programar == 0)
  4. {
  5.   while (PORTBbits.RB1 == 0)
  6.   {
  7.     __delay_ms(200);
  8.     contador++;
  9.   }
  10.   if (contador >= 25) programar = 1;
  11.   else
  12.     contador = 0;
  13. }

  Este código permanecerá en el primer while mientras la variable programar sea igual a 0. Dicha variable sólo se pondrá en 1 si pasaron mas de 5 segundos. Si al soltar la tecla no pasaron 5 segundos, la variable contador se resetea.
Título: Re: Porque que sera que el C no se me da??
Publicado por: Picuino en 04 de Marzo de 2013, 12:06:38
Otra forma de hacer la rutina utilizando goto:
Código: [Seleccionar]
   char conta;

    goto PROGRAMAR_TIEMPO;
    do {
        if (PULSA_STOP == 1) {
            PROGRAMAR_TIEMPO:
            conta = 5;
        };
        Retardo_1s()
    } while (--conta);
    LED_ON()
    Sleep();


Saludos.
Título: Re: Porque que sera que el C no se me da??
Publicado por: Picuino en 04 de Marzo de 2013, 12:10:35
GOTO en C
http://www.todopic.com.ar/foros/index.php?topic=38049.0

Un artículo escrito por el prestigioso Donald Knuth (http://es.wikipedia.org/wiki/Donald_Knuth) sobre programación estructurada que defiende el uso del goto:

Structured programming with go to statements (http://pplab.snu.ac.kr/courses/adv_pl05/papers/p261-knuth.pdf)

Tiene numerosos ejemplos de pequeñas rutinas con y sin goto.

Saludos.
Título: Re: Porque que sera que el C no se me da??
Publicado por: thegame en 04 de Marzo de 2013, 14:35:55
si no me equivoco para poder usar esto:

Código: [Seleccionar]
__delay_ms(200);
se debe declarar el valor del cristal en tu codigo con el identificador _XTAL_FREQ que supongo ya tienes por default

Título: Re: Porque que sera que el C no se me da??
Publicado por: Micom en 04 de Marzo de 2013, 16:02:02
Agradesco mucho las respuestas y les aseguro que voy a leer muy cuidadosamente cada una de las soluciones pues es mi deseo aprender C y como dice Picuino realmente lo que mas extraño es mi adorado GOTO aunque los doctos en el tema señalen un nivel bajo de pensamiento su uso en C. Y me alegro que haya alguilen que lo defienda  ((:-))
Título: Re: Porque que sera que el C no se me da??
Publicado por: planeta9999 en 04 de Marzo de 2013, 19:41:32
Agradesco mucho las respuestas y les aseguro que voy a leer muy cuidadosamente cada una de las soluciones pues es mi deseo aprender C y como dice Picuino realmente lo que mas extraño es mi adorado GOTO aunque los doctos en el tema señalen un nivel bajo de pensamiento su uso en C. Y me alegro que haya alguilen que lo defienda  ((:-))


Ten en cuenta que en ensamblador el GOTO se usa para poder hacer saltos condicionales o bucles, pero en un lenguaje de alto nivel hay otras instrucciones más apropiadas para esas tareas (while, do while, for, switch-case...).

Yo recuerdo el GOTO de las primeras versiones del Basic, allá por los años del Spectrum, y aunque aparece en la mayoría de lenguajes, es algo obsoleto, que no debería de utilizarse.  Incluso el IF en lenguajes de alto nivel, es una instrucción que se usa bastante mal, mucha gente la emplea en lugar del SWITCH-CASE, montando unos "churros" impresionantes.

La única peculiaridad del C, son los punteros, y en C++, además las clases (eso si que tiene tela).

Título: Re: Porque que sera que el C no se me da??
Publicado por: Micom en 05 de Marzo de 2013, 00:50:12
Si, tienes razon con el uso de los "if" mal empleados, ojala logre un buen nivel en C es mi interes aprenderlo para hacer mis programas en C18 y probarlos con el bootloader cargado en un pic18f4550. A proposito alguien sabra como saber si el c18 esta full o cuantos dias le faltan para caducar?
Título: Re: Porque que sera que el C no se me da??
Publicado por: AngelGris en 05 de Marzo de 2013, 08:41:23
  Entre Switch e IF es un tema a tener en cuenta en los microcontroladores. En ocasiones he visto que genera menos código dejar sentencias IF-ELSE en lugar de SWITCH-CASE.
Título: Re: Porque que sera que el C no se me da??
Publicado por: Picuino en 05 de Marzo de 2013, 11:34:02
Otra forma de hacer la rutina utilizando goto:
Código: [Seleccionar]
    char conta;

    goto PROGRAMAR_TIEMPO;
    do {
        if (PULSA_STOP == 1) {
            PROGRAMAR_TIEMPO:
            conta = 5;
        };
        Retardo_1s()
    } while (--conta);
    LED_ON()
    Sleep();


Saludos.
Título: Re: Porque que sera que el C no se me da??
Publicado por: planeta9999 en 05 de Marzo de 2013, 12:28:23
  Entre Switch e IF es un tema a tener en cuenta en los microcontroladores. En ocasiones he visto que genera menos código dejar sentencias IF-ELSE en lugar de SWITCH-CASE.


¿ Has hecho la comparativa, utilizando la optimización del compilador ?, sin optimización, los resultados pueden ser muy dispares.
Título: Re: Porque que sera que el C no se me da??
Publicado por: AngelGris en 05 de Marzo de 2013, 16:20:50
  Entre Switch e IF es un tema a tener en cuenta en los microcontroladores. En ocasiones he visto que genera menos código dejar sentencias IF-ELSE en lugar de SWITCH-CASE.


¿ Has hecho la comparativa, utilizando la optimización del compilador ?, sin optimización, los resultados pueden ser muy dispares.


  Estoy usando la versión free de XC8 tal cual se instala por defecto. Cuando era dos o tres IF-ELSE me generó menos código.

  Tendría que leer detenidamente el manual del compilador para saber que opciones de optimizascón tiene la versión free. Tal vez con distintas opciones pueda obtener resultados distintos.
Título: Re: Porque que sera que el C no se me da??
Publicado por: RICHI777 en 05 de Marzo de 2013, 16:22:11
Un buen compilador trata a los switch - case de manera diferente que a los if anidados, normalmente reemplaza los case por una tabla de saltos ( jump - table ), si el compilador es todavía mejor, analiza cuando es mejor o peor colocar tabla de saltos que saltos condicionales esto se daría cuando la cantidad de case es poca.

Saludos !
Título: Re: Porque que sera que el C no se me da??
Publicado por: Micom en 05 de Marzo de 2013, 18:02:47
Aun ando en pañales con lo del compilador C18 pero estoy muy seguro que es la alternativa mas confiable en cuestion de programacion en c para microntroladores pic 18fXXX. Y considero que deberiamos centrarnos mas en este foro sobre este compilador. Pues de ver a muchos compañeros sufrir con los bugs del ccs y otros, pienso que debemos orientarnos mas hacia el. Ojala pronto pueda comprobar lo del uso de los IF-ELSE y de los SWITCH-CASE en cuestion de rendimiento de memoria y optimisacion de codigo.
Que bonito ejemplo me pusite Picuino se ve algo extraño el goto entre las instrucciones de C  :)
El fragmento de codigo que puse al principio en ensamblador es parte de un programita para controlar una pluma de acseso para automoviles. Gracias a Dios ya lo termine pero siempre lo hice con ensamblador, espero que el proximo proyecto ya lo pueda proyectar en C18 o CX8 que dicen, no esta tan bueno como que todos los X de Microchip estan muy llenos de bugs.