Bueno, quise crear este
tema para contarles acerca de mis experiencias con la familia 18F del cual
apenas estoy empezando a conocer, así que les contaré tantos mis aciertos
como mis metidas de patas en el camino de domar a este monstrico, jeje.
- Lo primero que hice fue adaptar mi programador para este PIC, en este
Post
se explica como hice para que mi antiguo programador pudiera grabar el
18F4550 usando el winpic800 de Sisco.
-Lo segundo, meterme de cabeza en la datasheet a ver que cosas nuevas trae
este señor, respecto al anterior 16F877 (del cual vengo) y ¡uff! si que
trae una montaña de características (features), en la página 4 de 39632c.pdf
aparece el diagrama de los pines
![](images/miprimer18f450_01.jpg)
Ya sabemos que el 18F4550 posee 40 pines, bien y por lo que se ve en la
imagen, tiene cierta similitud con el 16F877 (la misma ubicación del pin
Vdd, Vss, MCLR entre otros)
El siguiente paso es saber como trabaja la configuración del oscilador, en
verdad a primera vista con el diagrama del Clock que aparece en la pag 26,
parece complicado, pero no es tan difícil, si se ve como si fuera el juego
del laberinto, se pueden activar los bits de los registros necesarios y
así configurar el oscilador para el cristal que usemos y el tiempo del
ciclo de instrucción.
En la página de RedPic hay un artículo llamado: "Consiguiendo
4 Mhz para los 48 Mhz necesarios en los PIC's con USB 2.0", siguiendo
las instrucciones podemos configurar el CPU del 18F4550 a 48Mhz con solo
seleccionar los word configuration correctos.
Como yo tengo un cristal de 4MHZ, lo usaré para poner a trabajar el CPU a
48MHZ, y ¿porque 48 Mhz? ¡claro! si se puede llegar hasta ahí, ¡entonces a
trabajar al máximo!
![Cool](http://www.todopic.com.ar/foros/smileys/default/icon_cool.gif)
según la elección de mi cristal dibujé el camino a tomar para que la etapa
del oscilador tenga 48Mhz a la entrada del cpu, partiendo de los 4MHZ que
le entran
![](images/miprimer18f450_02.jpg)
Esto es necesario porque
lo primero que debemos tomar en cuenta son los fuses que se van a
usar y la configuración del oscilador forma parte de ello.
para colocar el fuse de configuration y ya que es la primera vez,
tomaré prestado la que he visto en ex_usb_serial2.c que trae de ejemplo el
PCWH
...
/*
//configure a 20MHz crystal to operate at 48MHz
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN
#use delay(clock=48000000)
*/
...
Esto hay que analizarlo,
hay algunos conocidos y otros nuevos (que se van a explicar), así que
vayamos a la pagina 288 de la datasheet y al archivo cabecera 18F4550.h
HSPLL: para cristales >4MHZ usando el PLL, en el código ejemplo
como XTAL=4MHZ -> se cambiará a XTPLL
MCLR: significa que el pin 1 cumplirá la función de Master CLeaR
(¿y como arranca el Pic cuando no hay MCLR?)
USBDIV: significa que el Clock del Usb se tomará del PLL/2, para
nuestro código es irrelevante, ya que no usaremos el módulo USB, pero lo
dejaremos (o es "1" ó es "0")
PLL5: significa que el PLL prescaler dividirá en 5 la
frecuencia del cristal, si uso el cristal de 4 Mhz no habrá falta dividir
por lo que se usará PLL1
CPUDIV1: el PLL postscaler decide la división en 2 de la
frecuencia de salida del PLL de 96MHZ, si queremos 48MHZ, lo dejaremos
como está.
VREGEN: Habilita el regulador de 3.3 volts que usa el módulo USB,
no lo usaremos por los momentos, se cambiará por NOVREGEN
Existen mas fuses para configurar, y habría que determinar como el
compilador configura el resto
Si miran el la pagina 288, notaran que existe mas de un configuration
word (específicamente 7), no como en 16F877 que había solo uno.
Bueno, nuestro fuse quedará así:
#fuses
XTPLL,MCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL1,CPUDIV1,NOVREGEN
Ahora viene escribir un código sencillo para poner arrancar el PIC, el
programita lo que va a hacer es, encender y apagar el PORTB en intervalos
de 1 seg y para ello hay que averiguar como está configurado por defecto
cada pin, me refiero a esto, ya que he manejado un poco el 16F877 y por
ejemplo el pin RB3 siempre hay que configurarlo en el fuse si se va a
utilizar como I/O digital
Al mirar la pagina 293 nos encontramos un fuse peculiar
PBADEN: PORTB A/D Enable
bit
¿Como, el portb tiene funciones de entrada analógica?, pues si, así que
también hay que meter esa opción en el fuse. Vamos hacer una prueba, vamos
a dejar tal cual quedó nuestro fuse, para ver como lo hace el compilador y
lo sabremos cuando carguemos el .hex en el winpic800
Vamos a escribir este código en lenguaje C de CCS (para facilitar el
aprendizaje pero sigo con el dilema si lo hago en C ó en asm, para conocer
mejor al micro) y el simulador será el MPLAB sim (que podemos hacer, hasta
la fecha en que escribí esto el Proteus todavía no trae el 18F4550
![Sad](http://www.todopic.com.ar/foros/smileys/default/icon_sad.gif)
// Código ejemplo para
hacer funcionar por primera vez al 4550 mediante encendido
// y apagado de 8 led´s conectado al PORTB en intervalos de 1 Seg
// 16-Dic-2006
#include <18f4550.h> //archivo de cabecera
#fuses XTPLL,MCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL1,CPUDIV1,NOVREGEN
// el fuse que configuramos anteriormente
#use delay(clock=48000000)
// el clock que tendremos a la entrada del CPU
void main() {
set_tris_a(0x0); // configura
los puertos como salidas
set_tris_b(0x0);
set_tris_c(0x0);
set_tris_d(0x0);
set_tris_e(0x0);
//----------------------------------
disable_interrupts(global);
disable_interrupts(int_timer1);
disable_interrupts(int_rda);
disable_interrupts(int_ext);
disable_interrupts(int_ext1);
disable_interrupts(int_ext2);
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_spi(FALSE);
setup_psp(PSP_DISABLED);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
port_b_pullups(FALSE);
//---------------------------
output_a (0); // saca un nivel bajo de salida en los puertos
output_c (0);
output_d (0);
output_e (0);
while(1){
output_b (0); // saca un nivel
bajo en el portb
delay_ms(1000); // retardo de 1 Seg
output_b (0xff); // saca un nivel
alto en el portb
delay_ms(1000); // retardo de 1 Seg
}
}
Las líneas que están delimitadas, las saqué del código
_rtc.c que escribió RedPic, en estas líneas se desactivan otros
módulos, como por ejemplo el CAD, SPI, PSP, las interrupciones y las
resistencias de amarre que están en el PORTB, para este PIC hay que
averiguar como estan configurados por defectos cada pin y allí veremos si
hace falta habilitar ó deshabilitar ciertos módulos (esto se aplica
también para los fuses).
Esto último lo digo porque el simulador es una cosa y el funcionamiento
real es otra, en el caso de los fuses, nosotros podemos determinar
la configuración porque el winpic800 nos lo dirá, pero en el caso de los
módulos activados o desactivados por defecto, no siempre el simulador
acertará, así que para estar seguros es mejor escribir las configuraciones
en el programa. (la experiencia nos dirá cual son los módulos activados
por defecto).
Bueno, compilemos y simulemos a ver que tal.
![](images/miprimer18f450_03.jpg)
Que bien, nos compiló
exitosamente, vamos a cargar el MPLAB sim y abrimos también la ventana de
los SFR, para ir viendo como están los registros que nos interesa y los
que nos pueden interferir.
Nota: se me pasó por alto, con los pasos que indica el Wizard del MPLAB
crean el proyecto para el código que estamos probando y después configuran
la frecuencia del CPU (los fuses no hacen falta configurarlo,
porque el MPLAB los carga del que ya habíamos programado)
Vamos a ver como quedó el configuration bits
![](images/miprimer18f450_04.jpg)
¡Epa! aquí dice que el
portb tiene algunas entradas analógicas, vamos a ver que dice el temp18.lst
(el listado que genera el compilador)
Configuration Fuses:
Word 1: 0220 XTPLL NOIESO NOFCMEN PLL1 CPUDIV1 USBDIV
Word 2: 1E1E BROWNOUT NOWDT BORV20 PUT WDT32768 NOVREGEN RESERVED
Word 3: 8300 PBADEN CCP2C1 MCLR NOLPT1OSC RESERVED
Word 4: 0081 STVREN NODEBUG NOLVP NOXINST NOICPRT RESERVED
Word 5: C00F NOPROTECT NOCPD NOCPB
Word 6: E00F NOWRT NOWRTD NOWRTC NOWRTB
Word 7: 400F NOEBTR NOEBTRB
Efectivamente está la opción PBADEN, pues ya comprobamos que se
debe colocar NOPBADEN en fuse, si es que queremos que RB[4-0]
funcione como salida digital.
Los fuses quedarán:
#fuses
XTPLL,MCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG, USBDIV,PLL1,CPUDIV1,NOVREGEN,NOPBADEN
Compilamos y vemos nuevamente la ventana configuration bits
![](images/miprimer18f450_05.jpg)
Ahora si nos aparece los pines RB[4-0] como i/o digitales.
Si por ejemplo simulamos con la opción PBADEN, veran como en el portb no
habrá problemas, hará lo que el código le dice, pero cuando vayamos a
probar el PIC, no será así. ¿Se dan cuenta? hay que estar pendiente de
esos detallitos que nos pueden causar dolor de alma.
Viendo los registros PORTB y uno nuevo, el LATB, veran que cambiaran de
estado:
![](images/miprimer18f450_06.jpg)
![](images/miprimer18f450_07.jpg)
En la ventana stopwatch,
se observa que por cada linea ejecutada ocurren mas de un ciclo de reloj,
esto es típico del C, si queremos ver que ocurre en cada ciclo, nada mas
carguemos Disassembly List y veremos el código en C con su correspondiente
asm
![](images/miprimer18f450_08.jpg)
Una vez ya simulado y
verificado, viene la parte crítica, y es la de programar el PIC, montarlo
en el Protoboard y rezar para que funcione,
podemos llegar a 2 resultados:
-Que si funciona y realmente nos llena de alegría y podemos dar el
siguiente paso
![Smile](http://www.todopic.com.ar/foros/smileys/default/icon_smile.gif)
ó
- Que no funciona y hay que volver a revisar todo nuevamente
![Confused](http://www.todopic.com.ar/foros/smileys/default/icon_confused.gif)
La segunda opción es la frecuente y que no nos gusta mucho, pero es la que
nos da paso hacia el conocimiento.
¡Manos a la obra!
video
del primer ejemplo funcionando tililando.wmv
Amigos, de buena suerte que todo ¡¡funcionó al primer arranque!! y es que
se tomaron las previsiones una y otra vez, antes de conectar el PIC,
verifiqué niveles de tensión, posición de los pines, etc.
En realidad con este primer ejemplo lo que se pretende, es aprender a
configurar el oscilador y a configurar los fuses, que es lo básico
a la hora de programar un PIC
En el adjunto está el ejemplo para usarlo en MPLAB y el circuito eléctrico
del montaje en el Protoboard.
------------------------------------------------------------------------------------
Nota: cuando me refiero a la pagina de la datasheet, me remito a la página
que marca el editor de Acrobat
Salu2
Pedro |