TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Enigma en 27 de Diciembre de 2007, 00:16:49
-
Hola, otra vez yo con mis coflictos en C del CCs y el pic 18F4550, es que estoy tratando de configurar el POR , el BOR y WDT... entre a los fuses y vi unos de estos para declararlos, también revise el datasheet del pic y pues vi que si le coloco 01 al registro RCON en los bits de SBOREN se activa el BOR... pero, lo que no entiendo es como configurar el registro, es decir, en ASM se que le muevo un valor a W y de alli al registro... pero en C, no se como hacerlo.... Ayudenme please!
Atte: Enigma... La llanerita de Guayana :-/
-
He hecho esto investigando en el CCS, es con 18F4550... Pero No se como declarar el POR y el BOR:
switch(restart_cause())
{
case WDT_TIMEOUT:
{
output_d(0x7F);
break;
}
case NORMAL_POWER_UP:
{
output_d(0x01);
break;
}
case MCLR_FROM_RUN:
{
output_d(0x7F);
break;
}
}
setup_wdt(WDT_ON);
while(TRUE)
{
restart_wdt();
//perform_activity();
}
}
Cuando se desborda el WDT (creo que es por el WDT que se resetea el micro), pues lo según lo que le puse allá arriba deberia mandar un ocho a el display y pues no lo hace, igualmente cuando le doy MCLR manual... No lo hace, es como si no leyera la sentencia de la instrucción.... además, el WDT tarda mucho y cuando se reseta solo se apaga y ya... como puedo controlar el tiempo de desbordamiento del perro guardian...??.... Si alguién sabe, ayudeme por fa!!!
El Normal Power UP es el POR????? :?
Atte: Enigma... La llanerita de Guayana :-/
-
¿Has probado el "Project Wizard" de CCS?
Ahí puedes establecer la configuración de tu micro de manera visual y muy inteligible, y el wizard creará automáticamente el código necesario en CCS.
Lo que estás preguntando es cómo se establecen los fuses en CCS, y se hace así:
#FUSES WDT
#FUSES BROWNOUT
#FUSES BORV20
#FUSES PUT
Para establecer el tiempo del WatchDog, tienes el comando setup_wdt (mode). Mira sus opciones en la ayuda.
Y para asignar valores a un registro "a pelo", siempre puedes hacerlo como te dije el otro día:
#byte RCON=0xFD0
RCON=0x01;
-
Hola que tal.... Ya busque en la yuda, y sólo me aparece WDT_ON, WDT_OFF para los pics de la serio 18... no aparece nada de como colocarle el tiempo al perro guardia....
La otra vez hice eso: (#byte RCON=0xFD0 - RCON=0x01;) y el complilador me daba la libreria como error.... y no se porque....
Aja una pregunta cuando yo declaro el BOR, no tengo que poner más nada.... sólo un potenciometro a la alimentación del pic...??? y como sabe el micro que se está reseteando por BOR...????
Atte: Enigma... La llanerita de Guayana :?
-
Eso es porque a los PIC de la serie 18 se les configura el Watchdog mediante fuses:
WDT1 Watch Dog Timer uses 1:1 Postscale
WDT2 Watch Dog Timer uses 1:2 Postscale
WDT4 Watch Dog Timer uses 1:4 Postscale
WDT8 Watch Dog Timer uses 1:8 Postscale
WDT16 Watch Dog Timer uses 1:16 Postscale
WDT32 Watch Dog Timer uses 1:32 Postscale
WDT64 Watch Dog Timer uses 1:64 Postscale
WDT128 Watch Dog Timer uses 1:128 Postscale
WDT Watch Dog Timer
NOWDT No Watch Dog Timer
¿Cuál es el error que te tira el compilador al utilizar RCON?
-
Ummm.... Bueno ya no me está dando error, ha de ser que tenia un error de escritura.... Pero tengo un problemita, O.k, habilite el BOR con los FUSES y el registro RCON, pues escribi en el para habilitar el RCON, pero hay un detalle, el bit 6 de este registro es SBOREN, el cual hay que ponerle un valor a sus dos bits que son BOREN0:BOREN1 del 01 al 11, esto para habilitar el BOR verdaderamente por así decirlo... Todo chevere por ahí, la cuestión es que como habilito estos bits via, software, me he leido el datasheet en está parte y bueno no me ayuda, sólo me sale para que sirven y todo eso... intente colocarlo asi: BOREN1:BOREN0=01; y pues me dice que BOREN0 está desconocido.... no se si eso es #byte por pertenecer a un registro o es un fuses.... pero estoy tirando flechas y pos nada!!!
Todo eso añadiendo, que se me sigue reseteando el WDT al tiempo que quiero, pero igualito no me muestra en pantalla el mensaje que quiero que muestre cuando se resetee... Ya he intentado de todo con mis pocos conocimientos... pero nada de nada! :?
Atte: Enigma... La llanerita de Guayana :?
-
A ver si te sirve esto:
Para configurar el BOR tienes estos fuses:
BROWNOUT_NOSL Brownout enabled during operation, disabled during SLEEP
BROWNOUT_SW Brownout controlled by configuration bit in special file register
NOBROWNOUT No brownout reset
BROWNOUT Reset when brownout detected
Y luego, si quieres jugar con SBOREN:
#byte RCON=0xFD0
#bit SBOREN=RCON.6
Y luego:
SBOREN=0
o
SBOREN=1
-
Ya a ver si entendi.. O.k tengo activado el fuses BROWNOUT Reset when brownout detected....
Pero miren esto:
BIT 6 SBOREN: Bit activador de reset por BOR
(En un reset SBOREN=1)
Si BOREN1:BOREN0=01
1=BOR activo
0=BOR desactivado
Si BOREN1:BOREN0=00, 10 ó 11
Bit desactivado, se lee 0
TABLA 4-1: CONFIGURACIÓN DEL BOR
Configuración del BOR Estado de
BOREN1 BOREN0 SBOREN Operaciones del BOR
(RCON<6>)
0 0 No disponible BOR desactivado; para activarlo reprogramar el bit de configuración
0 1 Disponible BOR activo en software; se controlan las operaciones por SBOREN. 1 0 No disponible BOR activo en hardware en los modos RUN e IDLE, desactivado en el modo SLEEP
1 1 No disponible BOR activo en hardware; para desactivarlo reprogramar el bit de configuración.
Esto lo saque del datasheet....
Ahora, no se si soy yo que ya tengo el cerebro obstruido (es lo más seguro) :( o no estoy razonando como se debe.... Me dices que con esto:
#byte RCON=0xFD0
#bit SBOREN=RCON.6
Le puedo colocar a SBOREN0=1 y a SBOREN1=0... Para así lograr colocar la combinaci´pn que quiero???
Ahora otra pregunta:
Para asignarle un valor a un solo bit de un registro... Por ejemplo siguiendo con el mismo RCON, si quisiera asignarle 0 al IPEN para desabilitar la prioridad, lo haría así como me mostraste...
#byte RCON=0xFD0
#bit IPEN=RCON.7
IPEN=0;.. ? es correcto hacer eso....??? :o
Atte: Enigma... La llanerita de Guayana :?
Disculpoen la ladilla!!!
-
Ya a ver si entendi.. O.k tengo activado el fuses BROWNOUT Reset when brownout detected....
Pero miren esto:
BIT 6 SBOREN: Bit activador de reset por BOR
(En un reset SBOREN=1)
Si BOREN1:BOREN0=01
1=BOR activo
0=BOR desactivado
Si BOREN1:BOREN0=00, 10 ó 11
Bit desactivado, se lee 0
TABLA 4-1: CONFIGURACIÓN DEL BOR
Configuración del BOR Estado de
BOREN1 BOREN0 SBOREN Operaciones del BOR
(RCON<6>)
0 0 No disponible BOR desactivado; para activarlo reprogramar el bit de configuración
0 1 Disponible BOR activo en software; se controlan las operaciones por SBOREN. 1 0 No disponible BOR activo en hardware en los modos RUN e IDLE, desactivado en el modo SLEEP
1 1 No disponible BOR activo en hardware; para desactivarlo reprogramar el bit de configuración.
Esto lo saque del datasheet....
Ahora, no se si soy yo que ya tengo el cerebro obstruido (es lo más seguro) :( o no estoy razonando como se debe.... Me dices que con esto:
#byte RCON=0xFD0
#bit SBOREN=RCON.6
Le puedo colocar a SBOREN0=1 y a SBOREN1=0... Para así lograr colocar la combinaci´pn que quiero???
Sí
Ahora otra pregunta:
Para asignarle un valor a un solo bit de un registro... Por ejemplo siguiendo con el mismo RCON, si quisiera asignarle 0 al IPEN para desabilitar la prioridad, lo haría así como me mostraste...
#byte RCON=0xFD0
#bit IPEN=RCON.7
IPEN=0;.. ? es correcto hacer eso....??? :o
Sí
-
Umm... o.k... voy a probar a ver... ahorita aviso los resultados!!!! :D
Atte: Enigma... La llanerita de Guayana :(
-
Bueno ya probe.... :(
#include <18f4550.h>
#fuses XT,WDT,NOPROTECT,NOCPD,NOLVP,VREGEN,NOPBADEN,INTRC_IO,MCLR,BROWNOUT,BORV20
#use fast_io (A)
#use fast_io (B)
#use fast_io (C)
#use fast_io (D)
#use delay(clock=4000000)
#byte RCON=0xFD0
#bit SBOREN=RCON.6
#bit IPEN=RCON.7
void main(void)
{
IPEN=0;
SBOREN0=1;
SBOREN1=0;
enable_interrupts(int_ext); // Activa máscara INTE
enable_interrupts(int_ext1);
ext_int_edge (H_TO_L); // Flag INTF si flanco de bajada.
ext_int_edge(1,H_TO_L);
enable_interrupts(global); //Habilita máscara global de int.
set_tris_b (0xFF); // Configura puerto b como entrada
set_tris_d (0x00); // Configura puerto d como salida
set_tris_a (0xF0); // Configura los pines RA6 - RA4 como entradas y RA3 - RA0 como salidas
set_tris_c (0x00); // Configura puerto c como salida
output_c (0x00); // Limpio el puerto C
output_b (0x00); // Limpio el puerto B
output_d (0x00); // Limpio el puerto d
output_a (0x00); // Limpio el puerto A
2 Errores:
Undefined Indentifier SBOREN1
Undefined Indentifier SBOREN0....... siempre me dan estos errores!!!!
No se si es algo que no estoy viendo!!!!
Atte: Enigma... La llanerita de Guayana :(
-
SBOREN0=1;
SBOREN1=0;
te aparece el error, porque estas variables no las estas definiendo nunca, la que has definido es esta:
#bit SBOREN=RCON.6
pero no hay el SBOREN0 y SBOREN1 definidos, y si no me equivoco lo que tu pretendes hacer es activar alguno de ellos:
BROWNOUT_NOSL,BROWNOUT_SW,NOBROWNOUT,BROWNOUT
este lo defines en los fuses, y de acuerdo a como o configures funcionara como en la hoja de datos:
BOREN1:BOREN0: Brown-out Reset Enable bits
11 =Brown-out Reset enabled in hardware only (SBOREN is disabled)
10 =Brown-out Reset enabled in hardware only and disabled in Sleep mode (SBOREN is disabled)
01 =Brown-out Reset enabled and controlled by software (SBOREN is enabled)
00 =Brown-out Reset disabled in hardware and software
pero esto se hace solamente en los fuses, ya que son los bits de configuracion, y creo que no se pueden cambiar mas por software, solo se programan una vez al grabar el programa en el micro
ahora, si configuras como BROWNOUT_SW (en vez de BROWNOUT) en los fuses
ahi si puedes manejar el
SBOREN=0
ó
SBOREN=1
para activar o desactivar el brown out reset por software
creo que eso es lo que pretendes, bueno, ahi pruebalo
un saludo
-
Exacto, Cryn te lo ha explicado estupendamente.
De todas formas, llanerita, creo que sigues pensando en ASM y CCS es mucho más sencillo.
Sólo tienes que activar/desactivar los fuses que necesites y utilizar las funciones de alto nivel que proporciona:
setup_wdt();
setup_oscillator();
...
-
Ahhh..... Coooo!!!! ahora si entendi!!! jajaja! :mrgreen: Ya no me da error!!! es que no sabia de esto que BROWNOUT_NOSL,BROWNOUT_SW,NOBROWNOUT,BROWNOUT correspondian a los 00, 01, 10, 11.... jijijiji :Ddonde salia eso??
Si ya entendi fino....
Una pregunta más... El POR y el BOR no se pueden simular en Proteus verdad?? es que como el pic que sale allí pues no se alimenta como en la vida real....??
Atte: Enigma... La llanerita de Guayana :D
-
si, no creo q pueda simularse, ya que la alimentacion es asi como tu dices, talvez si se hace alguna movida, nose, jeje
todo eso BROWNOUT_NOSL,BROWNOUT_SW,NOBROWNOUT,BROWNOUT esta en el archivo.h qeu te dije, en la carpeta DEVICES del ccs
un saludo, feliz año
-
Ahhh.... O.k... jejeje me lo imaginaba, lo de la simulación... Gracias por su amable colaboración... Son lo máximo....
Ahora voy con la causa del reset, para lograr mostrarla... Rayos! este programa ya me tiene sin dormir como dos dias!!!!
Que dificil es programar en un lenguaje nuevo! a ver como me va... :(
Atte: Enigma... La llanerita de Guayana :-)
-
También puedes ver todos los fuses de manera muy cómoda en el menú "Valid Fuses" de CCS.
Para ver el motivo del reset sólo tienes que declarar el registro RCON como te dije antes y examinar sus bits. Si quieres, incluso puedes declarar cada bit individualmente. Un ejemplo:
#byte RCON=0xFD0
#bit _TO=RCON.3
if (_TO)
printf ("El Reset fue provocado por WatchDog Time Out");
-
Si bueno, esa seria otra buena manera, la voy a probar porque lo estoy haciendo por los casos (la rutina en el primer mensaje) y pues no funciona nada.... se resetea a los 2 min, pero solo se apaga y ya, sin mostrar la causa del reset, es como si no le hiciera caso a la sentencia o no se,,,, :o ya me duele la cabeza de tanto pensar, leer, pon aquí, quita allá, prueba aquí, bloquea alla!!! Dios!!! :lol:
Atte: Enigma... La llanerita de Guayana :(