Autor Tema: Porque que sera que el C no se me da??  (Leído 2755 veces)

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

Desconectado Micom

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 782
Porque que sera que el C no se me da??
« 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.
« Última modificación: 04 de Marzo de 2013, 02:07:57 por Micom »
El programador GTP USB PLUS es un super programador
GRACIAS dobles amigo SISPIC

Tan solo queda seguir sobreviviendo

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Porque que sera que el C no se me da??
« Respuesta #1 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.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5883
    • Picuino
Re: Porque que sera que el C no se me da??
« Respuesta #2 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.
« Última modificación: 05 de Marzo de 2013, 11:33:05 por Picuino »

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5883
    • Picuino
Re: Porque que sera que el C no se me da??
« Respuesta #3 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 sobre programación estructurada que defiende el uso del goto:

Structured programming with go to statements

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

Saludos.
« Última modificación: 04 de Marzo de 2013, 12:38:08 por Picuino »

Desconectado thegame

  • PIC18
  • ****
  • Mensajes: 439
    • Mcu Tronics
Re: Porque que sera que el C no se me da??
« Respuesta #4 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

Nunca se deja de aprender

Desconectado Micom

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 782
Re: Porque que sera que el C no se me da??
« Respuesta #5 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  ((:-))
El programador GTP USB PLUS es un super programador
GRACIAS dobles amigo SISPIC

Tan solo queda seguir sobreviviendo

Desconectado planeta9999

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3520
    • Pinballsp
Re: Porque que sera que el C no se me da??
« Respuesta #6 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).

« Última modificación: 05 de Marzo de 2013, 01:25:42 por planeta9999 »

Desconectado Micom

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 782
Re: Porque que sera que el C no se me da??
« Respuesta #7 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?
El programador GTP USB PLUS es un super programador
GRACIAS dobles amigo SISPIC

Tan solo queda seguir sobreviviendo

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Porque que sera que el C no se me da??
« Respuesta #8 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.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5883
    • Picuino
Re: Porque que sera que el C no se me da??
« Respuesta #9 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.

Desconectado planeta9999

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3520
    • Pinballsp
Re: Porque que sera que el C no se me da??
« Respuesta #10 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.

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Porque que sera que el C no se me da??
« Respuesta #11 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.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: Porque que sera que el C no se me da??
« Respuesta #12 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 !

Desconectado Micom

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 782
Re: Porque que sera que el C no se me da??
« Respuesta #13 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.
El programador GTP USB PLUS es un super programador
GRACIAS dobles amigo SISPIC

Tan solo queda seguir sobreviviendo