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:
void DelayMs(int16 n)
{
while(n--)
{
Delay300us(3);
Delay3us(34);
}
}Una vez compilada, el analizador muestra que se ejecuta en 1ms exactamente

Un ejemplo con código y tiempos...
/*
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.htmlFunciones 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.