/////////////////////////////////////////////////////////////////
// programa para prender un led y apagarlo cada segundo //
// //
/////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////
///// Created by Uriel //////////////
///// //////////////
/////////////////////////////////////////////////////////////////
#include <18F4550.h>
#Fuses HS, NOWDT, NOPROTECT, NOLVP, NODEBUG, USBDIV, PLL1, CPUDIV1, VREGEN
#use delay(clock=4000000)
void main()
{
DO{
// enciende led conectado a RB1
output_high(PIN_A1);
delay_ms(250);
output_low(PIN_B5); // enciende led conectado a RB1
delay_ms(10);
if(input(PIN_B4)==0){
output_low(PIN_B1);
}else{
output_high(PIN_B1);
}
output_low(PIN_A1);
delay_ms(250);
}
while (TRUE);
}
/////////////////////////////////////////////////////////////////
Fuses HS le dice al compilador que es un cristal mayor a 4 Mhz, en tu caso deberas poner Fuses XT.
Por otro lado, debes declararle la velocidad de trabajo interno tambien, aqui tienes una nota de CCS al respecto:
https://www.ccsinfo.com/newsdesk_info.php?newsPath=ALL&newsdesk_id=164 (https://www.ccsinfo.com/newsdesk_info.php?newsPath=ALL&newsdesk_id=164)
Hola,
si te lees el Datasheet del Pic, podrás encontrar que internamente el micro no trabaja a la frecuencia real del oscilador, sino que trabaja a Fclk = Fosc/4 eso significa que realmente tienes un clock de 1Mhz cuando trabajas con el Osc de 4MHz.
Entonces donde defines la frecuencia del CLK debes poner 1000000; #use delay(clock=1000000). Así ahora el tiempo que buscas se ajustara al del retardo.
Espero que te sirva.
Un Saludo.
Zivit.
Una aclaración, usas el B4 como entrada y el B1, B5 y A5 como salida?
¿Cómo es la función delay_ms() que utilizas?
¿Qué versión de CCS C usas? porque dependiendo de la versión puede ser que tengas que variar el contenido del #use delay()
Yo, por ejemplo, en un proyecto que estoy haciendo con un 18F46K22 y el CCS C V.5.023 haciendo uso del oscilador interno tuve que ponerCódigo: CSS
#use delay(clock=16000000,internal=16000000)
Y en otro proyecto con la misma versión del CCS C pero con un 18F2550 pero con Cristal Externo de 20 Mhz tuve que utilizar esto para que me contase en condicionesCódigo: CSS
#use delay(clock=20000000,Crystal=20000000)
En caso contrario no me iban bien los Timers o el cálculo de los baudios de la USART. :shock:
Estás verificando el funcionamiento en un circuito montado realmente o en un simulador ?
Si utilizas Proteus pudiera ser que no tuvieras bien configurado el oscilador en las propiedades del micro,
me induce a pensar en ello el hecho que comentas de que quitándole el cristal también te funciona.
Saludos
El pic tiene una salida del clock interno, en la pata CLKO, prueba a configurarla para que saque el clock, pincha con un osciloscopio y mira que frecuencia te da. Así comprobaras si realmente funciona bien el oscilador. Luego respecto a la función delay(ms), si quieres te la puedes hacer tu mismo, si sabes la frecuencia del reloj, sabes cuanto dura una instrucción, simplemente tienes que hacer una espera de tantas instrucciones (calculas con la formulita). Luego la compruebas con un simulador y calibras el numero de instrucciones para que te clave los ms que le indiques.
También lo puedes calibrar en un timer. Al fin y al cabo un delay provoca la retención del hilo del programa y te puede traer complicaciones si usas WDT ademas de desperdiciar recursos.
No se que tanto afecta a los módulos RF, supongo que te tendrás que comunicar por USART o por otro método con estos, entonces influiría el clock sobre el baudrate, tendrías que saber exactamente a que frecuencia va el CLK.
Mi consejo es que todas las librerías que te puedas ahorrar, ahorratelas picando código a mano, así luego cuando sigas el programa en depuración sabes exactamente que querías hacer, que esta haciendo y si se ajusta a lo que quieres.
Un saludo.
Zivit
Funciona igualmente aún sin oscilador porque evidentemente está habilitado el FUSE IESO, que al no detectar cristal externo o detectar un error en el mísmo, cambia al oscilador interno automáticamente.
Saludosl
#FUSES NOIESO
Creería que es porque el microcontrolador está oscilando a una frecuencia distinta a la deseada.
Pudiste probar el fuse NOIESO?
Saludos