Sunteți pe pagina 1din 6

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 fué 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

ya sabemos que el 18F4550 posee 40 pines, bién 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 dificil, 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! 

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
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

Código:
...

/*
  //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: signfica 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 4MHZ 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í:


Código:
#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

Código:
PBADEN: PORTB A/D Enable bit

¿como, el portb tiene funciones de entrada analogica?, pues sip, así que también hay que meter esa opcíon 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 ()

Código:
// código ejemplo para hacer funcionar por primera vez al PIC18F4550 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 lineas que estan delimitadas, las saqué del código _rtc.c  que escribió RedPic, en estas lineas se desactivan
otros modulos, como por ejemplo el CAD, SPI, PSP, las interrupciones y las resistencias de amarre que estan
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 modulos (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 modulos
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.

que bién nos compiló exitosamente, vamos a cargar el MPLAB sim y abrimos también la ventana de los SFR,
para ir viendo como estan 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 habiamos programado)

vamos a ver como quedó el configuration bits

¡epa! aquí dice que el portb tiene algunas entradas analogicas, vamos a ver que dice el temp18.lst (el listado
que genera el compilador)

Código:
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.

el fuses quedará:

Código:
#fuses
XTPLL,MCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL1,CPUDIV1,NOVREGEN,NOPBADEN

compilamos y vemos nuevamente la ventana configuration bits

 
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:
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

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 
         ó
- Que no funciona y hay que volver a revisar todo nuevamente 
   
la segunda opción es la frecuente y que no nos gusta mucho, pero es la que nos dá paso hacia el conocimiento.
¡Manos a la obra!

videito del primer ejemplo funcionandotililando.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

S-ar putea să vă placă și