TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: halowin en 01 de Agosto de 2012, 08:07:14

Título: No entiendo esta linea del programa
Publicado por: halowin en 01 de Agosto de 2012, 08:07:14
Hola amigos.

He encontrado esta rutina para hacer un delay con SDCC pero no entiendo esta linea que he marcado con el comentario
////<-------esta linea no se que es ????

¿Y como podría adaptarla a 4 MHz ?

Gracias.


Código: [Seleccionar]
//Delay (retardos)

//delay.h
//Código:

#ifndef DELAY_H
#define DELAY_H

void delay_us ( char a );
void delay_ms(int ms);

#endif

//--------------------------

//delay.c
//Código:

#include "delay.h"

// tiempo = (5a+1)µs a>=2   basado en micro a 20mhz
void delay_us ( char a )

{ a;  //<-------esta linea no se que es ????

 _asm                 // a ya está cargado en el registro w
    sublw 1           //(1-a)
bucle:
    ADDLW 1
 btfss 0x03,0        //test si w=0 carry=1
    goto bucle
 _endasm;
}
Título: Re: No entiendo esta linea del programa
Publicado por: diguito_69 en 01 de Agosto de 2012, 11:35:53
Hola.

Seguramente debe ser para que no aparezca una advertencia al compilarla (unreferenced function argument).

En cuanto a adaptarla a 4MHz, ahora lo que se me ocurre es dividir el valor por 5 (20/4). Pero no creo que sea una buena solución.
Si encuentro algo mejor te aviso.

Saludos.
Título: Re: No entiendo esta linea del programa
Publicado por: halowin en 01 de Agosto de 2012, 13:06:52
Hola.

Seguramente debe ser para que no aparezca una advertencia al compilarla (unreferenced function argument).

En cuanto a adaptarla a 4MHz, ahora lo que se me ocurre es dividir el valor por 5 (20/4). Pero no creo que sea una buena solución.
Si encuentro algo mejor te aviso.

Saludos.

He leido algo al respecto del unreference...

Pero la cosa es QUE NO FUNCIONA, compila perfectamente pero no pirula.

Dono mi reino por una libreria de reterdos que funcioneeeeeeee en SDCC y en un PIC16f84/A, para subir de Pic ya habrá tiempo.


Título: Re: No entiendo esta linea del programa
Publicado por: Suky en 01 de Agosto de 2012, 13:33:49
Tiene que ser en SDCC, creo que hitech en re-lite es más eficiente que ese compilador y además tiene librerías  :undecided:
Título: Re: No entiendo esta linea del programa
Publicado por: diguito_69 en 01 de Agosto de 2012, 13:37:17
Cuantos microsegundos mas o menos necesitas?.

Porque en caso de que necesites pocos us. Teniendo en cuenta que con el pic a 4MHz, las instrucciones se ejecutan a 1MHz, por lo tanto el tiempo de cada instrucción es de 1us. Entonces podrías poner tantas instrucciones nop como us de retardo necesites.

Ej: Retardo de 5us
Código: C
  1. _asm
  2.     nop
  3.     nop
  4.     nop
  5.     nop
  6.     nop
  7. _endasm;

No es lo ideal, pero puede servir hasta encontrar una solución y no quedarte trabado con esto, mientras le podes dedicar mas tiempo a terminar el resto del código.

Si tengo algo de tiempo veo si puedo hacer alguna librería para retardos.

Saludos.
Título: Re: No entiendo esta linea del programa
Publicado por: halowin en 01 de Agosto de 2012, 13:48:54
Tiene que ser en SDCC, creo que hitech en re-lite es más eficiente que ese compilador y además tiene librerías  :undecided:

Gracias, le echaré un ojo, pero es condición necesaria que sea gratis y sin la pavada esa de version tryal.
Título: Re: No entiendo esta linea del programa
Publicado por: Suky en 01 de Agosto de 2012, 13:51:40
Ahora en realidad sería XC8, tienes la versión FREE: http://www.microchip.com/pagehandler/en_us/promo/mplabxc/
Título: Re: No entiendo esta linea del programa
Publicado por: halowin en 01 de Agosto de 2012, 13:52:48
Cuantos microsegundos mas o menos necesitas?.

Porque en caso de que necesites pocos us. Teniendo en cuenta que con el pic a 4MHz, las instrucciones se ejecutan a 1MHz, por lo tanto el tiempo de cada instrucción es de 1us. Entonces podrías poner tantas instrucciones nop como us de retardo necesites.

Ej: Retardo de 5us
Código: C
  1. _asm
  2.     nop
  3.     nop
  4.     nop
  5.     nop
  6.     nop
  7. _endasm;

No es lo ideal, pero puede servir hasta encontrar una solución y no quedarte trabado con esto, mientras le podes dedicar mas tiempo a terminar el resto del código.

Si tengo algo de tiempo veo si puedo hacer alguna librería para retardos.

Saludos.


Gracias diguito por tu esfuerzo, necesito la tipica 'delay_ms()' ya que tengo que disparar una interrupcion cada segundo exacto (delay_ms(1000)' y tengo todo hecho y estoy parado por esta estupidez.

He encontrado esta:

Código: [Seleccionar]
void delay_ms(long ms)
{
    long i;

    while (ms--)
        for (i=0; i < 330; i++)
            ;
}

que si parpadea pero se tira casi 5 segundos con delay_ms(1000), debe estar calcalada para otra frecuencia distinta de 4 Mhz.

sigo investigando/buscando



Título: Re: No entiendo esta linea del programa
Publicado por: halowin en 01 de Agosto de 2012, 14:14:04
Bueno, he visto esta funcion trabajando para un 16f877 que va a 20 Mhz, asi que he aplicado la cuenta de la vieja y he dividido el 330 entre 5 dejnadolo en 66 y ahora parece que si pirula; lo he cronometrado a pulso con el crono del reloj y si anda por ahi, me fiaré.

El ejemplo viene aqui:
http://www.aquihayapuntes.com/sdcc-small-device-c-compiler-en-windows.html



He encontrado esta:

Código: [Seleccionar]
void delay_ms(long ms)
{
    long i;

    while (ms--)
        for (i=0; i < 330; i++)
            ;
}

que si parpadea pero se tira casi 5 segundos con delay_ms(1000), debe estar calcalada para otra frecuencia distinta de 4 Mhz.

sigo investigando/buscando




[/quote]
Título: Re: No entiendo esta linea del programa
Publicado por: AngelGris en 01 de Agosto de 2012, 15:44:18
  Hitech lite no es trial. Yo estoy usando la versión 9.80 (creo que está disponible la 9.83) y funciona verdaderamente muy bien. La diferencia con la versión de pago es la optimización del código. Creo que en el sitio de microchip detalla bien las diferencias.
Título: Re: No entiendo esta linea del programa
Publicado por: halowin en 01 de Agosto de 2012, 18:52:54
  Hitech lite no es trial. Yo estoy usando la versión 9.80 (creo que está disponible la 9.83) y funciona verdaderamente muy bien. La diferencia con la versión de pago es la optimización del código. Creo que en el sitio de microchip detalla bien las diferencias.

Hola AngelGris, te he hecho caso y he instalado el HI-TECH lite.
He hecho el tipico programa para parpadear un par de leds y la pausa funciona ok.

la pausa la tengo que meter con:
Código: [Seleccionar]
__delay_ms(500);

porque el

Código: [Seleccionar]
delayMs()

no lo entiende, veo que meten un include "delay.h" (del directorio local) pero ese ficchero yo no lo tengo.

Gracias.


Título: Re: No entiendo esta linea del programa
Publicado por: AngelGris en 01 de Agosto de 2012, 19:02:45
  Quizá en dicha librería estén definidas las funciones de retardos de SDCC. En HiTech no se necesita incluir nada, sólo tienes que tener definido a que velocidad trabaja el PIC con la sentencia

Código: C
  1. #define _XTAL_FREQ 10000000

  en ese caso estoy indicando que el PIC trabaja a 10MHz
Título: Re: No entiendo esta linea del programa
Publicado por: halowin en 01 de Agosto de 2012, 19:12:10
  Quizá en dicha librería estén definidas las funciones de retardos de SDCC. En HiTech no se necesita incluir nada, sólo tienes que tener definido a que velocidad trabaja el PIC con la sentencia

Código: C
  1. #define _XTAL_FREQ 10000000

  en ese caso estoy indicando que el PIC trabaja a 10MHz

Ya, ya, si eso lo tengo, pero me refiero que esa funcion delayMs() la he visto aqui en el foro con ejemplos de HI-TECH no CCS, pero bueno me da igual si la consigo bien sino con esto marcho perfectamente.

Título: Re: No entiendo esta linea del programa
Publicado por: Suky en 01 de Agosto de 2012, 19:18:32
Hitech tiene definido _delay_ms() y _delay_us(). En todo caso mira la documentación del compilador, porque si buscas por ahí vas a encontrar de todo (que pueden incluir librerías propias)  ;-)