PicManía by RedRaven
 

Búsqueda personalizada

 

Mis Primeros Pasos con el PIC 18F4550

 
 

por Pedro PalitroqueZ del Foro TodoPIC

 

 

 
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



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

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

 

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

Código:

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

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

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

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.

Los fuses quedarán:

 

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, Smile  podemos llegar a 2 resultados:

-Que si funciona y realmente nos llena de alegría y podemos dar el siguiente paso  Smile
         ó
- Que no funciona y hay que volver a revisar todo nuevamente  Confused
   
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

 

 

 

Esta página se modificó el 27/12/2008


Esta página usa la letra Ñ

Nota pública importante sobre las consultas al Webmaster de PicManía.


Sugerencias a Picmanía... (que serán leídas pero seguramente no podrán ser contestadas)

Esta página pertenece al grupo de páginas de Diego RedRaven

 

 



Nota: Esta página Web esta repleta de imágenes, textos, logotipos y demás material extraídos de los mas variados medios de los que no soy ni autor ni depositario de los correspondientes derechos de autor, uso y/o reproducción. Si Ud. es depositario de dichos derechos y desea que el material correspondiente sea eliminado de esta Web no dude en ponerse en contacto conmigo mediante e-mail y será inmediatamente retirado. Gracias.
 
Visitas
Totales : 42430 Hoy: 1 Activas: 1 Vistas: 42430

Esta página fue modificada el 07-08-2010 15:42:20

           
 DmSoft WAMP Escribir Unreal