Autor Tema: Mis primeros pasos con el 18F4550  (Leído 169727 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
Mis primeros pasos con el 18F4550
« en: 18 de Diciembre de 2006, 12:45:04 »
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!  8)

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: [Seleccionar]
...

/*
  //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: [Seleccionar]
#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: [Seleccionar]
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: [Seleccionar]
// 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: [Seleccionar]
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: [Seleccionar]
#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


Salu2
Pedro


PD: Algún moderador que pueda hacer el favor de mover este post a la sección: Primeros pasos-Iniciación a los Microcontroladores. mil disculpas Gracias.
« Última modificación: 18 de Diciembre de 2006, 13:26:55 por PalitroqueZ »
La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: Mis primeros pasos con el 18F4550
« Respuesta #1 en: 18 de Diciembre de 2006, 18:15:43 »
Amigo PalitroqueZ, tres cosas, tres.

1º.- Felicidades por adoptar como hijo propio al pequeño gran monstruo que es el 18F4550, desde que lo ví me enamoré de él.  :mrgreen:
2º.- Felicidades por tu magnifico artículo, "t'á quedao bordao".  :mrgreen:
3º.- Te pido oficialmente permiso para clonarlo en la sección Artistas Invitados de PicManía by Redraven bajo tu mismo título y con sus correspondientes créditos de autoría y meritaje.  :mrgreen:

Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
Re: Mis primeros pasos con el 18F4550
« Respuesta #2 en: 19 de Diciembre de 2006, 11:57:15 »
Hola RedPic, si puedes publicarlo en tu web, mas bién te doy las gracias  :). Mucha de la información que tienes allí vale oro, oro en conocimiento que generosamente compartes con cualquiera que tenga ganas de aprender. 

Salu2
Pedro
La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: Mis primeros pasos con el 18F4550
« Respuesta #3 en: 19 de Diciembre de 2006, 17:22:09 »
Ea, ya estás entre mis Artistas Invitados   :mrgreen:

Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado todopic

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3495
    • http://www.todopicelectronica.com.ar
Re: Mis primeros pasos con el 18F4550
« Respuesta #4 en: 19 de Diciembre de 2006, 17:41:47 »
je je je... como lo vamos a mover!!!, esto no es una iniciacion!!!  :-/ :D

Un gran abrazo PalitroqueZ !
Firmat - Santa Fe - Argentina

www.TodoPic.net

Solo se tiran piedras, al arbol que tiene frutos...

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: Mis primeros pasos con el 18F4550
« Respuesta #5 en: 19 de Diciembre de 2006, 17:44:47 »
Ja, ja, ja  :D :D :D empezar con los fuses y acabar con los nervios de un principiante ja ja ja  :D :D :D

Tiene razón Norberto, amigo PalitroqueZ tu artículo es perfecto para comprender, no para empezar.  :mrgreen:

Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
Re: Mis primeros pasos con el 18F4550
« Respuesta #6 en: 21 de Diciembre de 2006, 15:53:59 »
Ok, me confundí porque el título se parece al post sobre iniciación.

Vamos con el segundo ejemplo. Quedaron 2 dudas al aire, el MCLR y el nuevo Registro de Funciones eSpeciales LATx. Vamos a tratar primero lo del MCLR.

donde busquen en la datasheet el MCLR, veran que hay una opción para desactivarlo (es es que si empieza desde el propio fuse) y lo que se me ocurre es que el pic puede trabajar sin el Master CLeaR, sin los 5 voltios reglamentarios y que si queremos hacer un reset, será por software, cuya instrucción existe (se llama RESET)

si ven en la pág 126 veran que RE3 solo puede funcionar como entrada digital, así que tendremos que pegar un switch si queremos probarlo, (y vamos a colocarlo para que sea un cero en condiciones iniciales).

voy a modificar un poco el ejemplo1, cambio el fuse a NOMCLR (y automaticamente el pin RE3 <- entrada) de manera que si lee un pulso alto se enciendan los led´s del portb y si lee un pulso bajo se activan los led´s del portc.

otro detalle, leyendo la configuración del portc, me encuentro con que no existe RC3 y eso no es todo, RC4 y RC5 solo funcionan como entrada digital, parece que es el precio a pagar por implementar nuevos modulos(ver pag 119)







vaya, vaya, como haremos. Bueno lo que se puede hacer es usar el resto de los pines que si funcionan como salida digital. RC[7-6,2-0]

Código: [Seleccionar]
// código ejemplo para hacer funcionar por segunda vez al PIC18F4550 mediante encendido
// y apagado de 8 led´s conectado al PORTB y RE3 en intervalos de 1 Seg  (sin usar el MCLR)
// 20-Dic-2006

#include <18f4550.h> //archivo de cabecera
#fuses XTPLL,NOMCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL1,CPUDIV1,NOVREGEN,NOPBADEN
#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);  // RE3 <- entrada no hace falta configurarlo (ver note1 pag126)
//-----------------------------------
   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_b (0); // saca un nivel bajo en el portb
output_c (0);
output_d (0);
output_e (0);
while(1){
if(input_state(PIN_E3)){
output_b (0); // saca un nivel bajo en el portb
output_c (0);
    delay_ms(1000);   // retardo  de 1 Seg
output_b (0xff); // saca un nivel alto en el portb
delay_ms(1000);   
}
else{
output_b (0); // saca un nivel bajo en el portb
output_c (0);
delay_ms(1000);   
output_c (0xff);
delay_ms(1000);   
}
}
}

en los pines no usados del portc, del ejemplo1, no le dimos importancia, pero RC[5-4] estaban como entrada digital (según el MPLAB el módulo USB está deshabilitado por defecto) y no nos dimos cuenta y dejamos esos pines al aire, para resolver esto, coloqué unas resistencias de 1k a VSS




después de compilar exitosamente (gracias Dios, jeje) y verificar los fuses veremos en la simulación en MPLAB a ver que pinta tiene:

Simulación en MPLAB

yo creo que no importa si limpiamos el TRISC, porque de todas manera RC[5-4] quedaran como entradas, observen que en la simulación aparecen esos pines como salidas activandose (aunque el LATC aparece RC[5-3]<-0 ¿raro no?), ya hice la prueba y no encienden los led´s para esos pines.

nota: el circuito para este ejemplo está en el adjunto, en el circuito del ejemplo1 omití un componente que había puesto en el protoboard, es un condensador de 100nF entre VDD y VSS, tal como lo recomienda Nocturno en este post.


nota: ocasionalmente el MPLAB v7.43.00 que uso, a veces se cierra al tratar de abrir una ventana.  :?

el montaje funcionando:

Montaje en protoboard

el objetivo de este ejemplo fué el como trabajar el pin 1 del pic 18F4550 y los detalles que trae el portc.

Salu2
Pedro
« Última modificación: 30 de Octubre de 2007, 18:39:24 por PalitroqueZ »
La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
Re: Mis primeros pasos con el 18F4550
« Respuesta #7 en: 02 de Enero de 2007, 13:50:19 »
Hola Amigos.

Vamos con el otro que quedó pendiente, me refiero al LATx. Aquí en el foro se ha hablado varias veces sobre este registro de funciones especiales (SFR), también se puede conseguir en la web de la microchip, así que lo que que diré es una recopilación de lo pude entender de las fuentes consultadas.

los link de referencia:

¿Qué diferencia hay entre usar PORTX y LATX en los picotes de la serie 18?
Ayuda con pic18f2220
Conversor AD , tan fácil y a la vez tan difícil
Tutorial para PIC18

Microchip:
read-modify-write and peripheral port usage
PORTx or LATx... read-modify-write

PICmicro® 18C MCU Family Reference Manual pagina 207,211 (39500a.pdf pagina 211)

-¿Qué es eso de LATA, LATB,..?- si miran en la página 71 de 39632c.pdf, tenemos del LATA-LATE. La segunda que vemos el LAT es en la página 113 y ya empiezan a especifcar su funcionamiento, el LAT significa output latch ó salida del latch, si comparamos una salida de este pic con uno del 16F877




la diferencia principal que se ve allí es el buffer RD LAT cuya función es leer el estado de la salida del LAT (¿que función puede tener el leer la salida del LAT?) y WRLAT or PORT en el clock, bueno amigos como el datasheet no dá mayores explicaciones porque dice que puede ser cualquiera de los 2. Puedo escribir en el pin usando LATx,pin ó PORTB. Así que consultando los links de arriba, todos coinciden: el registro existe por cuestiones de rapidez al cambiar un flanco en un pin.

yo recuerdo que para evitar escrituras erroneas en la familia 16F manejando bit´s se recomienda colocar un nop entre pines:

Código: [Seleccionar]
bsf porta,0
nop
bsf porta,1

obviamente que la existencia del registro LATx es una mejora ya que en un ciclo de instrucción garantizas la escritura en un pin del puerto, pero esto habría que comprobarlo con un ejemplo

quería pegar este código en ensamblador pero dentro de entorno c

Código: [Seleccionar]
#asm
 bsf PORTB,0,1
 bsf PORTB,1,1
 #endasm
pero sospecho que el pcwh, mete sus narices aún en asm, porque en la ayuda del ccs, dice:

Código: [Seleccionar]
BSF f,b
cuando en realidad la instrucción es:

Código: [Seleccionar]
BSF  f,b,a

donde a es un operando que tiene que ver con el tipo de acceso al banco de memoria RAM (bueno, ¿pero no se supone que la memoria RAM es lineal?), esa duda la dejaremos pendiente por los momentos.

entonces lo mejor es ensamblar desde el mpasmwin y ya que vamos a usar el 100%  ensamblador, es bueno saber saber la configuración de los puertos, para ello veremos la inicialización de los puertos que salen a partir de la pag 113 (corresponde al capítulo 10 I/O PORTS) y en la plantilla 4550temp.asm que está en la carpeta code dentro de MPASM Suite

el archivo "hlpPIC18ConfigSet.chm" enseña como configurar los fuses

una nota curiosa vean la dirección señalada (viendo el listado en asm generado por el CCS del ejemplo2)



así será de fea la programación en asm para los 18F que el propio MPLAB me lo dice, jaja

pero volviendo en serio, aquí vamos a tener que repetir un poco el ejemplo1, configurar los fuses que ya no se llamaran fuses, sino word configuration, configuratión bits. (ver pag287)

La directiva de configuración de palabras se puede escribir CONFIG y seguido los bits involucrados (en 16F se escribe __CONFIG xx & yy &..) para mayor comodidad se puede escribir CONFIG CP = OFF, OSC = LP,..

tomando el fuse del ejemplo1 nuestra palabra de configuración quedará así:
 
Código: [Seleccionar]
CONFIG FOSC = XTPLL_XT, PLLDIV = 1,CPUDIV = OSC1_PLL2,USBDIV = 2,PWRT = ON,BOR = SOFT, VREGEN = OFF , WDT = OFF ,WDTPS = 1,MCLRE = ON,PBADEN = OFF
    CONFIG LVP = OFF,XINST = OFF,DEBUG = OFF

aquí hay que escribirlos toditos, porque no se sabe como estan por defectos, pero sin complicar mucho la explicación lo que se hizo fué ver como el CCS configuraba los 7 word y llevarlos al asm, y eso fué lo que está arriba.

este ejemplo3 hará lo siguiente:
-RB0 es un switche (normalmente en "0")
-si hay un cero en RB0-> se encenderan los led´s de RB[6,4,2]
-si hay un "1" en RB0-> se encenderan los led´s de RB[7,5,3,1]
-en cada caso se apagaran los led´s no mencionados

para la escritura del PORTB, primero se utilizará el clásico PORTB, a ver que sucede y después el LATB

Código: [Seleccionar]
; código ejemplo para hacer funcionar por tercera vez al PIC18F4550 mediante encendido
; y apagado de 8 led´s conectado al PORTB dependiendo del estado del pulsador en RB0
; que encenderá led´s pares e impares
; 21-Dic-2006

 LIST P=18F4550 ;directive to define processor
 #include <P18F4550.INC> ;processor specific variable definitions

;#fuses XTPLL,MCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL1,CPUDIV1,NOVREGEN,NOPBADEN // el fuse que configuramos anteriormente (CORREGIDO)
;#use delay(clock=48000000) // el clock que tendremos a la entrada del CPU

    CONFIG FOSC = XTPLL_XT, PLLDIV = 1,CPUDIV = OSC1_PLL2,USBDIV = 2,PWRT = ON,BOR = SOFT, VREGEN = OFF
CONFIG WDT = OFF ,WDTPS = 1,MCLRE = ON,PBADEN = OFF,LVP = OFF,XINST = OFF,DEBUG = OFF

 CBLOCK 0x0

 ENDC

 org 0
 goto inicio
;org 0x8 interrup alta priori
;org 0x18  baja prioridad
inicio:
;clrf LATA ; limpia los latch
;clrf LATB
;clrf LATC
;clrf LATD
;clrf LATE
    clrf TRISA  ; configuar el port como salida  ¡que bueno!, no hay que estar cambiando de bancos ;-)
 movlw 0x1
 movwf TRISB ; configura RB0<- entrada, el resto -> salida
    clrf TRISC
    clrf TRISD
    clrf TRISE
;//------------------------------------------------------
; ahora viene la deshabilitación de modulos (pheriperals)
;*******************************************************
 clrf,ADCON0 ; desactiva el CAD
 movlw 0xf
 movwf ADCON1 ; todas digitales
 bcf INTCON,GIE ; desactiva interrupciones
 movlw 0x7
 movwf CMCON ;desactiva el modulo comparador
 ;clrf CVRCON ; desactiva el Vref del comparador no hace falta
 clrf SPPCON ; desactiva el modulo Streaming Parallel Port (SPP)
 clrf SSPCON1 ; desactiva el modulo MSSP,SSPEN
 bcf UCON,USBEN ; desactiva el modulo USB
 bsf INTCON2,RBPU ; desactiva las resistencias de amarre en PORTB
   ;disable_interrupts(global);
   ;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);   

ciclo:
 btfss PORTB,0
 bra LED_RB2
 bcf PORTB,2,1
 bcf PORTB,4,1
 bcf PORTB,6,1

 bsf PORTB,1,1
 bsf PORTB,3,1
 bsf PORTB,5,1
 bsf PORTB,7,1
 bra ciclo
LED_RB2:
 bcf PORTB,1,1
 bcf PORTB,3,1
 bcf PORTB,5,1
 bcf PORTB,7,1

 bsf PORTB,2,1
 bsf PORTB,4,1
 bsf PORTB,6,1
 bra ciclo
end


como pueden ver, en este código se va a comprobar que pasa si usamos la instrucción PORTB para manejar datos de salida y LATx
 
notas:
-por darmelas de vivo, traté de configurar el TRISB, así:
Código: [Seleccionar]
movff 0x1,TRISB
pero no sirve, porque para esa instrucción los argumentos deben ser registros en ambos (ver pagina 334), nos vamos por el tradicional registro de trabajo, (que ahora se llama WREG)

-hay otra instrucción nueva el BRA, suena al salto que se utiliza en BASIC (que sería BRANCH) y ¿porque no usamos el goto? bueno también sirve, una diferencia que leí, es que el goto puede saltar mas lejos, para nuestro ejemplo el BRA sirve, lo dejaremos.

ahora compilaremos el ejemplo3 y simularemos con el MPLAB (mirar con atención la ventana de la derecha, es la de Registros Funciones eSpeciales):

simulacion2.wmv


el warning se debe a que la instrucción limpia un registro de solo 6 bits, los menos significativos, pero no hay rollo.
en la simulación vemos que ningún pin del puertoB cambia, ni el LATB, pero como yo soy necio, voy a grabar ese mismo código en el pic, haber que hace.

nota:
-la palabra de configuración la comparé con el del ejemplo1, e hice un cambio el BOR=ON
el watchdog, aunque cambió, no altera el programa

el video en protoboard:

ejemplo3_1.wmv

¡Qué! ¿y porque se quedan prendidos esos 3? vamonos a revisar el código, parece que hay un error en las instrucciones B(s/c)F, especificamente en el último argumento, yo les puse "1".

Ese argumento tiene que ver con el acceso al banco de memoria, si vemos un momento el
listado que genera el dissasembler:

Código: [Seleccionar]
...
  0004    6A92     CLRF 0xf92, ACCESS             29:        clrf TRISA  ; configuar el port como salida  ¡que bueno!, no hay que estar cambiando de bancos ;-)
  0006    0E01     MOVLW 0x1                      30:    movlw 0x1
  0008    6E93     MOVWF 0xf93, ACCESS            31:    movwf TRISB ; configura RB0<- entrada, el resto -> salida
  000A    6A94     CLRF 0xf94, ACCESS             32:        clrf TRISC
  000C    6A95     CLRF 0xf95, ACCESS             33:        clrf TRISD
  000E    6A96     CLRF 0xf96, ACCESS             34:        clrf TRISE
                                                  35:    ;//------------------------------------------------------
                                                  36:    ; ahora viene la deshabilitación de modulos (pheriperals)
                                                  37:    ;*******************************************************
  0010    6A00     CLRF 0, ACCESS                 38:    clrf,ADCON0 ; desactiva el CAD
  0012    0E0F     MOVLW 0xf                      39:    movlw 0xf
  0014    6EC1     MOVWF 0xfc1, ACCESS            40:    movwf ADCON1 ; todas digitales
  0016    9EF2     BCF 0xff2, 0x7, ACCESS         41:    bcf INTCON,GIE ; desactiva interrupciones
  0018    0E07     MOVLW 0x7                      42:    movlw 0x7
  001A    6EB4     MOVWF 0xfb4, ACCESS            43:    movwf CMCON ;desactiva el modulo comparador
                                                  44:    ;clrf CVRCON ; desactiva el Vref del comparador no hace falta
  001C    6A65     CLRF 0xf65, ACCESS             45:    clrf SPPCON ; desactiva el modulo Streaming Parallel Port (SPP)
  001E    6AC6     CLRF 0xfc6, ACCESS             46:    clrf SSPCON1 ; desactiva el modulo MSSP,SSPEN
  0020    966D     BCF 0xf6d, 0x3, ACCESS         47:    bcf UCON,USBEN ; desactiva el modulo USB
  0022    8EF1     BSF 0xff1, 0x7, ACCESS         48:    bsf INTCON2,RBPU ; desactiva las resistencias de amarre en PORTB
                                                  49:       ;disable_interrupts(global);
                                                  50:       ;setup_adc_ports(NO_ANALOGS);
                                                  51:       ;setup_adc(ADC_OFF);
                                                  52:       ;setup_spi(FALSE);
                                                  53:       ;setup_psp(PSP_DISABLED);
                                                  54:       ;setup_comparator(NC_NC_NC_NC);
                                                  55:       ;setup_vref(FALSE);
                                                  56:    ;//-------------------------------------------
                                                  57:    ;port_b_pullups(FALSE);   
                                                  58:   
                                                  59:    ciclo:
  0024    A081     BTFSS 0xf81, 0, ACCESS         60:    btfss PORTB,0
  0026    D008     BRA 0x38                       61:    bra LED_RB2
  0028    9581     BCF 0x81, 0x2, BANKED          62:    bcf PORTB,2,1
  002A    9981     BCF 0x81, 0x4, BANKED          63:    bcf PORTB,4,1
  002C    9D81     BCF 0x81, 0x6, BANKED          64:    bcf PORTB,6,1
                                                  65:   
  002E    8381     BSF 0x81, 0x1, BANKED          66:    bsf PORTB,1,1
  0030    8781     BSF 0x81, 0x3, BANKED          67:    bsf PORTB,3,1
  0032    8B81     BSF 0x81, 0x5, BANKED          68:    bsf PORTB,5,1
  0034    8F81     BSF 0x81, 0x7, BANKED          69:    bsf PORTB,7,1
  0036    D7F6     BRA 0x24                       70:    bra ciclo
                                                  71:    LED_RB2:
  0038    9381     BCF 0x81, 0x1, BANKED          72:    bcf PORTB,1,1
  003A    9781     BCF 0x81, 0x3, BANKED          73:    bcf PORTB,3,1
  003C    9B81     BCF 0x81, 0x5, BANKED          74:    bcf PORTB,5,1
  003E    9F81     BCF 0x81, 0x7, BANKED          75:    bcf PORTB,7,1
                                                  76:   
  0040    8581     BSF 0x81, 0x2, BANKED          77:    bsf PORTB,2,1
  0042    8981     BSF 0x81, 0x4, BANKED          78:    bsf PORTB,4,1
  0044    8D81     BSF 0x81, 0x6, BANKED          79:    bsf PORTB,6,1
  0046    D7EE     BRA 0x24                       80:    bra ciclo


vemos que hay varias instrucciones que tienen un tercer argumento, este argumento define
como se va a accesar al banco de memoria RAM. En la pagina 66 aparece el mapa de la memoria de datos



continua...
« Última modificación: 04 de Enero de 2007, 12:20:27 por PalitroqueZ »
La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
Re: Mis primeros pasos con el 18F4550
« Respuesta #8 en: 02 de Enero de 2007, 13:52:16 »
...viene de arriba

la memoria se divide en bancos y dependiendo de un tal BSR(registro selector de banco) se puede accesar a diferentes direcciones.

como esto es un tema aparte(que apenas estoy conociendo), solo diré, que por defecto el tercer argumento es "0" ó como lo llama el mpasmwin (y el CCS también): ACCESS. Es válido si no se coloca nada, el MPLAB, lo asume como a=0 (ver pagina 67)

se colocará "0" en todas los B(s/c)F y el código quedará así:

Código: [Seleccionar]
; código ejemplo para hacer funcionar por tercera vez al PIC18F4550 mediante encendido
; y apagado de 8 led´s conectado al PORTB dependiendo del estado del pulsador en RB0
; que encenderá led´s pares e impares
; 21-Dic-2006

LIST P=18F4550 ;directive to define processor
#include <P18F4550.INC> ;processor specific variable definitions

;#fuses XTPLL,MCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL1,CPUDIV1,NOVREGEN,NOPBADEN // el fuse que configuramos anteriormente (CORREGIDO)
;#use delay(clock=48000000) // el clock que tendremos a la entrada del CPU

    CONFIG FOSC = XTPLL_XT, PLLDIV = 1,CPUDIV = OSC1_PLL2,USBDIV = 2,PWRT = ON,BOR = ON, VREGEN = OFF
CONFIG WDT = OFF ,WDTPS = 1,MCLRE = ON,PBADEN = OFF,LVP = OFF,XINST = OFF,DEBUG = OFF

CBLOCK 0x0

ENDC

org  0
goto inicio
; org 0x8 interrup alta priori
; org 0x18 baja prioridad
inicio:
; clrf LATA ; limpia los latch
; clrf LATB
; clrf LATC
; clrf LATD
; clrf LATE
    clrf TRISA  ; configuar el port como salida  ¡que bueno!, no hay que estar cambiando de bancos ;-)
movlw 0x1
movwf TRISB ; configura RB0<- entrada, el resto -> salida
    clrf TRISC
    clrf TRISD
    clrf TRISE
;//------------------------------------------------------
; ahora viene la deshabilitación de modulos (pheriperals)
;*******************************************************
clrf,ADCON0 ; desactiva el CAD
movlw 0xf
movw ADCON1 ; todas digitales
bcf INTCON,GIE ; desactiva interrupciones
movlw 0x7
movwf CMCON ;desactiva el modulo comparador
;clrf CVRCON ; desactiva el Vref del comparador no hace falta
clrf SPPCON ; desactiva el modulo Streaming Parallel Port (SPP)
clrf SSPCON1 ; desactiva el modulo MSSP,SSPEN
bcf UCON,USBEN ; desactiva el modulo USB
bsf INTCON2,RBPU ; desactiva las resistencias de amarre en PORTB
   ;disable_interrupts(global);
   ;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);   

ciclo:
btfss PORTB,0
bra LED_RB2
bcf PORTB,2,0
bcf PORTB,4,0
bcf PORTB,6,0

bsf PORTB,1,0
bsf PORTB,3,0
bsf PORTB,5,0
bsf PORTB,7,0
bra ciclo
LED_RB2:
bcf PORTB,1,0
bcf PORTB,3,0
bcf PORTB,5,0
bcf PORTB,7,0

bsf PORTB,2,0
bsf PORTB,4,0
bsf PORTB,6,0
bra ciclo
end

haciendo la simulación (mirar con atención la ventana de la derecha, es la de Registros Funciones eSpeciales):

simulacion1.wmv

allí muestra que el PORTB cambia los estados de acuerdo a la programación escrita,
ahora procedemos a grabar el pic y ver el comportamiento

ejemplo3_2.wmv

ahora si hace lo que tiene que hacer, encender los led´s pares e impares dependiendo del switcheo. pero entonces quiere decir que si se puede trabajar con el PORTB como salida.

vamos a tomar el otro caso, sustituiremos el PORTB por LATB en la escritura de los pines de salida (llamemos ejemplo3_lat).

el código cambiará así:

Código: [Seleccionar]
; código ejemplo para hacer funcionar por tercera vez al PIC18F4550 mediante encendido
; y apagado de 8 led´s conectado al PORTB dependiendo del estado del pulsador en RB0
; que encenderá led´s pares e impares
; 21-Dic-2006

LIST P=18F4550 ;directive to define processor
#include <P18F4550.INC> ;processor specific variable definitions

;#fuses XTPLL,MCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL1,CPUDIV1,NOVREGEN,NOPBADEN // el fuse que configuramos anteriormente (CORREGIDO)
;#use delay(clock=48000000) // el clock que tendremos a la entrada del CPU

    CONFIG FOSC = XTPLL_XT, PLLDIV = 1,CPUDIV = OSC1_PLL2,USBDIV = 2,PWRT = ON,BOR = ON, VREGEN = OFF
CONFIG WDT = OFF ,WDTPS = 1,MCLRE = ON,PBADEN = OFF,LVP = OFF,XINST = OFF,DEBUG = OFF

CBLOCK 0x0

ENDC

org 0
goto inicio
; org 0x8 interrup alta priori
; org 0x18  baja prioridad
inicio:
; clrf LATA ; limpia los latch
; clrf LATB
; clrf LATC
; clrf LATD
; clrf LATE
    clrf TRISA  ; configuar el port como salida  ¡que bueno!, no hay que estar cambiando de bancos ;-)
movlw 0x1
movwf TRISB ; configura RB0<- entrada, el resto -> salida
    clrf TRISC
    clrf TRISD
    clrf TRISE
;//------------------------------------------------------
; ahora viene la deshabilitación de modulos (pheriperals)
;*******************************************************
clrf,ADCON0 ; desactiva el CAD
movlw 0xf
movwf ADCON1 ; todas digitales
bcf INTCON,GIE ; desactiva interrupciones
movlw 0x7
movwf CMCON ;desactiva el modulo comparador
;clrf CVRCON ; desactiva el Vref del comparador no hace falta
clrf SPPCON ; desactiva el modulo Streaming Parallel Port (SPP)
clrf SSPCON1 ; desactiva el modulo MSSP,SSPEN
bcf UCON,USBEN ; desactiva el modulo USB
bsf INTCON2,RBPU ; desactiva las resistencias de amarre en PORTB
   ;disable_interrupts(global);
   ;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);   

ciclo:
btfss PORTB,0
bra LED_RB2
bcf LATB,2,0
bcf LATB,4,0
bcf LATB,6,0

bsf LATB,1,0
bsf LATB,3,0
bsf LATB,5,0
bsf LATB,7,0
bra ciclo
LED_RB2:
bcf LATB,1,0
bcf LATB,3,0
bcf LATB,5,0
bcf LATB,7,0

bsf LATB,2,0
bsf LATB,4,0
bsf LATB,6,0
bra ciclo
end

haciendo de nuevo la simulación: (mirar con atención la ventana de la derecha, es la de Registros Funciones eSpeciales)

simulacion_lat.wmv

el puerto B se escribe como debe ser, muy bien. Ahora a quemar el pic y probar en el protoboard

ejemplo3_lat.wmv

obtenemos el mismo resultado.  :?

La conclusión de este tercer ejemplo, bueno la verdad es que no pudimos demostrar el uso/comportamiento del PORTX frente al LATx, como escritura a los pines, creo que eso lo dirá la experiencia, ensayando y programando con el pic como ya lo han hecho los que saben sobre el tema.

en el adjunto está el código fuente y circuito del montaje
 
Salu2
Pedro
« Última modificación: 02 de Enero de 2007, 14:03:22 por PalitroqueZ »
La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado LordLafebre

  • Moderador Global
  • DsPIC30
  • *****
  • Mensajes: 3529
    • Micros & micros
Re: Mis primeros pasos con el 18F4550
« Respuesta #9 en: 02 de Enero de 2007, 20:49:11 »
Hola:

es hasta ahora que veo este post, y me quede sorprendido  :shock:, felicidades por el excelente trabajo PalitroqueZ  :mrgreen: :-/

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: Mis primeros pasos con el 18F4550
« Respuesta #10 en: 03 de Enero de 2007, 06:30:08 »
PalitrokeZ:

A ver si me da tiempo y uno los trozos pa publicarlos junto con el primero. Ufff ... ya no doy a basto con todo ja ja ja  :D :D :D
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
Re: Mis primeros pasos con el 18F4550
« Respuesta #11 en: 04 de Enero de 2007, 12:19:18 »
Gracias Amigos. Esto es una recopilación de lo voy haciendo sobre la marcha y lo voy exponiendo para que aquel que también quiera y/o necesite incursionar con este PIC, por lo menos tenga alguna guía de lo que debe y no debe hacer. 8)

Esta vez vamos a utilizar un módulo que se utiliza frecuentemente: el módulo del Convertidor Analogico Digital(CAD ó ADC en inglés), yo he realizado uno que otro montaje con este módulo, pero nunca lo he explicado (por allí dijeron que es mas dificil explicar que aplicar lo aprendido), así que intentaré aportar de lo que estoy conociendo.

las fuentes consultadas:

-PICmicro® 18C MCU Family Reference Manual (39500a.pdf pagina 583)

-configurar el estímulo del ADRESL

-Conceptos

-SALTO EN EL CONVERTIDOR A/D DE UN 16F877

-convertir 10 bits y quedarme con 8

nos vamos directo para la página 261 del 39632c.pdf, que es el datasheet del la familia PIC18F2455/2550/4455/4550 y allí está un capítulo dedicado a este módulo.

-las diferencias que leí respecto al 16F877, le agregaron un adcon2 y hay 13 posibles entradas analogicas multiplexadas.

-la configuración PCFG3:PCFG0 luce mas ordenada.

-Le agregaron unos bits que son muy interesantes ACQT2:ACQT0 para manejar el tiempo de adquisición, ya lo explicaremos.

- desde el punto de vista del 16F87xA(dentro de la familia 16) no ha cambiado las opciones del clock de CAD (hay 7 opciones)

Quisiera hacer un resumen del funcionamiento del CAD para poder explicar las nuevas opciones que trae el 18F4550 y las mejoras respecto al 16F877

La definición del Convertidor Analogico Digital, la podemos conseguir en la wikipic y se puede desglosar de la siguiente manera:



de acuerdo a la imagen anterior:

-existen unos pines que se pueden configurar como entrada analógica, del cual se toma uno a la vez.
-dado un arreglo R-C,que existe dentro, o a la entrada del módulo CAD se toma un nivel de tensión en un tiempo discreto, ese voltaje se almacenará en el condensador interno (Chold)

-el tiempo que tarde ese condensador en cargarse, lo determinaremos nosotros de 2 maneras:
   -mediante un retardo por software (configurando un timer, ó generando ciclos de instrucción).
   -mediante un retardo por hardware (configurando los bits ACQT2:ACQT0 en ADCON2)

este tiempo, es el tiempo de adquisición ó Tacq (acquire), y es fundamental para obtener precisión en el resultado digital. Ojo no confundir con Tad, como lo hice alguna vez,(las iniciales en inglés se asemejan a las iniciales en español)

en el caso del 16F877, mediante calculos teoricos era Tacq ~ 20uS



en el caso del 18F4550, el tiempo mínimo que sacan es Tacq ~ 2,45uS



esto aparece en la página 266. Se nota que disminuyó el tiempo y aumentando así la velocidad en el CAD

el retardo por hardware (que así lo quise llamar) ó programmable acquisition time es algo nuevo, es posible configurar el Tacq:



en la figura 21-4 es como siempre lo habiamos visto, antes de activar el GO_DONE había que introducir el Tacq. Ahora usando la configuración por hardware, tenemos la figura 21-5 donde sucede después de haber seteado al GO_DONE (no algodon, :))), haciendolo automático.

-luego viene el proceso de hacer la conversión, es decir, tomar el valor analógico de lo que está cargado en el condensador Chold y llevarlo a un número binario.

-en este proceso de conversión hay otros parametros, uno de ellos es el reloj de conversión, esto quiere decir decir que el módulo CAD, trabaja con un reloj distinto del CPU y que puede depender o no de éste. Eso lo dirá la debida configuración de los bits ADCS2:ADCS0 del registro ADCON2

Cuando digo que puede ser independiente del CPU, es porque puede trabajar con un reloj interno (un oscilador RC) cuya aplicación sería poner a dormir el pic mientras se está haciendo una conversión, ¿y que utilidad puede tener esto?, bueno al estar trabajando solo el módulo CAD, se reduce el ruido de conmutación de los otros perifericos y puede aumentar la precisión del valor digital obtenido.
Desventajas: usando el oscilador interno se tarda mas la conversión (en el orden de los mS, que podría sería mucho tiempo para algunos eventos)

cuando inicia la conversión, lo primero que hace es desconectar el condensador Chold de la entrada analogica, y mediante una aproximación sucesiva, se vá guardando bit a bit de los 10 bits que hay, el resultado digital (ver figura 21-4)

esto también tiene su tiempo y es el tiempo (retardo) de conversión analogico digital por bit, llamado Tad. Según la pagina 267 se requiere de un tiempo de 11Tad para realizar una conversión, el Tad mínimo para el CAD del 18F4550 es 700nS (página 400)
pero haciendo algunos calculos de acuerdo a la tabla 21-1



usando un clock del CPU de 48Mhz se obtiene hasta 64/48Mhz = 1.33uS



Nota: el Tacq sacado por hardware depende de Tad



posteriormente viene todo lo que se venia aplicando anteriormente, esperar a que GO_DONE =0 ó esperar la interrupción del CAD y tomar el valor que está en la pareja de bytes ADRESH:ADRESL (limpiar la bandera ADIF si es es por interrupción) en general, los pasos para un CAD, serian(pag265):



desde luego que todo esto es pura teoría, así que vamos a darle con un ejemplo

para nuestro ejemplo(ejemplo4):

-usaremos un reloj de conversión de 64Tosc = Fosc/64 ya que seguiremos usando un clock de 48Mhz y esto es lo que recomienda la tabla 21-1

-usaremos el Tacq por hardware, así que si nuestro Tad=1.33uS, entonces usando un tacq=2Tad= 2*1.33uS = 2.66uS

-seleccionaremos el canal AN0, el resto como i/o digital

-haremos la conversión AD y después indicaremos el resultado en 10 leds

aunque yo no se para que tanta precisión, si estoy trabajando en C, y no se que como hará eso el compilador. 
cálculo preciso + teórico= cálculo preciso + error(práctico)
cálculo preciso + error(teórico)= cálculo preciso + error(práctico) + error(teórico)

Código: [Seleccionar]
// usando el CAD en el 18F4550
// 30-Dic-2006
#include <18f4550.h> //archivo de cabecera
//#DEVICE ADC=8 // cad a 8 bits, justificación a a la derecha
#DEVICE ADC=10 // cad a 10 bits, justificación a a la derecha
//#DEVICE ADC=16 // cad a 10 bits, justificación a a la izquierda
#fuses XTPLL,MCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL1,CPUDIV1,NOVREGEN,NOPBADEN // el fuse que configuramos anteriormente (CORREGIDO)
#use delay(clock=48000000) // el clock que tendremos a la entrada del CPU

#byte LATB=0xF8A
#byte PORTB=0XF81

void main() {
long value;
int parte_alta;
int ADC_ACQT_2TAD=0x1;
 output_a(0);    // saca un nivel bajo de salida en los puertos
 output_b(0);
 output_c(0);
 output_d(0);
 output_e(0);   
 set_tris_a(0x1); // 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_spi(FALSE);
   setup_psp(PSP_DISABLED);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   port_b_pullups(FALSE);   
   
 setup_adc_ports( AN0 || VSS_VDD );
 setup_adc(ADC_CLOCK_DIV_64 || ADC_ACQT_2TAD );
 set_adc_channel(0);
 while(1){ // bucle infinito
 value = read_adc(); // toma el resultado del CAD
 output_b((int)value); // envía el byte LSB a portb
 parte_alta=(int)((value & 0x300)>>8); // separa los 2 bits MSB de value
 output_c(parte_alta); // y los envia al portc
 }
}

buscando en el CCS no conseguí alguna constante declarada para los bits ACQTx así que tuve que crearlos y hacer una OR incluyente con las demas constantes dentro de la función setup_adc().

Código: [Seleccionar]
int ADC_ACQT_2TAD=0x1;

para comprobar si esto es correcto, voy a compilar y miraré en la ventana SFR del MPLAB para ver como quedó el registro ADCON2

adcon2cambiando

Pero fué en vano, el CCS no me deja cambiar los bits 3,4,5 de ADCON2, así que me voy por ensamblador, sustituyo la linea setup_adc(ADC_CLOCK_DIV_64 || ADC_ACQT_2TAD ); por:

Código: [Seleccionar]
#asm
movlw 0b10001110 ;justificacion_derecha,2Tad,Fosc/64
movwf 0xFC0 ; direccion de ADCON2
#endasm



ahora si aceptó el cambio, entonces se hace la simulación nuevamente, pero antes introduzco el cambio de ADRESx mediante estimulos, en una de las fuentes consultadas(ver arriba) el amigo Maunix explica como hacerlo, ahora si arrancamos con el MPLAB-SIM

video_config_estimulo

el estímulo no está funcionando, de verdad que pasé un rato creyendo que estaba mal configurado el Register Injection, pero después me dí cuenta que faltaba la instrucción setup_adc(), si así como lo leen, ¿como se hace entonces si lo había quitado?, bueno, lo coloque de nuevo y le añadí el pedacito en assembler para que aceptara el cambio en ADCON2

Código: [Seleccionar]
setup_adc(ADC_CLOCK_DIV_64 ); //|| ADC_ACQT_2TAD );
#asm
movlw 0b10001110 ;justificacion_derecha,2Tad,Fosc/64
iorwf 0xFC0,1 ; direccion de ADCON2
#endasm

claro, que cambié el movwf por iorwf, para que me aceptara los nuevos bits sin alterar el estado anterior de ADCON2, también es bueno decir que por aquí se puede cambiar la justificación, hay otra cosa interesante, en CCS hay una directiva  #DEVICE ADC=xx , sería bueno analizar que pasa si cambio ADC=10 por ADC=16, ¿esto hará la justificación hacia la izquierda?, sería otro estudio.

vamos a simular de nuevo, ;-)
nota: el archivito llamado adresito.txt tiene estas lineas guardadas:
Código: [Seleccionar]
1A0
2AA
3FF
esas lineas corresponden al supuesto valor de ADRESH:ADRESL y seran cargadas por el estímulo en un bucle

nueva_simulacion

me dió curiosidad y ví el listado en ensamblador, metí un breakpoint en el momento de escoger el canal y hasta que se cargan la pareja ADRESH:ADRESL



calculando el tiempo teorico: Tacq=2*Tad + 11*Tad= 2*(64/48Mhz) +11*(64/48Mhz)=17.33uS
bastante aproximado con los 18.33 uS que dá el MPLAB-SIM.

el siguiente paso es programar el pic y probarlo en el protoboard, hay un detallito que se está olvidando, la resistencia Rs, que es la que vá a la entrada AN0, según los calculos teoricos máximo de 2.5k, yo usaré un potenciometro que le medí 2k que es lo que tengo a mano, ¿habrá algún cambio? eso habrá que verlo en el protoboard.

video_protoboard

ja ja con tanta cablamenta, me imagino el ruido que debe haber allí.

Lo importante es que hicimos arrancar el módulo CAD y que hicieras las respectivas conversiones.

hice unas mediciones con el tester, y me di cuenta que al insertar la punta en AN0 parece que introduce variaciones, así que conecté un TL082 como seguidor de voltaje, para poder medir sin interferencias. peeeero me topé con un problemita, hay un detalle cuando intentas medir niveles cercano a 0 volts usando el TL082. Buscando por ahí conseguí una página donde explican el fenomeno(llamado latch-up), a mi me sucede esto porque alimento al operacional con +Vcc=+5 y -Vcc=0.

Solución: alimenté al operacional con +Vcc=+12 y -Vcc= -12 y ¡listo!.

volví hacer mediciones, esta vez arreglando mejor las conexiones:
- una especie de apantallamiento a la entrada AN0
- acerqué mas el C=100nF de alimentación del PIC.

y varios resultados obtenidos:



según estos datos obtenidos, la precisión es mas o menos... uhmmm, será por el montaje en protoboard, si ya se que todo es relativo... voy hacer otra prueba, voy a aumentar el Tacq al máximo permitido por ADCON2, esto es 20Tad =  20 * 1.33uS = 26.6 uS bastante tiempo de sobra que sumandole 11Tad = 11* 1.33uS =14.63uS daría una conversión aproximada de 41.23uS

para Tacq=20Tad -> ADCON2<-0b10111110, entonces el código cambiará:

Código: [Seleccionar]
#asm
 movlw 0b10111110 ;justificacion_derecha,20Tad,Fosc/64
 iorwf 0xFC0,1 ; direccion de ADCON2
 #endasm

repitiendo todo el procedimiento anterior, compilando y simulando y depués grabar el micro, llegamos a revisar el montaje en el protoboard:

videito_proto2

y unos datos nuevos que recopilé



Conclusión:
bueno señores, esos resultados como que mejoraron un poco :shock:, uhmmmm... la verdad es que nunca he podido obtener valores calculados en la práctica, quizas un montaje mejor elaborado en baquelita y bien filtrado pueda aumentar la precisión.
espero que les pueda instruir en algo.

nota: en el adjunto está todo el código con su respectivo circuito eléctrico.

Salu2
Pedro

PD: Quise colgar los videos en youtube pero algunos pierden bastante definición :(
« Última modificación: 04 de Enero de 2007, 13:18:03 por PalitroqueZ »
La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
Re: Mis primeros pasos con el 18F4550
« Respuesta #12 en: 08 de Enero de 2007, 11:49:30 »
Hola Amigos.

Continuando con el CAD, seguí haciendo varias mediciones con el código realizado anteriormente y descubrí nuevos detalles

- según la página 602 de 39500a.pdf




allí recomiendan colocar un condensador de 100nF a la entrada de AN0 si la señal no cambia tan rapidamente, a mi me sirve pues estoy variando con un destornillador y eso es mas lento que inyectar una señal de baja frecuencia.

-para la alimentación en AN0, usé un 7805 aparte, para separar los voltajes.

-noté una variación de Vdd, no se porque la alimentación del 7805 cambia cuando varío el potenciómetro en AN0, así que en las mediciones tomé en cuenta ese valor de Vdd que es mi Vref, en cada dato que sacaban los leds.

los nuevos datos obtenidos:






según la gráfica se nota una mejoría en la precisión, pero yo sigo obstinado a conseguir mas precisión, después de un buen rato debugeando con el MPLAB SIM, observé la pestaña MPLAB SIM que está adentro de la ventana OUTPUT y me salía este mensaje:

Código: [Seleccionar]
ADC-W0001: Tad time is less than 1.60us
ADC-W0010: A Minimum of 2 TADs are required before another conversion should be started.

-el primer mensaje es cierto porque el ADCON2 está para FOSC/64 = 1.33uS, pero recuerden que me estoy guiando por las recomendaciones de la datasheet.

-con el segundo mensaje, el MPLAB SIM me dió un regaño  :mrgreen:, muy cierto me salté esos tiempos:



esto sale en la página 265

3Tad = 3*(64/48MHZ)=3.99uS

entonces modifiqué el programa, metiendo un delay_us(5) y grabé el pic, y volví a tomar datos, ¡pero un momento! en la página 268 dice que pueden ser 2Tad:




yo con mi manía lo saqué para ambos valores(2Tad y 3Tad) y aquí estan los resultados:

para tiempo entre muestras >= 2Tad:







para tiempo entre muestras >= 3Tad:






¡¡¡Ahhh!!! se dan cuenta señoras y señores, los valores son cercanos a lo calculado, o sea, que ese tiempito entre conversión y conversión es MUUY IMPORTANTE y yo voy a seguir sacandole punta a este ejemplo (que ahora se llama ejemplo4_parte2).

nota:
-esto ya se sale de la iniciación con el 18F4550, formaría parte de la configuración básica de un módulo CAD.

-observen en los resultados que la variación de Vdd fué muy poca !?!?  :shock:

voy a modificarlo como quería en un principio, tratar que el CAD se tarde lo mínimo en hacer una conversión, es decir, con Tacq=2Tad y un 2Tad entre muestras, para ellos cambiamos por estas lineas:

Código: [Seleccionar]
...
 #asm
 movlw 0b10001110 //justificacion_derecha,2Tad,Fosc/64
...
...
 delay_us(3); // para pasar >= 2Tad a la sig CAD
...

y una vez mas, empiezo a tabular datos, jeje   8)







de estos ultimos resultados tengo varias conclusiones:

-que si es posible hacer un conversión con aceptable precisión, usando el mínimo tiempo de la Adquisición por hardware.

-que el Vdd variaba (y esto es una sospecha) debido a incremento de corriente de parte de los leds, noten en los datos que a medida que mas led´s se encendian, Vdd iba disminuyendo, esto no tiene que ver con la configuración del CAD.

-que hay que estar pendiente con los minimos detalles que dicen en la datasheet, tal es el caso del mínimo Tad entre muestras.

-que no se le puede exigir demasiado a un montaje en protoboard  :?

en el adjunto está todo, con el circuito modificado.

Salu2
Pedro
La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
Re: Mis primeros pasos con el 18F4550
« Respuesta #13 en: 11 de Enero de 2007, 16:24:41 »
Hola Amigos.

Ahora vamos a hablar del módulo USB, Esto si es nuevo para mi y como la fiebre es tan grande... me salté todas las barreras y me fuí derechito con el ejemplo del amigo J1M, el del encender un par de led´s. Así que voy a describir esta pequeña aventura, como para la bajar la fiebre un poco. ;))

bién, el primer paso, conseguir el código del PicUSB puede ser en este post ó en la página http://www.hobbypic.com/ buscar el archivo picusb.zip

- allí hay un pdf donde aparece el circuito eléctrico, para el 18F2550, bueno yo estoy usando el 18F4550 y sirve también. solo hay que cambiar el encabezado por #include <18F4550.h>

- usar un software para enviar los comandos que activaran los led´s, yo aún no tengo el visual C#, pero ya que el amigo RedPic realizó uno que es compatible con el mismo código, lo usé y se llama PicUSBDelphi.exe:



este archivo se encuentra en PicUSBDelphi.zip, y funciona con la librería mpusbapi.dll que debe estar en el mismo directorio.

- seguido conectar todo. Hay que revisar los contactos del conector USB. Yo usé el plug estandar tipo A (visto de la parte de abajo)



cuyos pines van así: (tomado de especificaciones USB2.0 capítulo6 página99)



donde:

Código: [Seleccionar]
1=Vbus
2=D-
3=D+
4=gnd

ese plug lo conecté a una extensión, por si acaso medí la tensión de Vusb=5.1 volts.

- ahora si viene la parte de conectar y enchufar al puerto de la PC, y....

el windows me detectó un nuevo dispositivo USB, hay que elegir la carpeta donde estan los controladores que estan en el mismo picusb.zip, son 4 archivitos:

Código: [Seleccionar]
picusb.cat
picusb.inf
picusbci.dll
wdmstub.sys

después el windows hace todo lo que tiene que hacer (configurar dispositivo, etc.)





y listo, se encendió el circuito en el protoboard. parece que la misma alimentación del puerto alimenta al circuito

-ahora falta cargar el programa en la PC y hacer las respectivas pruebas:

probando_transmisión

como podran ver en este ejemplo6, aquí no se habla de programación ni de funcionamiento, simplemente me lancé a probar ese código y siento especial alegría porque ¡ya pude hacer mi primera transmisión de datos a un PIC via USB!  :-/ :D :mrgreen: Gracias J1M y RedPic.

ahora viene la parte difícil, entender que es lo que hace aquello y como lo hace.  :?

continuara...

Salu2
Pedro
La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: Mis primeros pasos con el 18F4550
« Respuesta #14 en: 11 de Enero de 2007, 16:30:09 »
Ja, ja, ja  :D :D :D Gracias en la parte que me toca pero ...

Citar
ahora viene la parte difícil, entender que es lo que hace aquello y como lo hace.  :?

Hay un dicho que yo me aplico mucho : Si funciona, no lo toques.  :mrgreen:

(Aunque también hay otro no menos cierto que dice : Si funciona, es que lo has probado poco)


Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania