Autor Tema: Superdelay.c - Un delay extra para emergencias  (Leído 4137 veces)

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

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Superdelay.c - Un delay extra para emergencias
« en: 17 de Abril de 2010, 16:22:30 »
Hola

Cuando estamos compilando con CCS hay ocasiones en que dentro de una interrupción queremos colocar un delay_ms. Cuando CCS ve esto deshabilita la interrupción para no volver a entrar a ella por si el delay sigue trabajando.

Creo recordar que arroja un warning... "int tmr disabled to prevent re-entrancy".

Con la ayuda de las librerías C18 de Microchip, se pueden importar las funciones DelayMs() y Delay10us() a CCS. Una vez compiladas me doy cuenta de que CCS tiene una optimización en tiempo de ejecución superior a C18.

Con FCY = 12MIPS (Fosc = 48MHz) los tiempos son:
- DelayMs(1) se ejecuta en 300us
- Delay10us(1) se ejecuta en 3us

A raíz de estos desajustes se puede simplemente crear otra función que anide las anteriores pero con nuevos nombres:

Código: [Seleccionar]
void DelayMs(int16 n)
{
while(n--)
   {
   Delay300us(3);
   Delay3us(34);
   }
}

Una vez compilada, el analizador muestra que se ejecuta en 1ms exactamente  :mrgreen:

Un ejemplo con código y tiempos...

Código: [Seleccionar]
/*
Programa para poner a prueba la librería de delays modificada
*/

#include <18F2550.h>
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,NOBROWNOUT,USBDIV,PLL2,CPUDIV1,VREGEN,PUT,MCLR
#use delay(clock=48000000)

#define GetSystemClock() 48000000 //esto es lo único que hay que configurar
#include "superdelay.c"

void main()
{
int m=10;
while(1)
   {
   DelayMs(m);
   output_b(0xFF);
   DelayMs(m);
   output_b(0);
   }
}

http://img217.imageshack.us/img217/508/superdelay.png


Al tener una función DelayMs() y otra nativa delay_ms() se puede insertar la nueva en una interrupción sin que CCS se oponga.

Adjunto la librería modificada. La librería original es timedelay.c de la Microchip Applications Library.

http://www.4shared.com/file/uhCIONz2/SuperDelay.html

Funciones contenidas:
Delay3us()
Delay300us()
DelayMs()

Las pruebas sólo se han hecho a 48MHz y PIC18. Es probable que a velocidades inferiores cambien los tiempos, por favor si alguien obtiene resultados diferentes que nos avise. Gracias.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re: Superdelay.c - Un delay extra para emergencias
« Respuesta #1 en: 17 de Abril de 2010, 16:42:59 »
Me chirrían los dientes al ver un delay dentro de una interrupción.

De todas formas, es muy buena aportación para cuando haga falta. Gracias Santiago.

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Superdelay.c - Un delay extra para emergencias
« Respuesta #2 en: 17 de Abril de 2010, 18:30:05 »
Me chirrían los dientes al ver un delay dentro de una interrupción.

De todas formas, es muy buena aportación para cuando haga falta. Gracias Santiago.

 :D :D De nada.

Me gustaría que hicieran pruebas con otras velocidades y checar qué tanto cambia el tiempo.  :mrgreen:

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Superdelay.c - Un delay extra para emergencias
« Respuesta #3 en: 18 de Abril de 2010, 15:41:00 »
Si usas C18 estudiantil, seguramente no tedrá la mayor optimización  :?

Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Superdelay.c - Un delay extra para emergencias
« Respuesta #4 en: 18 de Abril de 2010, 15:49:47 »
Si usas C18 estudiantil, seguramente no tedrá la mayor optimización  :?

Saludos!

No te entiendo Suky  :shock:  :z)

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Superdelay.c - Un delay extra para emergencias
« Respuesta #5 en: 18 de Abril de 2010, 16:02:35 »
Tengo entendido que esa versión te limita en eso. En configuraciones de proyecto se puede trabajar con las optimizaciones.  :roll: Lei tu cometario de optimización y comenté, no lei el post completo  :oops:  :mrgreen:


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5490
    • Electrónica Didacta
Re: Superdelay.c - Un delay extra para emergencias
« Respuesta #6 en: 18 de Abril de 2010, 16:42:46 »
santi, tengo una duda

Citar
Al compilar los delays de C18 en CCS se ejecutan más rápido

o sea que si tengo un delay de 10 segundos en c18, ¿en ccs correría en menos de 10 segundos?

tengo entendido que el código resultante en c18 sería mas largo que en ccs, pero los 10 segundos deberían ser los mismos.


La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Superdelay.c - Un delay extra para emergencias
« Respuesta #7 en: 18 de Abril de 2010, 18:21:15 »
Hola Pedro

Exacto, si se compila un delay con el mismo código fuente...

- en C18 corre en 10s
- en CCS corre en 3s

Quiero pensar que en CCS se corre más rápido el delay porque la aritmética compilada es mucho más eficiente que la aritmética de C18.

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: Superdelay.c - Un delay extra para emergencias
« Respuesta #8 en: 19 de Abril de 2010, 13:22:52 »
Hola, mi humilde opinion. Como comento Nocturno no es recomendable o buena idea colocar un delay dentro de handler de interrupción. Con respecto a los delays y timers yo pienso que depende de la necesidad de cada proyecto. En mi caso hago lo sgte:

  • Timers, estan implementadas en base a un timer y con una resolucion determinada, del orden de los 10 ms, lo utilizo cuando tengo que esperar eventos asincronicos que no puedo determinar de ante mano cuanto tardaran. Mientras espero que el evento ocurra puedo realizar otras tareas.
  • Delays, en este caso no utlizo timers sino directamente una función en assembler que va variando dependiendo de la frecuencia de cristal, normalmente utilizada para esperar tiempos cortos, del orden de los microsegundos hasta unos pocos milisegundos. Mientras se encuentra ejecutando esta función las interrupciones son habilitadas para que puedan ejecutarse.

Saludos !

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Superdelay.c - Un delay extra para emergencias
« Respuesta #9 en: 19 de Abril de 2010, 14:38:43 »
Hola Richi, sé que ejecutar código largo dentro de una interrupción es programación sucia, pero para un programa que estamos haciendo necesitamos un delay breve dentro de la interrupción y pues esto lo soluciona.

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: Superdelay.c - Un delay extra para emergencias
« Respuesta #10 en: 19 de Abril de 2010, 14:48:40 »
Hola Mig, me parece bien. Igual mas que nada mi post hiba al uso del delay, no puedo entender que dependiendo de que compilador uses tarde mas o menos, en si entiendo, debe estar hecho en C ...

Saludos !


 

anything