TODOPIC

Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: PalitroqueZ en 18 de Diciembre de 2006, 12:45:04

Título: Mis primeros pasos con el 18F4550
Publicado por: PalitroqueZ 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 (http://www.todopic.com.ar/foros/index.php?topic=1778.msg94996#new) 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

(http://img482.imageshack.us/img482/4958/pineupii4.th.jpg) (http://img482.imageshack.us/my.php?image=pineupii4.jpg)

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

(http://img397.imageshack.us/img397/1930/oscilatorconfiguratorkk4.th.jpg) (http://img397.imageshack.us/my.php?image=oscilatorconfiguratorkk4.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


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 (http://www.todopic.com.ar/foros/index.php?topic=13282.0)  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.

(http://img161.imageshack.us/img161/1093/buildti7.th.jpg) (http://img161.imageshack.us/my.php?image=buildti7.jpg)

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

(http://img320.imageshack.us/img320/6858/confbitste2.th.jpg) (http://img320.imageshack.us/my.php?image=confbitste2.jpg)

¡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

(http://img161.imageshack.us/img161/6124/buildcorregidoyk5.th.jpg) (http://img161.imageshack.us/my.php?image=buildcorregidoyk5.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:

(http://img453.imageshack.us/img453/8701/antestx9.th.jpg) (http://img453.imageshack.us/my.php?image=antestx9.jpg)

(http://img161.imageshack.us/img161/1830/despuescv3.th.jpg) (http://img161.imageshack.us/my.php?image=despuescv3.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

(http://img335.imageshack.us/img335/3324/los2lenguajesie1.th.jpg) (http://img335.imageshack.us/my.php?image=los2lenguajesie1.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  :)
         ó
- 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 (http://www.4shared.com/file/7578897/88a31bb7/tililando.html)

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.
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: RedPic 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 (http://picmania.garcia-cuervo.net/Invitados.htm) de PicManía by Redraven (http://picmania.garcia-cuervo.net/Invitados.htm) bajo tu mismo título y con sus correspondientes créditos de autoría y meritaje.  :mrgreen:

Título: Re: Mis primeros pasos con el 18F4550
Publicado por: PalitroqueZ 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
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: RedPic en 19 de Diciembre de 2006, 17:22:09
Ea, ya estás entre mis Artistas Invitados (http://picmania.garcia-cuervo.net/Invitados_Primer18F4550.htm)   :mrgreen:

Título: Re: Mis primeros pasos con el 18F4550
Publicado por: todopic 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 !
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: RedPic 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:

Título: Re: Mis primeros pasos con el 18F4550
Publicado por: PalitroqueZ 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)

(http://www.todopic.com.ar/foros/index.php?action=dlattach;topic=15208.0;attach=5323)


(http://www.todopic.com.ar/foros/index.php?action=dlattach;topic=15208.0;attach=5325)


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

(http://www.todopic.com.ar/foros/index.php?action=dlattach;topic=15208.0;attach=5327)


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 (http://www.4shared.com/file/7731890/d387c655/ejemplo2_mplab.html)

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 (http://www.todopic.com.ar/foros/index.php?topic=9113.0).


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 (http://www.4shared.com/file/7732025/5cbf1547/ejemplo2_montaje.html)

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

Salu2
Pedro
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: PalitroqueZ 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? (http://www.todopic.com.ar/foros/index.php?topic=12372.0)
Ayuda con pic18f2220 (http://www.todopic.com.ar/foros/index.php?topic=2255.0)
Conversor AD , tan fácil y a la vez tan difícil (http://www.todopic.com.ar/foros/index.php?topic=8586.0)
Tutorial para PIC18 (http://www.todopic.com.ar/foros/index.php?topic=11553.0)

Microchip:
read-modify-write and peripheral port usage (http://direct.forum.microchip.com/tm.aspx?m=209422)
PORTx or LATx... read-modify-write (http://forum.microchip.com/printable.aspx?m=203965)

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


(http://img46.imageshack.us/img46/7846/portd16fck9.th.jpg) (http://img46.imageshack.us/my.php?image=portd16fck9.jpg)(http://img479.imageshack.us/img479/2074/ioports18fmc4.th.jpg) (http://img479.imageshack.us/my.php?image=ioports18fmc4.jpg)

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)

(http://img479.imageshack.us/img479/1267/humorxm2.th.jpg) (http://img479.imageshack.us/my.php?image=humorxm2.jpg)

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 (http://www.4shared.com/file/8222650/fcfcc357/simulacion2.html)


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 (http://www.4shared.com/file/8222807/15718fbb/ejemplo3_1.html)

¡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

(http://img271.imageshack.us/img271/4089/bancomemoriapi9.th.jpg) (http://img271.imageshack.us/my.php?image=bancomemoriapi9.jpg)

continua...
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: PalitroqueZ 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 (http://www.4shared.com/file/8222976/2cf543dd/simulacion1.html)

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 (http://www.4shared.com/file/8223092/276f6a0/ejemplo3_2.html)

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 (http://www.4shared.com/file/8223382/192b79b8/simulacion_lat.html)

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

ejemplo3_lat.wmv (http://www.4shared.com/file/8223245/2a38c920/ejemplo3_lat.html)

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
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: LordLafebre 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: :-/
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: RedPic 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
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: PalitroqueZ 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 (http://www.todopic.com.ar/foros/index.php?topic=8501.15)

-Conceptos (http://picmania.garcia-cuervo.net/Conceptos.htm#CONVAD01)

-SALTO EN EL CONVERTIDOR A/D DE UN 16F877 (http://www.todopic.com.ar/foros/index.php?topic=14529.0)

-convertir 10 bits y quedarme con 8  (http://www.todopic.com.ar/foros/index.php?topic=14988.0)

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 (http://elrebujito.es/wikipic/index.php/ADC) y se puede desglosar de la siguiente manera:

(http://img504.imageshack.us/img504/7336/circuitoentradaanalogicdl6.th.jpg) (http://img504.imageshack.us/my.php?image=circuitoentradaanalogicdl6.jpg)

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

(http://img460.imageshack.us/img460/7811/tacq16flj4.th.jpg) (http://img460.imageshack.us/my.php?image=tacq16flj4.jpg)

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

(http://img460.imageshack.us/img460/637/tacq18f4550ul9.th.jpg) (http://img460.imageshack.us/my.php?image=tacq18f4550ul9.jpg)

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:

(http://img460.imageshack.us/img460/1599/diftacqsinconky6.th.jpg) (http://img460.imageshack.us/my.php?image=diftacqsinconky6.jpg)

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

(http://img460.imageshack.us/img460/6771/tadnb0.th.jpg) (http://img460.imageshack.us/my.php?image=tadnb0.jpg)

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

(http://img460.imageshack.us/img460/1126/secuenciacadpz8.th.jpg) (http://img460.imageshack.us/my.php?image=secuenciacadpz8.jpg)

Nota: el Tacq sacado por hardware depende de Tad

(http://img373.imageshack.us/img373/7812/acqtxqw4.th.jpg) (http://img373.imageshack.us/my.php?image=acqtxqw4.jpg)

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

(http://img392.imageshack.us/img392/5223/pasoscadnx8.th.jpg) (http://img392.imageshack.us/my.php?image=pasoscadnx8.jpg)

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 (http://www.4shared.com/file/8334041/453a1bfb/adcon2cambiando.html)

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

(http://img392.imageshack.us/img392/747/adcon2cambiown3.th.jpg) (http://img392.imageshack.us/my.php?image=adcon2cambiown3.jpg)

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 (http://www.4shared.com/file/8334243/a8b0aeb9/video_config_estimulo.html)

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 (http://www.4shared.com/file/8334043/ab347ad7/nueva_simulacion.html)

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

(http://img392.imageshack.us/img392/6382/tiempomuestra1mr9.th.jpg) (http://img392.imageshack.us/my.php?image=tiempomuestra1mr9.jpg)

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 (http://www.4shared.com/file/8334035/d164925/video_protoboard.html)

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 (http://www.allaboutcircuits.com/vol_6/chpt_6/5.html) 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:

(http://img392.imageshack.us/img392/559/datosrecopiladosey9.th.jpg) (http://img392.imageshack.us/my.php?image=datosrecopiladosey9.jpg)

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 (http://www.4shared.com/file/8334230/7ef869c4/videito_proto2.html)

y unos datos nuevos que recopilé

(http://img392.imageshack.us/img392/7273/datosrecopiladostacq20tod6.th.jpg) (http://img392.imageshack.us/my.php?image=datosrecopiladostacq20tod6.jpg)

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 :(
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: PalitroqueZ 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

(http://img145.imageshack.us/img145/6545/100nfenan0lq5.th.jpg) (http://img145.imageshack.us/my.php?image=100nfenan0lq5.jpg)


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:

(http://img354.imageshack.us/img354/3893/nuevosdatosqc7.th.jpg) (http://img354.imageshack.us/my.php?image=nuevosdatosqc7.jpg)

(http://img386.imageshack.us/img386/7407/graficocomparandozl5.th.jpg) (http://img386.imageshack.us/my.php?image=graficocomparandozl5.jpg)


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:

(http://img163.imageshack.us/img163/6947/minimo3tadxv8.th.jpg) (http://img163.imageshack.us/my.php?image=minimo3tadxv8.jpg)

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:

(http://img354.imageshack.us/img354/3246/minimo2tadcn8.th.jpg) (http://img354.imageshack.us/my.php?image=minimo2tadcn8.jpg)


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

para tiempo entre muestras >= 2Tad:

(http://img354.imageshack.us/img354/5341/tabladatospara3usxa7.th.jpg) (http://img354.imageshack.us/my.php?image=tabladatospara3usxa7.jpg)

(http://img386.imageshack.us/img386/4933/datospara3uslm5.th.jpg) (http://img386.imageshack.us/my.php?image=datospara3uslm5.jpg)



para tiempo entre muestras >= 3Tad:

(http://img386.imageshack.us/img386/7599/tabladatospara5ustg0.th.jpg) (http://img386.imageshack.us/my.php?image=tabladatospara5ustg0.jpg)


(http://img80.imageshack.us/img80/7933/datospara5uscj1.th.jpg) (http://img80.imageshack.us/my.php?image=datospara5uscj1.jpg)

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

(http://img80.imageshack.us/img80/1589/tabladatostacq2tadpara3tu1.th.jpg) (http://img80.imageshack.us/my.php?image=tabladatostacq2tadpara3tu1.jpg)


(http://img386.imageshack.us/img386/8118/datostacq2tadpara3usfw4.th.jpg) (http://img386.imageshack.us/my.php?image=datostacq2tadpara3usfw4.jpg)


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 (http://www.4shared.com/file/8537297/de9f581e/ejemplo4_2parte.html) está todo, con el circuito modificado.

Salu2
Pedro
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: PalitroqueZ 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 (http://www.todopic.com.ar/foros/index.php?topic=2260.0) ó 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:

(http://img488.imageshack.us/img488/6338/picusbdelphikm9.th.jpg) (http://img488.imageshack.us/my.php?image=picusbdelphikm9.jpg)

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)

(http://img109.imageshack.us/img109/3060/usbplugaws5.th.jpg) (http://img109.imageshack.us/my.php?image=usbplugaws5.jpg)

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

(http://img109.imageshack.us/img109/8065/conectorplugafx2.th.jpg) (http://img109.imageshack.us/my.php?image=conectorplugafx2.jpg)

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


(http://img109.imageshack.us/img109/2007/hardwarepcjf0.th.jpg) (http://img109.imageshack.us/my.php?image=hardwarepcjf0.jpg)


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 (http://www.4shared.com/file/8715512/fe620afc/video1_usb.html)

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
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: RedPic 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)


Título: Re: Mis primeros pasos con el 18F4550
Publicado por: PalitroqueZ en 11 de Enero de 2007, 16:38:00
jeje, viendo todo aquello de las especificaciones de ese puerto, existen 2 mundos. el mundo real: donde el usuario simplemente conecta y listo y el otro mundo: todo lo que implica hacer las transmisiones de datos. 

La tendencia parece ser: mientras mas fácil es de usar, mas complejo será el protocolo y toda la filosofia de las capas y lo que ello conlleva.


Salu2
Pedro
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: PalitroqueZ en 15 de Enero de 2007, 12:53:27
Aquí hay otro ejemplito para ir aprendiendo y practicando con el módulo USB que trae el 18F4550, esta vez se va a utilizar la clase CDC ó Communications Devices Class, entrando un poquito en teoría, se puede decir que una clase USB es un grupo de dispositivos (o interfaces dentro de un dispositivo) con ciertas caracteristicas en común. Típicamente, dos dispositivos pertenecen a la misma Clase si ambos utilizan formatos similares en los datos que reciben o transmiten, o si ambos utilizan una misma forma de comunicarse con el sistema.

tal es el caso de esta clase que permite a la función(ó dispositivo) comunicarse con el COM virtual a través del controlador HOST de USB en la computadora.

nota: este tema sobre la teoría y funcionamiento del bus USB no es para digerirlo a la primera leida, pués también hay que estudiarlo al nivel del módulo que trae el PIC

en este ejemplo (ejemplo6_parte2) le vamos a decir al pic que envie un mensaje (string) a la computadora, siempre y cuando el software se lo ordene. El software se va hacer en visual basic y para ello abrimos el VB y pegamos un control activex, en el formulario y es el MSCOMM.ocx

(http://img156.imageshack.us/img156/6235/mscomm1lt8.th.jpg) (http://img156.imageshack.us/my.php?image=mscomm1lt8.jpg)

pegamos varios controles hasta que nos queda esta pantalla:

(http://www.todopic.com.ar/foros/index.php?action=dlattach;topic=15208.0;attach=5329)

como veran hay 2 botones cada uno para enviar la orden al pic y después éste, nos envie la respectiva cadena, dicha orden será un byte ó un caracter, posteriormente esa cadena se guardará en la caja de texto.

el código en VB
Código: [Seleccionar]
' ejemplo6_parte2 comunicación al PIC mediante el puerto virtual COM4 cuya transmisión
' real será por el USB enviando un caracter para confirmarle al PIC, la transmisión
' de una cadena de acuerdo al caracter enviado
' 12-ene-07
' Pedro - PalitroqueZ
Option Explicit

Private Sub Command1_Click()
    If MSComm1.PortOpen = False Then
        MSComm1.PortOpen = True
    End If
    MSComm1.Output = "x"
End Sub

Private Sub Command2_Click()
    If MSComm1.PortOpen = False Then
        MSComm1.PortOpen = True
    End If
    MSComm1.Output = "a"
End Sub

Private Sub Form_Load()
    MSComm1.CommPort = 4
    MSComm1.OutBufferSize = 1 'tamaño del dato a transmitir
    MSComm1.InBufferSize = 23
    MSComm1.InputMode = comInputModeText 'los datos se recuperan en modo texto
   
   
    MSComm1.InputLen = 23  ' BUFFER DE ENTRADA SE PUEDE DEJAR AL MAXIMO
    MSComm1.PortOpen = True
    MSComm1.RThreshold = 23 'son 23 caracteres "presionaste el número 1"
   
End Sub

Private Sub Form_Unload(Cancel As Integer)
If MSComm1.PortOpen = True Then
    MSComm1.PortOpen = False
End If
End Sub

Private Sub MSComm1_OnComm()
Dim InBuff As String
Select Case MSComm1.CommEvent
    Case comEvReceive
    InBuff = MSComm1.Input
    Debug.Print InBuff
    Text1.Text = ""
    Text1.Text = Left$(InBuff, 23)  ' se recorta los caracteres basura
    MSComm1.PortOpen = False  'cierra el puerto y vacia el buffer
End Select
End Sub


de este código hay varias cosas que decir, lo primordial es tener bien configurado al MSCOMM, como por ejemplo RThreshold y para evitar caracteres extraños o los famosos chr(10) y chr(13) recortar la cadena a 23 caracteres como en este caso.

Otra cosa que coloqué fué cerrar el puerto después de ejecutar el evento comEvReceive, entre otras cosas para limpiar el buffer, en fin es cuestión de que hagan los respectivos ensayos de acuerdo a cada situación.

ahora viene escribir el código para el PIC:

Código: [Seleccionar]
/* ejemplo6_parte2.c
   este ejemplo hace uso del módulo USB en modo CDC transmitiendo datos
   hacia un puerto COMx emulado en Windows
   adaptación del código original de RRCdcUSB de RedPic
                                                Pedro-PalitroqueZ   12/01/07
*/
#include <18F4550.h>
#fuses XTPLL,MCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL1,CPUDIV1,VREGEN,NOPBADEN
#use delay(clock=48000000)

#include "usb_cdc.h"

void main() {
   usb_cdc_init();
   usb_init();
   while(!usb_cdc_connected()) {}
   // espera a detectar una transmisión de la PC (Set_Line_Coding)
   do{
      usb_task();
      if (usb_enumerated()){ 
         if(usb_cdc_kbhit()){ //en espera de nuevo(s) caracter(es) en el buffer
            if(usb_cdc_getc()=='x'){ //¿lo que llegó fué el caracter x?
               printf(usb_cdc_putc, "el 11111111111111111111\n\r");
               //si, entonces envía una cadena hacia el PC
             }
            if(usb_cdc_getc()=='a'){ //¿lo que llegó fué el caracter a?
               printf(usb_cdc_putc, "el 22222222222222222222\n\r");
               //si, entonces envía una cadena hacia el PC               
             }
         }
        }
       }while (TRUE); // bucle eterno
}

allí se puede apreciar que si el byte que llega es una "x", entonces se prepara para transmitir ese montón de unos, y si llega una "a" manda ese montón de does

ahora se procede a compilar,grabar el pic, revisar conexiones, etc. y probar la transmisión, pero ANTES hay que instalar la aplicación para la clase CDC, solo hay que clicar en un archivito llamado mchpcdc.inf.

como en este ejemplo, no se utilizará componentes adicionales, no hará falta alimentación externa y se puede hacer directamente desde Vusb

un videito:

ejemplo6_parte2.wmv (http://www.4shared.com/file/8907584/6ba094cb/ejemplo6_parte2.html)

observen que si no hay COM4 el VB tira el error porque no encuentra dicho puerto, pero cuando conectamos el cable todo funciona, bueno ahí habría que aplicar una validación para saltar ese error usando un On Error GoTo.

conclusiones:
-con este ejemplo se pretende hacer transmisiones de PIC<->PC usando el puerto USB real pero mediante el COM virtual

- usando la clase CDC es una manera fácil y rápida de hacer comunicación con la computadora, ya que podemos tomar programas de VB ya hechos para el MSCOMM y que mediante una pequeña adaptación podemos transmitir por el USB. La programación para el PIC varía ligeramente.

Fuentes consultadas: (altamente recomendadas para leer)
-El USB desencadenado  CDC USB (http://picmania.garcia-cuervo.com/USB_3_CDCTransfers.htm)

-858 USB Introduction to Full-Speed USB (http://techtrain.microchip.com/masters2004/(kgmnvafutocq2355egt11231)/downloads/classes/858/858_USB.pdf)


-Un paseo por los Dispositivos de Almacenamiento Masivo USB (http://www.fujitsu.com/downloads/EU/es/soporte/discosduros/UnpaseoporUSBMSD.pdf)

sobre transmisión RS-232<->VB

-comunicacion RS232 en Visual Basic (http://www.todopic.com.ar/foros/index.php?topic=7013.0)

-No recibo todos los caracteres en Visual Basic (http://www.todopic.com.ar/foros/index.php?topic=14907.0)

-Tutorial sobre comunicacion serie (http://www.todopic.com.ar/foros/index.php?topic=13257.0)

-Por casualidad, alguien tuvo este problema con rs232 ? (http://www.todopic.com.ar/foros/index.php?topic=15477.0)


el adjunto (http://www.4shared.com/file/8907752/34e99bdd/ejemplo6_parte2.html) está todo lo necesario para correr este ejemplo

Salu2
Pedro
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: elmasvital en 15 de Enero de 2007, 22:24:13
fantastico palitroquez realmente te esta quedando bordao :)
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: PalitroqueZ en 23 de Enero de 2007, 11:20:43
Gracias elmasvital, esto ya debería llamarse una bitacora, el diario de un pic o algo así jajaja

Seguimos con el módulo USB y con la clase CDC, porque a mi pensar es una manera fácil de usar el cable USB sin meterse tanto en las capas de este protocolo, y la verdad esas librerias que trae el compilador CCS son las que se encargan de todo.

mirando por un momento ¿qué se hizo en el ejemplo anterior?, ¡nos ahorramos el circuito del MAX232!

en este ejemplo6_parte3 vamos a profundizar la transmisión de datos, se tomará el código del ejemplo anterior y se estudiará el comportamiento de las funciones

Código: [Seleccionar]
  usb_enumerated()
 usb_cdc_kbhit()
 usb_cdc_getc()
 usb_cdc_connected()

recordemos que usb_cdc_connected() detecta si el controlador host está enviando datos y usb_enumerated() es para que el PC detecte nuestro dispositivo ( ó función), pero eso no quiere decir que el pic hará otras actividades si el cable está enchufado ó no.

modificando el código de ejemplo6_parte2

Código: [Seleccionar]
/* ejemplo6_parte3.c
 en este ejemplo se tratará de concocer la configuración del dispositivo, cuando
 hay/no hay conexión con el PC mediante los comandos
 usb_enumerated()
 usb_cdc_kbhit()
 usb_cdc_getc()
 usb_cdc_connected()

   adaptación del código original de RRCdcUSB de RedPic
                                 Pedro-PalitroqueZ   14/01/07
*/
#include <18F4550.h>
#fuses XTPLL,MCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL1,CPUDIV1,VREGEN,NOPBADEN
#use delay(clock=48000000)

#define use_portb_lcd TRUE

#include <lcd.c>
#include "usb_cdc.h"

void main(){
   usb_cdc_init(); // llamadas necesarias para iniciar el módulo USB
   usb_init();    // llamadas necesarias  para iniciar el módulo USB
   lcd_init();    // llamadas necesarias para iniciar la LCD
   while(!usb_cdc_connected()) {lcd_putc("\fUSB NO detectadO"); delay_ms(100);}  // para evitarme un retardo y que no parpadee la LCD
   // espera a detectar una transmisión de la PC (Set_Line_Coding)
   lcd_putc("\fUSB DeTectAdo"); delay_ms(600);
   do{
      usb_task();
      if (usb_enumerated()){
         lcd_putc("\fya enumerado\n");  // para evitarme un retardo y que no parpadee la LCD
         lcd_putc("USB ConeCtaDo");  // para evitarme un retardo y que no parpadee la LCD         
         delay_ms(800);         
         if(usb_cdc_kbhit()){ //en espera de nuevo(s) caracter(es) en el buffer
            if(usb_cdc_getc()=='a'){ //¿lo que llegó fué el caracter a?
               lcd_putc("\fdAto rEciBido\n");  // para evitarme un retardo y que no parpadee la LCD
               lcd_putc("de la PC");  // para evitarme un retardo y que no parpadee la LCD
               delay_ms(800); //tiene que ser mayor a 500mS para que no existan parpadeos
            }
         }
      }
   lcd_putc("\fEn El bUClE UsB");  // para evitarme un retardo y que no parpadee la LCD
   delay_ms(700);   
   }while (TRUE); // bucle eterno
}


allí incluí una pantalla LCD, el cuál me mostrará que sucede en determinado momento dentro del código, la idea es conocer que hace el pic cuando:

Código: [Seleccionar]
- no hay conexión
- conectado el cable USB
- ejecutando la aplicación VB
- enviando el dato hacia el dispositivo

y todo eso me lo mostrará en pantalla con unos lcd_putc que coloqué en lugares estrategicos, el código en VB lo modifiqué ligeramente, para que envie un caracter y no reciba ninguno. vamos a grabar el pic y a probar:

video (http://www.4shared.com/file/9344522/98f5f888/e3p6a.html)

estos son los mensajes del LCD y las acciones que llevé a cabo:

        MENSAJES         ->           CASOS POSIBLES
- "USB no detectado" -> el cable USB SI está ó NO está enchufado al PC

- "USB detectado", "ya enumerado USB conectado", "en el bucle USB" -> sucede cuando ejecuto la aplicación en VB

- "dato recibido de la PC" -> sucede cuando clico en el botón 'enviando a al pic'

recomendación: pegar un switche doble para desconectar a D- D+, para no estar a cada rato sacando la extensión y hacer una reconexión fácil.

esto está correcto solo en función del código, pues una vez que entra dentro del bucle no sale, y siempre mostrará que está conectado aunque no sea cierto.

si cierro la aplicación de VB y la vuelvo a abrir hará todo OK, porque seguirá en el mismo bucle.

hay una cosa curiosa que sucedió cuando apliqué un reset al PIC, en administrador de dispositivos reaparece el COM, pero en el programita de VB, se cuelga y no me detecta jamás el puerto a menos que reconecte el cable USB de nuevo, ¿¿?? nueva incognita que tenemos.

la solución a este inconveniente se encuentra en este post (http://www.todopic.com.ar/foros/index.php?topic=15566.0). Esto se llamaría: conexión "en caliente" del lado del software, (ya está arreglado en el video)

el código en VB
Código: [Seleccionar]
' ejemplo6_parte2 comunicación al PIC mediante el puerto virtual COM4 cuya transmisión
' real será por el USB enviando un caracter para confirmarle al PIC, la transmisión
' de una cadena de acuerdo al caracter enviado
' 12-ene-07
' Pedro - PalitroqueZ

' el uso de bandera permite averiguar varios datos para confirmar el estado real
' de la conexión
Option Explicit
Dim value As Long
Dim bandera As Boolean


Private Sub Command2_Click()
    Timer1.Enabled = False
    If MSComm1.PortOpen = True Then
      MSComm1.Output = "a"
    End If
    Timer1.Enabled = True
End Sub


Private Sub Form_Load()
    MSComm1.CommPort = 4
    MSComm1.OutBufferSize = 1 'tamaño del dato a transmitir
   
    Timer1.Interval = 50
    Timer1.Enabled = True
    bandera = False
End Sub

Private Sub Form_Unload(Cancel As Integer)
If MSComm1.PortOpen = True Then
    MSComm1.PortOpen = False
End If
End Sub

Private Sub Timer1_Timer()
On Error GoTo paca
DoEvents
If MSComm1.PortOpen = True Then
    DoEvents
    lblestado.Caption = "Conectado"
    Debug.Print "Conectado"
    MSComm1.PortOpen = False
    Exit Sub
Else
    DoEvents
    MSComm1.PortOpen = True
    Exit Sub
End If
paca: Debug.Print Err.Number & ": " & Err.Description
     Select Case Err.Number
        Case 8002   'Número de puerto no válido
            DoEvents
           lblestado.Caption = "Desconectado"
        Case 8005 'el puerto ya está abierto
            DoEvents
            lblestado.Caption = "puerto abierto"
        Case 8012 '8012 el dispositivo no está abierto
            DoEvents
            lblestado.Caption = "Desconectado"
        Case 8015
            DoEvents    ' para evitar retardos en bucles
            lblestado.Caption = "Desconectado"
    End Select
      Exit Sub
End Sub

en el adjunto (http://www.4shared.com/file/9344451/4f7f55c2/ejemplo6_parte3.html) está todo.

lecturas recomendadas:

- AN956 Migrating Applications to USB from RS-232 UART with Minimal Impact on PC Software (http://ww1.microchip.com/downloads/en/AppNotes/00956b.pdf)

- Emulating RS-232 over USB with PIC18F4550 (http://techtrain.microchip.com/webseminars/UpdateHits.aspx?Type=P&Semid=72&Redir=http://techtrain.microchip.com/webseminars/documents/EmulatingRS-232overUSB_121004.pdf)

continuará...

Salu2
Pedro
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: Slalen en 29 de Enero de 2007, 16:55:19
Que gran trabajo PalitroqueZ!!!!
Me está sirviendo de mucha ayuda "tus primeros pasos".
Necesito aprender a manejar este monstruito para mi proyecto de fin de carrera :?
Os cuelgo las traducciones (http://slalen.4shared.com/) que he hecho
Mis dudas las pongo en este post (http://www.todopic.com.ar/foros/index.php?topic=14135.0)

Gracias por tu tiempo!!!!
Un saludo!!!
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: PalitroqueZ en 07 de Febrero de 2007, 17:59:28
Me alegra que te sirviera en algo toda esta habladera jaja :D

por cierto, gracias por las traducciones. normalmente en este entorno hay que pelear 2 batallas: la del idioma y la del tema en sí.


ya tengo listo todo este tema en formato chm, mejor arreglado, las imagenes a su tamaño normal, todos los adjuntos y videos y quisiera pedir su autorización para publicarlo, ya que hago mucha referencia a este foro y algunos de sus integrantes. (Diego RedPic, Jaime J1M, Mauricio Maunix y perdonen si me olvidé de alguno).

es mejor tener esta documentación en un solo archivo, para no estar bajando link que a posteriori sean rotos, malos, etc

Salu2
Pedro

Título: Re: Mis primeros pasos con el 18F4550
Publicado por: maunix en 07 de Febrero de 2007, 18:35:50
PalitroqueZ, por mi parte no veo inconvenientes en que subas un compendio de lo que hayas elaborado basándote en algo que yo haya dicho y/o comentado. 

Después de todo, no se trata de que "patentemos" las palabras cada frase que uno diga :)  :mrgreen:
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: J1M en 07 de Febrero de 2007, 18:45:20
Enorabuena Pedro :) la cosa va viento en popa!! Por mi parte no hay ningún problema para que hagas lo q quieras con códigos, direcciones, etc. Para eso estan, sigo pensando como el primer día, el conocimiento debe ser libre! ;)
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: micro_cadaver en 07 de Febrero de 2007, 18:56:16
ahora me pongo a estudiar, gracias palitroqueZ
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: Kedutpic en 07 de Febrero de 2007, 21:23:46
 :mrgreen: Muy bueno tu aporte palitroquez , me has dejado sorprendido  :) , ahora me dan mas ganas de seguir estudiando sobre los pic18F.
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: PalitroqueZ en 08 de Febrero de 2007, 12:18:22
Bueno aquí (http://www.4shared.com/file/16086010/f280928d/Mis_primeros_pasos_con_el_18F4550_parte1.html) está amigos, lo revisé muchas veces en busca de errores ortográficos y otras cosas raras (si ven algo que está mal, les ruego que me notifiquen para corregirlo), es lo mismo que coloqué en este tema pero empaquetado y con TODO, esa es una costumbre mia la de organizar los apuntes que hago.

y no crean que eso termina allí, me falta 2 ejemplitos mas sobre el CDC, uno lo llevo a mitad de camino (estoy atascado con este por los momentos  :?)

lo que me faltaría por hacer:

- estudio del USB usando la librería ó biblioteca mpusbapi.dll mediante apis en VB.
- usar el CAD pero con el Reloj interno R-C y comprobar si hay mayor precisión poniendo el pic a dormir durante la conversión.
- hacer varios ejemplos en ensamblador usando las nuevas magnificas instrucciones que trae esta familia.


Salu2
Pedro

nota: el archivito se lleva 41Mb  :shock:, la razón: por los videos.

link corregido: el anterior se había cortado.
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: Slalen en 09 de Febrero de 2007, 08:58:42
Buenas!!
He colgado más cosas aqui (http://slalen.4shared.com):
* Un programa en visual basic para comunicarse con el PicUSB de J1M, es igual que el suyo pero en VB6, funciona con su placa y su firmware (es el estudio que te falta PalitroqueZ)
* Las librerías de C18 de microchip corregidas, su traducción y las abreviaturas traducidas
* Los programas de Microchip de comunicación con el USB (en C18)
* Las palabras de configuración para los PIC18Fxx5x de C18 (en inglés, todo se andará...)
* Actualizaciones con correcciones de alguno de los anteriores
Lo dicho, si veis algún fallo/errata, por favor ¡¡¡Decidlo!!!

Un saludo!! :mrgreen:
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: PalitroqueZ en 09 de Febrero de 2007, 11:47:53
Estupendo Slalen  :-/, ya tengo material para iniciar, hay un código por allí que hicieron y está en VB explicado y todo. no se si está en la web de J1M (no recuerdo donde fué que lo bajé), pero es adicional para empezar a estudiar.  8)

Después de varios dias de descanso y para poner a trabajar al subconsciente en esto del USB seguimos con este módulo, y ¿porqué? es que este módulo es la joya de la corona de este PIC, así que seguiré echandole mano hasta abarcar todo lo necesario para realizar una comunicación PIC<->PC básica.

ya en el ejemplo anterior dimos cuenta de como detectar una conexión por software, desde el punto de vista de un programa en la PC, ahora le toca el turno al hardware del PIC, es decir, que el pic debe detectar al host USB.

hay algo que pasé por alto, desde que empecé con estos ejemplitos del CDC, hay una constante:

Código: [Seleccionar]
#include <18F4550.h>
#fuses XTPLL,MCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL1,CPUDIV1,VREGEN,NOPBADEN
#use delay(clock=48000000)

#include "usb_cdc.h"

void main() {
...

la constante es el llamado al driver usb_cdc.h y no crean que es el único archivo usado, si miran dentro de éste veran después de varias lineas:

Código: [Seleccionar]
#if __USB_PIC_PERIF__
 #if defined(__PCM__)
  #error CDC requires bulk mode!  PIC16C7x5 does not have bulk mode
 #else
  #include <pic18_usb.h>   //Microchip 18Fxx5x hardware layer for usb.c
 #endif
#else
 #include <usbn960x.c>   //National 960x hardware layer for usb.c
#endif
#include "rr2_USB_Cdc_Monitor.h" //USB Configuration and Device descriptors for this UBS device
#include <usb.c>        //handles usb setup tokens and get descriptor reports

como estamos usando el 18F4550 entonces se utilizará el driver pic18_usb.h y además el rr2_USB_Cdc_Monitor.h y el usb.c

caramba se usan varias librerias y estas a su vez llaman a otras.

por ejemplo la rr2_USB_Cdc_Monitor.h es la usb_desc_cdc.h que está en la carpeta driver en PICC, solo que está modificada para identificar nuestro dispositivo como queramos (esto lo explica el amigo RedPic en su página (http://picmania.garcia-cuervo.net/USB_3_CDCTransfers.htm)) de la que me interesa hablar es la librería pic18_usb.h

si observamos el código del ejemplo anterior hay unas funciones de inicialización que hay que llamar para poder empezar a transmitir datos, una de ellas es

Código: [Seleccionar]
usb_init();


si buscamos que hace esa función en pic18_usb.h tenemos:

Código: [Seleccionar]
void usb_init(void) {
   usb_init_cs();

   do {
      usb_task();
   } while (usb_state != USB_STATE_POWERED);
}


si nos metemos dentro de usb_task():

Código: [Seleccionar]
/*****************************************************************************
/* usb_task()
/*
/* Summary: Keeps an eye on the connection sense pin to determine if we are
/*          attached to a USB cable or not.  If we are attached to a USB cable,
/*          initialize the USB peripheral if needed.  If we are disconnected
/*          from the USB cable, disable the USB peripheral.
/*
/*          NOTE: If you are not using a connection sense pin, will automatically
/*                enable the USB peripheral.
/*
/*          NOTE: this enables interrupts once the USB peripheral is ready
/*
/*****************************************************************************/
void usb_task(void) {
   if (usb_attached()) {
...

analicen lo que dice esta función, ahí se habla de un tal connection sense pin que interesante, veamos que hace la función usb_attached():

Código: [Seleccionar]
...
/******************************************************************************
/* usb_attached()
/*
/* Summary: Returns TRUE if the device is attached to a USB cable
/*
/*****************************************************************************/
#if USB_CON_SENSE_PIN
 #define usb_attached() input(USB_CON_SENSE_PIN)
#else
 #define usb_attached() TRUE
#endif
...

uuhmmm esa función está hecha mediante definición y llama a su vez a un tal USB_CON_SENSE_PIN

haciendo una pausa, esto que estoy haciendo es analizando el código inversamente, es decir, mediante una simulación en el MPLAB voy observando donde cae cada llamado para así determinar esa parte del código que me interesa.

¿quién es ese USB_CON_SENSE_PIN? y ¿porque en mi simulación del MPLAB salta sin preguntar por él?. En la nota de arriba dice que si no se está usando, automáticamente se habilitará el módulo USB.

video1 (http://www.4shared.com/file/10330425/1931b444/e6p4v1.html)

la línea BTFSC 0xf6d, 0x3 está preguntando si USBEN=0, mientras que para el primer condicional no aparece su respectiva línea en asm.

ahora que recuerdo en el código que escribió el amigo J1M, aparece una descripción de ese USB_CON_SENSE_PIN
(también aparece en el ejemplo ex_usb_serial2.c que trae el CCS)

Código: [Seleccionar]
/////////////////////////////////////////////////////////////////////////////
//
// If you are using a USB connection sense pin, define it here.  If you are
// not using connection sense, comment out this line.  Without connection
// sense you will not know if the device gets disconnected.
//       (connection sense should look like this:
//                             100k
//            VBUS-----+----/\/\/\/\/\----- (I/O PIN ON PIC)
//                     |
//                     +----/\/\/\/\/\-----GND
//                             100k
//        (where VBUS is pin1 of the USB connector)
//
/////////////////////////////////////////////////////////////////////////////
//#define USB_CON_SENSE_PIN PIN_B2  //CCS 18F4550 development kit has optional conection sense pin
...

y se hace llamar antes que los drivers, quiere decir entonces que hay una forma de detectar (mediante hardware) cuando el host está conectado al PIC y es al sensar un voltaje en un pin establecido, especificamente el voltaje del bus USB (VBUS)

¡vamos a probar pues! usemos el pin RE3 ¿se acuerdan? el del MCLR que solo puede funcionar como entrada digital.

Código: [Seleccionar]
#define USB_CON_SENSE_PIN PIN_E3  //pin de MCLR

hay una cosa que es digna de hacerle un estudio, me refiero a la función       usb_task() que está dentro de usb_init(), si hacen la prueba y se ponen hacer la simulación con el MPLAB descubriran 2 diferencias habilitando/deshabilitando el conection sense pin, otra cosa importante hablando del ejemplo anterior sabemos que el código se encierra dentro de un while

Código: [Seleccionar]
...
   while(!usb_cdc_connected()){
...
}

pero y ¿porque el HOST puede seguir reconociendo a la función aún dentro de ese bucle? si miran dentro de usb_task veran este código:

Código: [Seleccionar]
...
      enable_interrupts(INT_USB);
      enable_interrupts(GLOBAL);
      UIE=__USB_UIF_IDLE | __USB_UIF_RESET;  //enable IDLE and RESET USB interrupt
      usb_state=USB_STATE_POWERED;

 allí se está seleccionado/habilitando la fuente de interrupción USB y cuando se conecta la función al host, se ejecuta uno de los 2 servicios de interrupción de rutina (SRI) :
 
 
Código: [Seleccionar]
usb_isr_rst() -> para el flag __USB_UIF_RESET
 usb_isr_uidle() -> para el flag __USB_UIF_IDLE
 

esto de alguna manera reconecta a la función para que sea reconocida por el HOST. está interesante esta parte, vamos a ver adonde llegamos. ;)
 
nota: me gustaría conocer como se aplica la sentencia debug_usb()
 
leyendo en la ayuda del CCS tenemos que:

Código: [Seleccionar]
usb_task():
If you use connection sense, and the usb_init_cs() for initialization, then you must periodically call this function to keep an eye on the connection sense pin.
When the PIC is connected to the BUS, this function will then perpare the USB peripheral.  When the PIC is disconnected from the BUS, it will reset the USB stack and peripheral.  Will enable and use the USB interrupt. 
Note: In your application you must define USB_CON_SENSE_PIN to the connection sense pin.

usando el pin RE3 (no olviden cambiar el fuse a NOMCLR) como sense pin, vamos hacer unas simulaciones a ver que pasa

video2 (http://www.4shared.com/file/10330433/e9492030/e6p4v2.html)

noten que ahora si aparecen las lineas en asm que corresponden a if(usb_attached()){. allí está preguntando por el estado de RE3

prosigamos con el el MPLAB-SIM, vamos a tener que averiguar que ocurre si hay una interrupción

nota:
 
Código: [Seleccionar]
void usb_cdc_init(void) {
   usb_cdc_line_coding.dwDTERrate=9600;
   usb_cdc_line_coding.bCharFormat=0;
   usb_cdc_line_coding.bParityType=0;
   usb_cdc_line_coding.bDataBits=8;
   (int8)usb_cdc_carrier=0;
   usb_cdc_got_set_line_coding=FALSE;
   usb_cdc_break=0;
   usb_cdc_put_buffer_nextin=0;
   usb_cdc_get_buffer_status.got=0;
   usb_cdc_put_buffer_free=TRUE;
}

me huele a que en esta llamada se hace una especie de configuración tipo USART.

después de  activar el estímulo de RE3 caigo en este segmento de código:

Código: [Seleccionar]
...
if ((usb_state == USB_STATE_ATTACHED)&&(!UCON_SE0)) {
 UIR=0;
 UIE=0;
 enable_interrupts(INT_USB);
 enable_interrupts(GLOBAL);
 UIE=__USB_UIF_IDLE | __USB_UIF_RESET;  //enable IDLE and RESET USB interrupt
 usb_state=USB_STATE_POWERED;
 debug_usb(debug_putc, "\r\n\nUSB TASK: POWERED");

este código ya lo había puesto antes, pues bien, después de un largo rato no pude simular esa interrupción. :(

queda una cosa por averiguar: que esa interrupción debe ocurrir cuando hay un detached, es decir, se desconecta el HOST de la función, ¿porque digo esto?, porque si sigo simulando me doy cuenta que llego al bucle main y allí caigo en el bucle eterno

Código: [Seleccionar]
   while(!usb_cdc_connected()) { //bucle eterno
delay_cycles(1);}  // para evitarme un retardo y que no parpadee la LCD

leyendo en el driver pic18_usb.h sobre esta línea:

Código: [Seleccionar]
UIE=__USB_UIF_IDLE | __USB_UIF_RESET;  //enable IDLE and RESET USB interrupt


tenemos unos defines:

Código: [Seleccionar]
#define __USB_UIF_IDLE     0x10 -> bit 4
#define __USB_UIF_RESET    0x01 ->  bit 0

si nos vamos a la datasheet del 18F4550, pág 180 nos encontarmos un SFR llamado UIR

(http://img175.imageshack.us/img175/8762/uirgm5.th.jpg) (http://img175.imageshack.us/my.php?image=uirgm5.jpg)

este SFR contiene los flags de los estados de interrupción seleccionados por UIE

(http://img248.imageshack.us/img248/8338/uieqv3.th.jpg) (http://img248.imageshack.us/my.php?image=uieqv3.jpg)

con este par de bits lo que hacemos es seleccionar el par USB Reset Interrupt y Idle Detect Interrupt Enable bit

otro dato importante, si nos vamos a la descripción de ambos servicio de interrupción, veremos

para el RESET:

Código: [Seleccionar]
/*******************************************************************************
/* usb_isr_rst()
/*
/* Summary: The host (computer) sent us a RESET command.  Reset USB device
/*          and token handler code to initial state.
/*
/********************************************************************************/

para el estado IDLE:
/*******************************************************************************
/* usb_isr_uidle()
/*
/* Summary: USB peripheral detected IDLE.  Put the USB peripheral to sleep.
/*
/********************************************************************************/

nuevamente deduzco lo siguiente:
- que ambos casos sirven para detectar el estado HOST<->PIC.
como lamentablemente no puedo hacer la simulación, no me queda de otra que probar el código en el protoboard, pero haciendo unas modificaciones, el código quedará así:

Código: [Seleccionar]
/* ejemplo6_parte4_temp.c
 en este ejemplo se tratará se ordenará al PIC reconocer la detección del HOST USB de la PC

   adaptación del código original de RRCdcUSB de RedPic
                                 Pedro-PalitroqueZ   4/feb/07
*/
#include <18F4550.h>
#fuses XTPLL,NOMCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL1,CPUDIV1,VREGEN,NOPBADEN
#use delay(clock=48000000)

#define use_portb_lcd TRUE

#define USB_CON_SENSE_PIN PIN_E3
#include <lcd.c>
#include "usb_cdc.h"

void main(){
   lcd_init();    // llamadas necesarias para iniciar la LCD
usb_cdc_init(); // llamadas necesarias para iniciar el módulo USB
   usb_init();    // llamadas necesarias  para iniciar el módulo USB
   while(!usb_cdc_connected()) { //bucle eterno
delay_us(500);
   }
   do{
    usb_task();
delay_us(500);
   }while (TRUE); // bucle eterno
}

y en el driver pic18_usb.h coloqué un par de lineas nuevas:

Código: [Seleccionar]
void usb_attach(void) {
   usb_token_reset();
lcd_putc("\fUSB CONECTADO");
delay_ms(100);
...
}

void usb_detach(void) {  //done
lcd_putc("\fUSB DESCONECTADO");
delay_ms(100);
...
}

nota: me molesta este warning que me sale en output:

Código: [Seleccionar]
>>> Warning 216 "C:\18F\ejemplo6_parte4\ejemplo6_parte4_temp.c" Line 31(0,1): Interrupts disabled during call to prevent re-entrancy:  (usb_token_reset)

después de revisar bien las conexiones, el .lst para ver si estan OK los fuses, se procede a grabar el PIC y a ensayar:

con el HOST:

(http://img248.imageshack.us/img248/8836/conectadoxx9.th.jpg) (http://img248.imageshack.us/my.php?image=conectadoxx9.jpg)

sin el HOST:

(http://img329.imageshack.us/img329/1824/desconectadolf4.th.jpg) (http://img329.imageshack.us/my.php?image=desconectadolf4.jpg)

¡arrg! que mala pata, se queda activado el USB CONECTADO aún después de desconectar al HOST :(

obviamente hay que revisar nuevamente a pic18_usb.h

vamos a repasar, según mi hipótesis para que el módulo USB arranque la función usb_task() debe esperar por el nivel alto en RE3 (proveniente de Vusb) y si ocurre selecciona/habilita la interrupción para los casos USB Reset e Idle Detect hasta aquí vamos bien, ahora ¿que debe ocurrir para que ocurra una de esas 2 interrupciones?

primero que nada si ocurre una interrupción el contador de programa se vá para:

Código: [Seleccionar]
#int_usb
void usb_isr() {
   if (usb_state==USB_STATE_DETACHED) return;   //should never happen, though
   if (UIR) {
      debug_usb(debug_putc,"\r\n\n[%X] ",UIR);
      if (UIR_ACTV && UIE_ACTV) {usb_isr_activity();}  //activity detected.  (only enable after sleep)

      if (UCON_SUSPND) return;

      if (UIR_UERR && UIE_UERR) {usb_isr_uerr();}          //error has been detected

      if (UIR_URST && UIE_URST) {usb_isr_rst();}        //usb reset has been detected

      if (UIR_IDLE && UIE_IDLE) {usb_isr_uidle();}        //idle time, we can go to sleep
      if (UIR_SOF && UIE_SOF) {usb_isr_sof();}
      if (UIR_STALL && UIE_STALL) {usb_isr_stall();}        //a stall handshake was sent

      if (UIR_TRN && UIE_TRN) {
         usb_isr_tok_dne();
         UIR_TRN=0;    // clear the token done interrupt., 0x190.3
      }    //a token has been detected (majority of isrs)
   }
}

ahí está otra vez el debug_usb(), me intriga saber como se usa??. esa línea es crucial porque se puede averiguar quien demonios fué el flag que se activó. voy a ser práctico, sustituiré a debug_usb por printf así:

Código: [Seleccionar]
printf(lcd_putc,"\f UIR= %X",UIR);
 delay_ms(500);

nota: en la ventana output me aparecen mas warnings misteriosos:

Código: [Seleccionar]
>>> Warning 216 "C:\18F\ejemplo6_parte4\ejemplo6_parte4_temp.c" Line 32(0,1): Interrupts disabled during call to prevent re-entrancy:  (@delay_ms1)
>>> Warning 216 "C:\18F\ejemplo6_parte4\ejemplo6_parte4_temp.c" Line 32(0,1): Interrupts disabled during call to prevent re-entrancy:  (lcd_send_nibble)
>>> Warning 216 "C:\18F\ejemplo6_parte4\ejemplo6_parte4_temp.c" Line 32(0,1): Interrupts disabled during call to prevent re-entrancy:  (lcd_send_byte)
>>> Warning 216 "C:\18F\ejemplo6_parte4\ejemplo6_parte4_temp.c" Line 32(0,1): Interrupts disabled during call to prevent re-entrancy:  (lcd_putc)

pero yo pa´lante como el burro testarudo cuando no quiere caminar, grabar el pic, probar y..

sin conetctar el HOST: USB CONECTADO
[1]conectando al HOST:  UIR= 10 y luego cambia a 01
[2]desconectando el HOST: UIR=54 y luego cambia a 44

y para rematar al poco tiempo me sale un mensaje del windows diciendo que no reconoce al dispositivo.

54-> 01010100
44-> 01000100

[1]: el flag correcto es USB reset
[2]: los flags involucrados son: start of frame, idle detect y  bus activity

señores, ¡esto se complicó! lo mejor es entrarle por otro lado, la experiencia que he tenido me dice que cuando algo se complica, es que por ahí no es la solución.

mirando por enésima vez el código principal veo que aparte de que hacen la llamada usb_task() dentro de usb_init() la hacen afuera , es decir, se puede usar estas funciones dentro de nuestro código como queramos.

esta usb_init es importante porque habilita o no el módulo USB, ¿y que tal si usamos esa función en vez de meternos con el driver?

para ello tendremos que quitar la linea:

Código: [Seleccionar]
while(!usb_cdc_connected()) { //bucle eterno

eso no nos importa por ahora, yo no voy a enviar datos al pic, ¡lo único que quiero es que el pic me diga si o no! :)

vamos a intentar ooootra vez:

Código: [Seleccionar]
/* ejemplo6_parte4_temp.c
 en este ejemplo se tratará se ordenará al PIC reconocer la detección del HOST USB de la PC

   adaptación del código original de RRCdcUSB de RedPic
                                 Pedro-PalitroqueZ   4/feb/07
*/
#include <18F4550.h>
#fuses XTPLL,NOMCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL1,CPUDIV1,VREGEN,NOPBADEN
#use delay(clock=48000000)

#define use_portb_lcd TRUE

#define USB_CON_SENSE_PIN PIN_E3
#include <lcd.c>
#include "usb_cdc.h"

void main(){
lcd_init();    // llamadas necesarias para iniciar la LCD
usb_cdc_init(); // llamadas necesarias para iniciar el módulo USB
    usb_init();    // llamadas necesarias  para iniciar el módulo USB
   do{
    usb_task();
delay_us(500);
   }while (TRUE); // bucle eterno
}



simulación en MPLAB.wmv (http://www.4shared.com/file/10330462/e339e4e3/e6p4v3.html)

en el video anterior quité lo relacionado a la pantalla LCD para resaltar la parte importante, pero al grabar el PIC se las puse de nuevo:

video en protoboard_e6p4v4.wmv (http://www.4shared.com/file/10330512/adba1813/e4p6v4.html)

ahora si funcionó, aunque fuera por poleo (no veo ninguna interrupción aquí) pero algo es algo, ya sabemos que: con la función usb_task() podemos determinar el estado de conexión.
 
observación: el error que me apareció en el windows al no detectar el dispositivo en cierto tiempo se debió al retardo de 500mS que metí en #int USB
 
seguro alguien preguntará: ¿bueno pero si no habilito el sense pin hará lo mismo?. y yo le responderé que no, puesto que con esa deshabilitación, el módulo USB siempre estará encendido. (comprobado)

el problema no termina aquí, la idea principal es escribir un código donde se muestre el estado y que aparte realice otras actividades.


 
el adjunto (http://www.4shared.com/file/10330523/f1907b46/ejemplo6_parte4.html) con el fuente, circuito eléctrico, etc.

Salu2
Pedro

moraleja de este ejemplo: ¿a que vuelta se echa el perro?. R: a la última :)
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: Cryn en 09 de Febrero de 2007, 16:43:49
muy buen trabajo PalitroqueZ, mis felicitaciones.

Slalen nose si pudieras colocar todos los archivos del vb, para que los que se inician en ello tb aprendan sobre el software que va en la PC, estaria mas completo creo, si es que podes, weno gracias, adios!!
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: RedPic en 09 de Febrero de 2007, 16:50:19
Pedro, déjame que te felicite por tu magnifico trabajo. Te está quedando de dulce.  :mrgreen:
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: PalitroqueZ en 12 de Febrero de 2007, 16:13:45
Gracias, maestro. ;)

Quería continuar con un ejemplo práctico (de hecho ya lo comencé), pero hay unos detalles que vale la pena mencionar.

según el análisis anterior, se dijo que la llamada usb_task() era fundamental, porque a través de attach() y detach() podiamos hacer las reconexiones, pues bien, esto es muy cierto, pero hay más, busquemos en la ayuda de CCS varios conceptos:

Código: [Seleccionar]
usb_init():
Initializes the USB hardware.  Will then wait in an infinite loop for the USB  peripheral to be connected to bus (but that doesn't mean it has been enumerated by the PC).  Will enable and use the USB interrupt.
 
usb_init_cs():
The same as usb_init(), but does not wait for the device to be connected to the bus.  This is useful if your device is not bus powered and can operate without a USB connection.

usb_task():
If you use connection sense, and the usb_init_cs() for initialization, then you must periodically call this function to keep an eye on the connection sense pin.

When the PIC is connected to the BUS, this function will then perpare the USB peripheral.  When the PIC is disconnected from the BUS, it will reset the USB stack and peripheral.  Will enable and use the USB interrupt. 

Note: In your application you must define USB_CON_SENSE_PIN to the connection sense pin.

usb_detach():
Removes the PIC from the bus.  Will be called automatically by usb_task() if connection is lost, but can be called manually by the user.

usb_attach():
Attaches the PIC to the bus.  Will be called automatically by usb_task() if connection is made, but can be called manually by the user.
 
usb_attached():
If using connection sense pin (USB_CON_SENSE_PIN), returns TRUE if that pin is high.  Else will always return TRUE.

usb_enumerated():
Returns TRUE if the device has been enumerated by the PC.  If the device has been enumerated by the PC, that means it is in normal operation mode and you can send/receive packets.

noten la diferencia de usb_init() con usb_init_cs(), si queremos ejecutar otros procesos en el micro usb_init() no nos serviría, porque se quedaría en un bucle esperando al HOST (COMPROBADO), y esto no es lo que se quiere, entonces se usará la otra función.

Esta otra llamada usb_init_cs() va de la mano con usb_task(), porque una vez detectada Vbus a través de USB_CON_SENSE_PIN, en task se procede a conectar el bus.

lo principal aquí es estar monitoreando continuamente a USB_CON_SENSE_PIN, ya sea a través de usb_attached() ó de usb_task().

hay otra llamada adicional (aquí se llama a un gentío :)) y es usb_enumerated(), en el concepto dice que su resultado es un boolean y dependerá de lo que diga el HOST

Código: [Seleccionar]
usb_enumerated(): // proviene de USB.C
returns TRUE if device has been enumerated (configured) by host, FALSE if it has not.  Do not try to use the USB peripheral until you are enumerated.

es cierto porque si quiero hacer transacción de datos con la PC, ambos tienen que estar de acuerdo.

nota: hay que entender bien porque estan estas funciones y porque se deben ejecutar.

bueno, ya entendido estos conceptos, vamos hacer otro ejemplo. Recuerden: el PIC debe ejecutar otros procesos independientemente si está o no está el HOST.

Código: [Seleccionar]
/* probando_USB.c
 es una modificación del ejemplo6_parte4, aquí se usa una bandera global
 que determinará el estado de conexión del USB, mediante las llamadas
 usb_attach y usb_detach en pic18_usb.h
 
   Modificación del código original de RRCdcUSB de RedPic
                                 Pedro-PalitroqueZ   11-feb-07
*/
#include <18F4550.h>
#fuses XTPLL,NOMCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL1,CPUDIV1,VREGEN,NOPBADEN
#use delay(clock=48000000)

#define use_portb_lcd TRUE
short estado_usb;   // boolean global, se debe declarar antes de llamar a usb_cdc.h
#define USB_CON_SENSE_PIN PIN_E3
#include <lcd.c>
#include "usb_cdc.h"

void mostrar_estado_usb(short bandera);

void main(){
   estado_usb=false;
   usb_cdc_init(); // llamadas necesarias para iniciar el módulo USB
   usb_init_cs();    // inicia el USB y sale. va a la par con usb_task()
   lcd_init();    // llamadas necesarias para iniciar la LCD
while(true){
     usb_task(); // configura el USB
     mostrar_estado_usb(estado_usb);
     if(usb_cdc_connected()){
   // espera a detectar una transmisión de la PC (Set_Line_Coding)
       if (usb_enumerated()){ // aquí se hace el acceso HOST<->PC y después sale
          if(usb_cdc_kbhit()){ //en espera de nuevo(s) caracter(es) en el buffer
             if(usb_cdc_getc()=='a'){ //¿lo que llegó fué el caracter a?

                printf(usb_cdc_putc, "Llegó la letra a\n\r"); // envia una respuesta al HOST   --FALTABA ESTA LÍNEA--

                lcd_gotoxy(1,1);
            lcd_putc("llego una a     ");
                delay_ms(500);
             }
          }
       }
     }
//*************** aquí se ejecutan otros procesos*********************//
      lcd_gotoxy(1,1);
  lcd_putc("otros procesos");
  delay_ms(500);
}
}
/************************************************
// esta llamada imprime en la LCD los estados de conectado
// y desconectado del USB dependiendo de la bandera
// estado_usb
//***********************************************/
void mostrar_estado_usb(short bandera){
 lcd_gotoxy(10,2);
 if(bandera){
  lcd_putc(" USB:On");
 }else{
  lcd_putc("USB:Off");
 }
 delay_ms(500);
}

para el programa en PC, se utilizará una mezcla del ejemplo6_parte(2,3).

código en VB
Código: [Seleccionar]
' ejemplo6_parte5 comunicación al PIC mediante el puerto virtual COM4 cuya transmisión
' real será por el USB enviando un caracter para confirmarle al PIC, la transmisión
' de una cadena de acuerdo al caracter enviado
' 12-feb-07
' Pedro - PalitroqueZ

' el uso de bandera permite averiguar varios datos para confirmar el estado real
' de la conexión
Option Explicit
Dim value As Long
Dim bandera As Boolean


Private Sub Command1_Click()
If MSComm1.PortOpen = True Then
    MSComm1.PortOpen = False
End If
End
End Sub

Private Sub Command2_Click()
    Timer1.Enabled = False
    If MSComm1.PortOpen = True Then
      MSComm1.Output = "a"
    End If
    Timer1.Enabled = True
End Sub


Private Sub Form_Load()
    MSComm1.CommPort = 4
    MSComm1.OutBufferSize = 1 'tamaño del dato a transmitir
    MSComm1.InBufferSize = 16  '16 caracteres
    'MSComm1.PortOpen = True
   
    MSComm1.InputLen = 16  ' BUFFER DE ENTRADA SE PUEDE DEJAR AL MAXIMO
    MSComm1.RThreshold = 16 '
   
    Timer1.Interval = 10
    Timer1.Enabled = True
    bandera = False
End Sub

Private Sub Form_Unload(Cancel As Integer)
If MSComm1.PortOpen = True Then
    MSComm1.PortOpen = False
End If
End Sub


Private Sub MSComm1_OnComm()
Dim InBuff As String
Select Case MSComm1.CommEvent
    Case comEvReceive
    InBuff = MSComm1.Input
    Debug.Print InBuff
    Text1.Text = ""
    Text1.Text = Left$(InBuff, 16)  ' se recorta los caracteres basura
    MSComm1.PortOpen = False  'cierra el puerto y vacia el buffer
    Espera 2  ' retardo de  2 segundos
    Text1.Text = ""
End Select
End Sub

Private Sub Timer1_Timer()
On Error GoTo paca
DoEvents
If MSComm1.PortOpen = True Then
    DoEvents
    lblestado.Caption = "Conectado"
    Debug.Print "Conectado"
    MSComm1.PortOpen = False
    Exit Sub
Else
    DoEvents
    MSComm1.PortOpen = True
    Exit Sub
End If
paca: Debug.Print Err.Number & ": " & Err.Description
     Select Case Err.Number
        Case 8002   'Número de puerto no válido
            DoEvents
           lblestado.Caption = "Desconectado"
        Case 8005 'el puerto ya está abierto
            DoEvents
            lblestado.Caption = "puerto abierto"
        Case 8012 '8012 el dispositivo no está abierto
            DoEvents
            lblestado.Caption = "Desconectado"
        Case 8015
            DoEvents    ' para evitar retardos en bucles
            lblestado.Caption = "Desconectado"
    End Select
      Exit Sub
End Sub

' procedimiento de retardo
'este código NO es de mi autoría, lo bajé del internet.
Sub Espera(Segundos As Single)
  Dim ComienzoSeg As Single
  Dim FinSeg As Single
  ComienzoSeg = Timer
  FinSeg = ComienzoSeg + Segundos
  Do While FinSeg > Timer
      DoEvents
      If ComienzoSeg > Timer Then
          FinSeg = FinSeg - 24 * 60 * 60
      End If
  Loop
End Sub

ahora compilemos, grabemos, montemos y probemos:

video_en_acción.wmv (http://www.4shared.com/file/10504754/3daaa2d6/e6p5v1.html)

la verdad que este ejemplo está bastante completo, se puede decir que logramos el objetivo, a pesar que en el video se observa cierta retraso en la respuesta y esto es debido a los retardos que introducí tanto en código del PIC, como en VB para que pudiera observar la ejecución un poco mas lenta, se cumplen todos los casos (en los ensayos que hice)

casos:
función conectada/deconectada al HOST:
 - el programa en VB funciona OK (ya lo habiamos comprobado en el ejemplo6_parte3)
 
programa en VB:
- de parte del micro, detecta al HOST y lo muestra en pantalla LCD, y ejecuta la transmisión HOST->PC, aparte que continua ejecutando otros procesos, y todo ello ¡independiente del módulo USB!

en el adjunto (http://www.4shared.com/file/10500420/f8a2d906/ejemplo6_parte5.html) está el código fuente, circuito eléctrico, etc.

Salu2
Pedro

------------------------------------------------------------
Revisión: En el código para el pic que coloqué arriba, me faltó escribir esta línea:
Código: [Seleccionar]
printf(usb_cdc_putc, "Llegó la letra a\n\r"); // envia una respuesta al HOST

ya se la agregué, en el adjunto si estaba OK
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: PalitroqueZ en 12 de Febrero de 2007, 19:27:24
¿sabian que existen unas aplicaciones (software y software+hardware) que hacen de analizadores de protocolos para puertos USB.? existen muchos, hay uno llamado SnoopyPro (http://sourceforge.net/projects/usbsnoop/). (licencia GPL)

me dió curiosidad y lo bajé. lo primero ver las instrucciones:

Código: [Seleccionar]
SnoopyPro is a tool for advanced USB programmers. It allows you to record
each URB sent to and received from a USB device. This traces can be saved,
loaded, edited, printed and combined into new traces.

WARNING: You might damage your system with this tool. Don't use it if
you don't know what you're doing!!!! We're not responsible for anything
that happens to you, your system, your devices, your marriage, etc. etc.

...

==========================================================================
INSTALLATION/USE:
==========================================================================

1. Run SnoopyPro.exe from whereever you have saved it.
2. Open up the USB devices window with F2.
3. Choose 'Unpack Drivers' from the 'File' menu.
4. Choose 'Install Service' from the 'File' menu.
5. Locate the device you want to sniff.
6. Right-click on it and choose 'Install and Restart'.
7. Wait for the magic to happen...
...


(http://img266.imageshack.us/img266/233/ventanaol7.th.jpg) (http://img266.imageshack.us/my.php?image=ventanaol7.jpg)

siguiendo los pasos1,2,3 y buscamos el COM4 de nuestro ejemplo anterior

(http://img266.imageshack.us/img266/944/28567078zc1.th.jpg) (http://img266.imageshack.us/my.php?image=28567078zc1.jpg)

cargamos la aplicación en VB

(http://img513.imageshack.us/img513/6773/50580555gn2.th.jpg) (http://img513.imageshack.us/my.php?image=50580555gn2.jpg)

después de clicar varias veces en el botón "Enviando a al PIC" detenemos el escaneo:

(http://img457.imageshack.us/img457/5503/50245592ux0.th.jpg) (http://img457.imageshack.us/my.php?image=50245592ux0.jpg)

y empezamos a husmear :) después de unas decenas de lineas nos encontramos con esta:

(http://img513.imageshack.us/img513/6538/34748234uz3.th.jpg) (http://img513.imageshack.us/my.php?image=34748234uz3.jpg)

abrimos a ver que hay:

(http://www.todopic.com.ar/foros/index.php?action=dlattach;topic=15208.0;attach=5331)

coincide con el carácter "a" que se envía al PIC en hexa ¿coincidencia?. si miramos unas lineas mas abajo, no encontramos con un par de caracteres mas y una cadena

(http://img513.imageshack.us/img513/6034/53671789kv8.th.jpg) (http://img513.imageshack.us/my.php?image=53671789kv8.jpg)

la coincidencia a la que me refiero es que la cadena que envía el PIC al PC es:

Llegó la letra a

cuya interpretación en hexa sería:

4C 6C 65 67 F3 20 6C 61 20 6C 65 74 72 61 20 61

¡muy interesante!

Salu2
Pedro
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: PalitroqueZ en 14 de Febrero de 2007, 13:43:06
¡Ahora si!, vamos con una aplicación. Este ejemplo hará los siguiente:

- se utilizará el CAD.
- el resultado del CAD se mostrará en una LCD y se enviaran a la computadora por USB.
- si no hay conexión, entonces los datos se mostraran solo en la LCD.
- para ambos casos se indicará en la LCD el estado de conexión.
- se aplicará un mini-protocolo a la transmisión, cuando el software en la PC esté listo enviará un caracter al PIC y éste deberá recibir dicho carácter para enviar el dato correspondiente a la PC (una especie de ACK).
- el resultado del CAD se mostrará en un pantalla LCD de 2 modos, justificación a la izquierda ó a la derecha, dependiendo del cambio de un switche.

pero vamos por partes, primero hay que construir el código del CAD y la LCD, es decir, sin involucrar al USB. Para ello emplearemos al proteus (esto es para agilizar el proceso de depuración y simulación) y usaremos un pic similar al 18F4550, me refiero al 18F4525.

el código que escribí:

Código: [Seleccionar]
#include <18f4525.h> //archivo de cabecera

#DEVICE ADC=10 // cad a 10 bits, justificación a a la derecha
#fuses XT,NOWDT,NOPROTECT,NOLVP,NODEBUG // el fuse que configuramos anteriormente
#use delay(clock=4000000) // el clock que tendremos a la entrada del CPU

#define use_portb_lcd TRUE
#include <LCD.c>
#define DERECHA 0
#define IZQUIERDA 1

long  value;
void config_adcon2(short justificacion);

void main(){
int i;
OUTPUT_A(0);  // todos salidas
OUTPUT_B(0);           
OUTPUT_C(0);
OUTPUT_D(0);           
OUTPUT_E(0);
lcd_init();    // inicia la LCD
   set_tris_a(0x3);  // ra0=entradas, los demas=salida
   set_tris_b(0x0); 
   set_tris_c(0x0);             
   set_tris_d(0x0);             
   set_tris_e(0x0);             
   setup_adc_ports( AN0 || VSS_VDD );  // canal AN0, Vref+ = Vdd, Vref- = Vss
   config_adcon2(DERECHA);
   lcd_putc("\f");  // para evitarme un retardo y que no parpadee la LCD
   while(1){ // bucle infinito
     value = read_adc();
     if(input_state(PIN_A1)){ //pregunta por el switche
     config_adcon2(DERECHA);
   }else{
   config_adcon2(IZQUIERDA);
   }
   for(i=0;i<16;i++){
    lcd_gotoxy(16-i,1);
    lcd_putc((char)(bit_test(value,i)+0x30));
   }
   printf(lcd_putc,"\n0x%Lx",value);
   }
}
//-----------------------------------------------------------------------------------------
// cumple la función de configurar el bit ADFM para hacer
// la justificación, también se incluye el retardo por hardware de Tacq
// datos de entrada: bandera de justificación
// datos de salida: nada
//-----------------------------------------------------------------------------------------
void config_adcon2(short justificacion){
   setup_adc(ADC_CLOCK_DIV_64 );  // reloj de conversión = Fosc / 64
   if(justificacion){
   #asm
     bsf 0xFC0,7    // ADFM <- 1
     #endasm
   }
   else{
   #asm
    bcf 0xFC0,7   // ADFM <- 0
   #endasm
   }
   #asm          // configura Tacq = 2Tad
    bsf 0xFC0,3
    bcf 0xFC0,4
    bcf 0xFC0,5
   #endasm
   set_adc_channel(0);
}

nota offtopic: para editar los programas que vayan a pegar usando {code}{/code}, les recomiendo el Notepad++ (http://notepad-plus.sourceforge.net/) tiene una excelente opción donde podemos ver las tabulaciones y los espacios.

simulamos el código a ver que tal:

video_e6p6v1.wmv (http://www.4shared.com/file/10612109/a47e525e/e6p6v1.html)

cambiamos el código para usarlo en el 18F4550:

Código: [Seleccionar]
#include <18f4550.h> //archivo de cabecera

#DEVICE ADC=10 // cad a 10 bits, justificación a a la derecha
#fuses XTPLL,NOMCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL1,CPUDIV1,NOVREGEN,NOPBADEN
#use delay(clock=48000000)

// el resto queda igual
...
...

video_e6p6v2.wmv (http://www.4shared.com/file/10612216/2f9cc0d7/e6p6v2.html)

notas:
la directiva #DEVICE ADC=16 realiza la justificación a la izquierda, no la usaré en este ejemplo, porque solamente se puede usar una vez (el compilador te lo dirá).

ya sabemos que el código funciona perfectamente, no tenemos que preocuparnos por esa parte, ahora tenemos que concatenar la sección de la transmisión USB

tomando del ejemplo anterior, nuestro código quedaría así:

Código: [Seleccionar]
/* aplicación al ejemplo6_parte5, el resultado del CAD se enviará a una LCD
   y al mismo tiempo (si hay conexión) al PC, mostrando el estado del USB.
   se ha incluido una bandera en la librería pic18_usb.h de manera de saber
   cuando ocurre la llamada attach y detach
   parte de este código corresponde al original de RRCdcUSB de RedPic
                                 Pedro-PalitroqueZ   13-feb-07
*/

#include <18F4550.h>
#DEVICE ADC=10 // cad a 10 bits, justificación a a la derecha
#fuses XTPLL,NOMCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL1,CPUDIV1,VREGEN,NOPBADEN
#use delay(clock=48000000)

#define use_portb_lcd TRUE
#define USB_CON_SENSE_PIN PIN_E3
#define DERECHA 0
#define IZQUIERDA 1

short estado_usb;   // boolean global, se debe declarar antes de llamar a usb_cdc.h

#include <lcd.c>
#include "usb_cdc.h"

long  value;
void config_adcon2(short justificacion);
void mostrar_estado_usb(short bandera);

void main(){
   int i;
   set_tris_a(0x3);  // ra[1,0]=entradas, los demas=salida
   estado_usb=false;
   usb_cdc_init(); // llamadas necesarias para iniciar el módulo USB
   usb_init_cs();    // inicia el USB y sale. va a la par con usb_task()
   lcd_init();    // llamadas necesarias para iniciar la LCD
   setup_adc_ports( AN0 || VSS_VDD );  // canal AN0, Vref+ = Vdd, Vref- = Vss
   config_adcon2(DERECHA);

while(true){
     usb_task(); // configura el USB
     mostrar_estado_usb(estado_usb);
     value = read_adc();
     if(input_state(PIN_A1)){ //pregunta por el switche
     config_adcon2(DERECHA);
     }else{
     config_adcon2(IZQUIERDA);
     }
     for(i=0;i<16;i++){
      lcd_gotoxy(16-i,1);
      lcd_putc((char)(bit_test(value,i)+0x30));
     }
     printf(lcd_putc,"\n0x%Lx",value);

     if(usb_cdc_connected()){
   // espera a detectar una transmisión de la PC (Set_Line_Coding)
       if (usb_enumerated()){ // aquí se hace el acceso HOST<->PC y después sale
          if(usb_cdc_kbhit()){ //en espera de nuevo(s) caracter(es) en el buffer
             if(usb_cdc_getc()=='a'){ //¿lo que llegó fué el caracter a?
                printf(usb_cdc_putc,"%Lx", value); // envia el ADRESH:ADRESL al HOST
             }
          }
       }
     }
}
}
/************************************************
// esta llamada imprime en la LCD los estados de conectado
// y desconectado del USB dependiendo de la bandera
// estado_usb
//***********************************************/
void mostrar_estado_usb(short bandera){
 lcd_gotoxy(10,2);
 if(bandera){
  lcd_putc(" USB:On");
 }else{
  lcd_putc("USB:Off");
 }
 //delay_ms(500);
}
//-----------------------------------------------------------------------------------------
// cumple la función de configurar el bit ADFM para hacer
// la justificación, también se incluye el retardo por hardware de Tacq
// datos de entrada: bandera de justificación
// datos de salida: nada
//-----------------------------------------------------------------------------------------
void config_adcon2(short justificacion){
   setup_adc(ADC_CLOCK_DIV_64 );  // reloj de conversión = Fosc / 64
   if(justificacion){
    #asm
      bsf 0xFC0,7    // ADFM <- 1
    #endasm
   }
   else{
    #asm
     bcf 0xFC0,7   // ADFM <- 0
    #endasm
   }
   #asm          // configura Tacq = 2Tad
     bsf 0xFC0,3
     bcf 0xFC0,4
     bcf 0xFC0,5
   #endasm
   set_adc_channel(0);
}

hay otro detalle que nunca he mencionado, ¿a que velocidad transmite esto? cuando se ejecuta la función usb_cdc_init() aparece:

Código: [Seleccionar]
   usb_cdc_line_coding.dwDTERrate=9600;
   usb_cdc_line_coding.bCharFormat=0;
   usb_cdc_line_coding.bParityType=0;
   usb_cdc_line_coding.bDataBits=8;
   ...

esto forma parte de una estructura en la que sería 9600 bits/sec, 1 bit de parada, sin paridad, 1 byte de datos. Esto es conocido por el MSCOMM: 9600,n,8,1

hasta este punto lo que resta es checar bien el programa (porque no se puede simular :() compilar, grabar, y probar... ¡Brrr! tengo frío señores :lol:, ¿será que funcionará?

video_e6p6v3.wmv (http://www.4shared.com/file/10612322/21e3d3a/e6p6v3.html)

en el video anterior usé el Siow que trae el CCS, bien ya comprobamos que el pic está haciendo correctamente todo lo que tiene que hacer  :-/

ahora hay que hacer el programa en VB para darle un toque de elegancia a los datos obtenidos:

Código: [Seleccionar]
' ejemplo6_parte2 comunicación al PIC mediante el puerto virtual COM4 cuya transmisión
' real será por el USB enviando un caracter para confirmarle al PIC, la transmisión
' del resultado del CAD
' 13-feb-07    Pedro - PalitroqueZ
Option Explicit
Dim value As Long
Const color_verde = &HFF00&
Const color_rojo = &HFF&
Dim bandera As Boolean


Function cambiar(valor As Long)
Dim t As Integer: Dim asa As String: Dim pepe As String
pepe = HEXA_BIN(CStr(Hex(valor)))
'Debug.Print "pepe= " & Len(pepe)
'MsgBox pepe
For t = 1 To 16
'    Debug.Print pepe
    asa = Mid$(pepe, t, 1)
'    Debug.Print asa
    Label1(t - 1).Caption = asa   ' es t-1 porque la matriz cuenta desde 0
 Next t

End Function

Private Sub Check1_Click()
On Error GoTo palla
DoEvents
If Check1.value = 1 Then
    DoEvents
    Timer1.Enabled = False
    Check1.ForeColor = &H8000&
    Check1.Caption = "Recibiendo datos..."
    If MSComm1.PortOpen = True Then
      Timer2.Enabled = True
    End If
    Timer1.Enabled = True
Else
    DoEvents
    Timer2.Enabled = False
    Check1.value = 0
    cambiar (0) '
    separar (0) ' limpia los caracteres del display
    Check1.ForeColor = color_rojo
    Check1.Caption = "Nada que recibir"
    Timer1.Enabled = True
End If
Exit Sub
palla:
    DoEvents
'  Check1.value = 0
  'Check1.ForeColor = color_rojo
  'Check1.Caption = "Nada que recibir"
  Timer2.Enabled = False
  Timer1.Enabled = True
 Exit Sub
End Sub


Function separar(valor1 As Long)
Dim i As Integer: Dim cadena As String
cadena = CStr(Hex(valor1))
Select Case Len(cadena)  ' casos para que se mantenga el numero en LSB
    Case 3: cadena = "0" & cadena
    Case 2: cadena = "00" & cadena
    Case 1: cadena = "000" & cadena
End Select

For i = 1 To 4
 lblhex(i - 1).Caption = Mid$(cadena, i, 1)
Next i
End Function

Private Sub Command1_Click()
    Unload Me
End Sub

Private Sub Form_Load()
Dim i As Integer: Dim adres As String
    For i = 0 To 15
        Label1(i).Alignment = 2
        Label1(i).Font.Size = 14
        Label1(i).Font.Bold = True
        Label1(i).ForeColor = 0
    Next i
    For i = 0 To 3
        lblhex(i).Alignment = 2
        lblhex(i).Font.Size = 14
        lblhex(i).Font.Bold = True
        lblhex(i).ForeColor = 0
    Next i
    Check1.value = 0
    Check1.ForeColor = color_rojo
    Check1.Caption = "Nada que recibir"
    shpestadousb.FillColor = color_rojo

'adres = "&H" & "3ff" & "&"
'value = Val(adres)

    cambiar (0) '
    separar (0)   '


    MSComm1.CommPort = 4
    MSComm1.OutBufferSize = 1 'tamaño del dato a transmitir
    MSComm1.InBufferSize = 4
    'MSComm1.InputMode = comInputModeText 'los datos se recuperan en modo texto
   
   
    MSComm1.InputLen = 4  ' BUFFER DE ENTRADA SE PUEDE DEJAR AL MAXIMO
'    MSComm1.PortOpen = True
    MSComm1.RThreshold = 4 'son 4 caracteres el par ADRESH:ADRESL
    Timer1.Interval = 10
    Timer1.Enabled = True
   
    Timer2.Interval = 100
    Timer2.Enabled = False
   
End Sub

Private Sub Form_Unload(Cancel As Integer)
If MSComm1.PortOpen = True Then
    MSComm1.PortOpen = False
End If
End Sub

Private Sub MSComm1_OnComm()
Dim InBuff As String
Select Case MSComm1.CommEvent
    Case comEvReceive
    InBuff = MSComm1.Input
    Debug.Print "dato llegada: " & InBuff
     cambiar (Val("&H" & Left$(InBuff, 4) & "&")) '
     separar (Val("&H" & Left$(InBuff, 4) & "&"))  '
    'MSComm1.PortOpen = False  'cierra el puerto y vacia el buffer
End Select
End Sub

Private Function HEXA_BIN(hexadecimal As String) As String
    Dim numero_hexa As String, resultado As String, i As Long, cadena As String
    resultado = ""
    'Debug.Print "hexadecimal= " & Len(hexadecimal)
    Select Case Len(hexadecimal)  ' casos para que se mantenga el numero en LSB
        Case 3: hexadecimal = "0" & hexadecimal
        Case 2: hexadecimal = "00" & hexadecimal
        Case 1: hexadecimal = "000" & hexadecimal
    End Select
    For i = 1 To Len(hexadecimal)
        numero_hexa = Mid(hexadecimal, i, 1)
    Select Case numero_hexa
        Case "0"
            cadena = "0000"
        Case "1"
            cadena = "0001"
        Case "2"
            cadena = "0010"
        Case "3"
           cadena = "0011"
        Case "4"
            cadena = "0100"
        Case "5"
            cadena = "0101"
        Case "6"
            cadena = "0110"
        Case "7"
           cadena = "0111"
        Case "8"
            cadena = "1000"
        Case "9"
            cadena = "1001"
        Case "A"
            cadena = "1010"
        Case "B"
           cadena = "1011"
        Case "C"
            cadena = "1100"
        Case "D"
           cadena = "1101"
        Case "E"
            cadena = "1110"
        Case "F"
           cadena = "1111"
    End Select
    resultado = resultado & cadena
    'Debug.Print resultado
    numero_hexa = ""
    Next i
    HEXA_BIN = resultado
End Function

Private Sub Timer1_Timer()
On Error GoTo paca
DoEvents
If MSComm1.PortOpen = True Then
    DoEvents
    shpestadousb.FillColor = color_verde
    'lblestado.Caption = "Conectado"
    Debug.Print "Conectado"
    'MSComm1.Output = "a"
    MSComm1.PortOpen = False
    Exit Sub
Else
    DoEvents
    MSComm1.PortOpen = True
    Exit Sub
End If
paca: Debug.Print Err.Number & ": " & Err.Description
     Select Case Err.Number
        Case 8002   'Número de puerto no válido
            DoEvents
           shpestadousb.FillColor = color_rojo
           'lblestado.Caption = "Desconectado"
        Case 8005 'el puerto ya está abierto
            DoEvents
            shpestadousb.FillColor = color_rojo
'            lblestado.Caption = "puerto abierto"
        Case 8012 '8012 el dispositivo no está abierto
            DoEvents
            shpestadousb.FillColor = color_rojo
            'lblestado.Caption = "Desconectado"
        Case 8015
            DoEvents    ' para evitar retardos en bucles
            shpestadousb.FillColor = color_rojo
            'lblestado.Caption = "Desconectado"
        Case 8018
            DoEvents
            shpestadousb.FillColor = color_rojo
    End Select
     cambiar (0) '
     separar (0)   '
    Check1.value = 0
   
      Exit Sub
End Sub

Private Sub Timer2_Timer()
On Error GoTo palla1
      MSComm1.Output = "a"
Exit Sub
palla1:
 'Timer2.Enabled = False
 'Check1.value = 0
 Timer1.Enabled = True
Exit Sub
End Sub

el programa tiene un aspecto así:

(http://www.todopic.com.ar/foros/index.php?action=dlattach;topic=15208.0;attach=5333)

un par de videos de los resultados practicos en el protoboard:

Recibiendo datos del CAD (http://www.4shared.com/file/10612383/8ff6e526/e6p6v4.html)

desconectando el cable USB (http://www.4shared.com/file/10612415/b218eddf/e6p6v6.html)

observaciones y conclusiones:

- Este ejemplo demostró una transmisión HOST<->PC permitiendo al PIC hacer una actividad aparte.

- se usó 2 timer en vez de uno, debido a que en ambos se trabaja en intervalos de tiempos distintos.

- el conector USB de mi PC ya está algo agrandado de tanto reconectar, esperemos que aguante un poco mas  :D

nota adicional: me sucedió algo peligroso, menos mal que ya pasé el susto. yo alimento a mi programador con una fuente externa, de esas que venden en tiendas de chinos (botan de 1.5 a 16 Vdc variable por switche), resulta que el voltaje de salida bajó a 5 Vdc (el conector estaba medio suelto) y el PIC se me grabó mal y el HOST no reconocía el USB. volví a alimentar al programador y no me reconocía al pic. rapidamente saqué el pic y medí la tensión y no llegaban los 16Vdc que deben llegar a la entrada. ya está solucionado, no pasó nada :)

el adjunto (http://www.4shared.com/file/10612446/56664820/ejemplo6_parte6.html) con circuito eléctrico, códigos, etc.

Salu2
Pedro
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: Nocturno en 15 de Febrero de 2007, 06:37:30
¡¡Sencillamente espectacular!!
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: ESTECA55 en 15 de Febrero de 2007, 08:54:47
Muy buen trabajo!!!!, sin palabras, para  mi el USB todavía es un universo a parte, pero ando con ganas de empezar a meterme en este tema, espero en unos meses cuando me desocupe un poco empezar con esto, es una muy buena aplicación.

Saludos
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: ascii en 15 de Febrero de 2007, 11:08:30
 :shock: Muy bien explicado felicidades PalitroqueZ   :mrgreen:
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: mariano_pic en 15 de Febrero de 2007, 21:53:21
 :-/ :-/ :-/ :-/ :-/ :mrgreen: :mrgreen: :mrgreen: :-/ :-/ :-/ :-/ :mrgreen: :mrgreen:
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: PalitroqueZ en 16 de Febrero de 2007, 12:49:25
como siempre, les estoy agradecido  :P.

ESTECA55 ya verás que este universo es fascinante a medida que te vas metiendo ;).

quisiera dar una fe de erratas (tantas palabras y uno se dá cuenta es cuando lo lee como a los 3 dias)

- hay una bandera que yo usé llamada:

Código: [Seleccionar]
short estado_usb;   // boolean global, se debe declarar antes de llamar a usb_cdc.h

este flag debe ser declarado antes de usb_cdc.h porque hay una función allí que hace uso de ella y sirve para mostrar los estados de: USB -> conectado/desconectado. Específicamente dentro de usb_attach() y usb_detach().

- cuando me refiero a HOST<->PC en realidad es HOST<->PIC.

- en el último ejemplo, usé 2 videos en vez de uno. porque el camtasia studio interfería de manera extraña en la transmisión de datos cuando iniciaba una grabación (el programa en VB se colgaba durante la grabación)


Salu2
Pedro
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: LABmouse en 16 de Febrero de 2007, 19:36:21
Hola amigos, pues queria comentar que la com CDC esta de maravila  :-/ :-/ :-/ .
El unico detalle que tengo es el siguiente:

Mi programa, debe saber en que momento el puerto Com que le corresponde, es abierto, ya sea por el hyperterminal.

No se si entendi mal respecto a la variable estado_usb.
Su funcion es la de saber si el PIC esta conectado al USB y detectado y recibido por el windows. ó detecta en que momento se habre el puerto Com.

Saludos a todos y muchas gracias Pedro por este gran aporte para todos.

Saludos!

Título: Re: Mis primeros pasos con el 18F4550
Publicado por: LABmouse en 16 de Febrero de 2007, 19:47:49
Hola amigos

Código: [Seleccionar]
void main() {
   output_d(0x01);
   delay_ms(300);
   usb_cdc_init();
   usb_init();
   while(!usb_cdc_connected()) {}//No continua hasta que el puerto USB se conecte.
      do{
      usb_task();
      output_bit( PIN_d1,estado_usb);
         if (usb_enumerated()) {//Si El puerto Com virtual es activado:             if(estado_usb=1){
               if(z==0)output_toggle(pin_d0);
               z++;
            }
            else output_high(pin_d0);
         }
      }WHILE(1);
}

Bueno con el codig anterior, pretendo lo siguiente. Cuando conectas el PIC al USb. se debe encender el pin D0.  y el pin D1, muestra lo que tiene l variable estado_usb.  Al comienzo, todo bien. arranca encendido D0 y apagado D1. hasta ahora va perfecto.

ejecuto Hyperterminal. abro el puerto COM, y perfecto D1  se enciende y D0, empieza a parpadear.  PERFECTO! 


Cuando en el hyperterminal cierro el puerto, deja de parpadear D0, Perfecto.  PERO!

D1, se me queda encendio, y necesito que se quede apagado, indicando que el COm esta cerrado.

Como puedo detectar eso??
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: LABmouse en 16 de Febrero de 2007, 20:17:29
Bueno amigos, es que despues de leer ahora si detenidamente todos tus avances amigo pedro, ya entiendo por que no se apaga, ya que usb_task() lo que hace es detectar si estas conectado fisicamente al puerto USB. y como yo no uso USB_CON_SENSE_PIN. es por ello que no se apaga.

si esta bien mi reflexion?? jeje  :-) Esto del USB es para quedar LoCo.  :z). Sin la ayuda de ustedes, seria bien pesada la cuesta.

Les agradezco mucho por compartir su esfuerzo, tiempo, acabada de nalgas sentado en la silla y de ojos frente al PC, para que a los que venimos atras, nos sea mas facil.

Realmente MUCHAS GRACIAS!!  :mrgreen:

Bueno ahora si planteo la pregunta de una forma mas concreta:

Como se puede hacer para que el PIC detecte que el COM virtual fue abierto por hyperterminal????
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: LABmouse en 16 de Febrero de 2007, 20:48:31
Bueno, haciendo pruebas, veo lo siguiente. Me perdonan si es que esto ya se habla antes, si es asi por favor me avisan para borrarlo.

habilite el pin A1 como USB_CON_SENSE_PIN, efectivamente. A pesar de haber colocado el canle USB, si no conecto A1 a VCC_USB, no conecta. 

Antes de colocar A1, D0 y D1, apagados. PIC=Desconectado.

Coloco A1. Pito en windows de detectado y aceptado por el. D0 y D1. Apagado.
(Aca es donde me doy cuenta que mi reflexion anterior no es tan cierta. Ya que a pesar de que A1 esta detectado VCC_USb, D1 no enciende???? no se  :?)

Abro Hyperterminal. selecciono Com7(virtual) y le doy abrir puerto y !!! se enciende D1 y empieza a parpadear D0. Perfecto por D0. pero D1 hummm  :( . Seguiere en las pruebas a ver como resulta esto.
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: LABmouse en 16 de Febrero de 2007, 21:57:09
Hola Palitroquez, me tomo el atrevimiento de hacer este pequeño resumen de las funciones que podemos usar, espero no lo tomes a mal, y si lo cosideras asi, lme avisas para borrarlo:

usb_attached();
Retorna 1 o 0 dependiendo del valor en el USB_CON_SENSE_PIN
Debe ser definido con anterioridad este pin, usando:
#define USB_CON_SENSE_PIN PIN_A1 
antes del  #include ".\include\usb_cdc.h"

usb_attach()
Se encarga de hacer toda la secuencia de conexion del PIc al USB.
No retorna ningun valor.

usb_detach()
Se encarga de hacer toda la secuencia para desconectar PIc del puerto USB.
No retorna ningun valor.

Ahora. Actualmente cambio la variable "estado_usb" dentro de  usb_attach() y usb_detach() tal como nos comenta nuestro amigo Palitroquez. 

Lo que hay que mirar es, si cuando el PC cierra el puerto COM, se ejecuta usb_detach().

de esa forma si cambiaria la variabe "estado_usb" desde el PC, cada vez que se abre y se cierra el puerto COM.


Bueno, pues comprobado, el usb_detach(), no se ejecuta cuando el puerto Com virtual es cerrado.

Ahora tambien el usb_attach() se ejecuta sin importar que el perto com no se halla abierto todabia.

Tendre que buscar otra funcion en la que se sepa cual es el estado del puerto COM virtual.



 :-/

Bueno, pues CCS tenia la respuesta.

 usb_cdc_connected() -
Regresa 1 ó 0 dependiendo si esta abierto o no el puerto Com virtual al cual ha sido asignado el PIC.

Hyperterminal y todos los programas envian algo llamado "Set_Line_Coding", cuando se abre el puerto.


Texto original:

/////     Returns TRUE if we received a                          ////
////      Set_Line_Coding.  On most serial terminal programs (such   ////
////      as Hyperterminal), they will send a Set_Line_Coding            ////
////      message when the program starts and it opens the virtual   ////
////      COM port.  This is a simple way to determine if the PC        ////
////      is ready to display data on a serial terminal program,         ////
////      but is not garaunteed to work all the time or on other         ////
////      terminal programs.


Código: C
  1. #define usb_cdc_connected() (usb_cdc_got_set_line_coding)

no entiendo esto que significa??
si reviso usb_cdc_got_set_line_coding


Encuentro Que:
Código: C
  1. int1 usb_cdc_got_set_line_coding;

Humm. no tengo ni idea que significa.  :shock:






Hay vamos en el camino.

Saludos!
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: PalitroqueZ en 17 de Febrero de 2007, 15:24:57
Hola PICmouse. ¡que bueno que estes haciendo pruebas con el USB!  :-/

vamos por partes:

Hola amigos, pues queria comentar que la com CDC esta de maravila  :-/ :-/ :-/ .
El unico detalle que tengo es el siguiente:

Mi programa, debe saber en que momento el puerto Com que le corresponde, es abierto, ya sea por el hyperterminal.

No se si entendi mal respecto a la variable estado_usb.
Su funcion es la de saber si el PIC esta conectado al USB y detectado y recibido por el windows. ó detecta en que momento se habre el puerto Com.

Saludos a todos y muchas gracias Pedro por este gran aporte para todos.

Saludos!


para que no exista confusión: existen 2 tipos de monitoreo, la del programa para transferir los datos desde el HOST y la función (llamese el módulo USB del micro)

- hay que implementar un monitoreo de estado de conexión en ambos lados, porque son independientes entre si.

- el flag estado_usb lo coloqué para que en dichas funciones attach y detach me devuelva una señal de quién fué el último que llamó, si fué attach ó si fué dettach. además necesito saber el estado para otra función.

esto es unicamente del lado del PIC, el programa en la compu, no sabe nada de esto.

en el caso de un programa realizado en VB, yo me basé en un truco, usando el control de errores para determinar la existencia del COMx virtual. con esto es válido determinar si hay una función dialogando con el HOST.

--------------------------------------------------------------------------------------------
Hola amigos

Código: [Seleccionar]
void main() {
   output_d(0x01);
   delay_ms(300);
   usb_cdc_init();
   usb_init();
   while(!usb_cdc_connected()) {}//No continua hasta que el puerto USB se conecte.
      do{
      usb_task();
      output_bit( PIN_d1,estado_usb);
         if (usb_enumerated()) {//Si El puerto Com virtual es activado:             if(estado_usb=1){
               if(z==0)output_toggle(pin_d0);
               z++;
            }
            else output_high(pin_d0);
         }
      }WHILE(1);
}

Bueno con el codig anterior, pretendo lo siguiente. Cuando conectas el PIC al USb. se debe encender el pin D0.  y el pin D1, muestra lo que tiene l variable estado_usb.  Al comienzo, todo bien. arranca encendido D0 y apagado D1. hasta ahora va perfecto.

ejecuto Hyperterminal. abro el puerto COM, y perfecto D1  se enciende y D0, empieza a parpadear.  PERFECTO! 


Cuando en el hyperterminal cierro el puerto, deja de parpadear D0, Perfecto.  PERO!

D1, se me queda encendio, y necesito que se quede apagado, indicando que el COm esta cerrado.

Como puedo detectar eso??

según este código si la función no está conectada, entonces no habrá enumeración y siempre caerá en la línea: else output_high(pin_d0);

el uso de bandera_estado lo puedes sustituir por:  if(usb_attached()) que es la función principal para sensar el puerto.

yo usé un flag aparte, para no estar llamando a  usb_attached() ejecutando mas lineas de instrucción, y con solo saber 1 bit me ahorro bastante.

-------------------------------------------------------------------------------------------------

Bueno amigos, es que despues de leer ahora si detenidamente todos tus avances amigo pedro, ya entiendo por que no se apaga, ya que usb_task() lo que hace es detectar si estas conectado fisicamente al puerto USB. y como yo no uso USB_CON_SENSE_PIN. es por ello que no se apaga.

si esta bien mi reflexion?? jeje  :-) Esto del USB es para quedar LoCo.  :z). Sin la ayuda de ustedes, seria bien pesada la cuesta.
...

- exacto. con la función usb_task() podemos determinar el estado de conexión.

----------------------------------------------------------------------------
Bueno ahora si planteo la pregunta de una forma mas concreta:

Como se puede hacer para que el PIC detecte que el COM virtual fue abierto por hyperterminal????

ahí si no te sabría que decir, porque como se trata de engañar a la máquina haciendole creer que existe un puerto real entonces hay que valerse de "mañas" para lograr una detección automática, aunque estuve viendo un código en VB (usando APIS) donde te muestra los puertos existentes en ese momento (COMx, USB, etc) y sería cuestión de modificarlo para que mostrara solo los COMx y saber nosotros elegir él que no es constante, para automatizar la tarea.

------------------------------------------------------------------------------

Bueno, haciendo pruebas, veo lo siguiente. Me perdonan si es que esto ya se habla antes, si es asi por favor me avisan para borrarlo.

habilite el pin A1 como USB_CON_SENSE_PIN, efectivamente. A pesar de haber colocado el canle USB, si no conecto A1 a VCC_USB, no conecta. 

¿ definiste al sense pin? ej: #define USB_CON_SENSE_PIN PIN_A1 debe ser antes de incluir a cdc_usb.h


Antes de colocar A1, D0 y D1, apagados. PIC=Desconectado.

Coloco A1. Pito en windows de detectado y aceptado por el. D0 y D1. Apagado.
(Aca es donde me doy cuenta que mi reflexion anterior no es tan cierta. Ya que a pesar de que A1 esta detectado VCC_USb, D1 no enciende???? no se  :?)

Abro Hyperterminal. selecciono Com7(virtual) y le doy abrir puerto y !!! se enciende D1 y empieza a parpadear D0. Perfecto por D0. pero D1 hummm  :( . Seguiere en las pruebas a ver como resulta esto.

debe haber un problema por allí, ¿es el mismo código?

Salu2
Pedro
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: PalitroqueZ en 17 de Febrero de 2007, 15:53:59
y seguiiimos con USB...

vamos a estudiar en forma la transmisión USB usando la biblioteca de vínculo dinámico mpusbapi.dll y que mejor que empezar con el ejemplo de J1M. hay que tener una idea de porque Jaime utilizó esas llamadas a los drivers y que hace cada una de ellas.

hay muchas preguntas en cuanto a este tipo de transmisión, por ejemplo:

¿podemos transmitir a 12Mbits/seg en lenguaje C?
¿si estamos ejecutando un proceso de muestreo, podremos llegar a esa velocidad?

las posibles respuestas a estas, sin ánimo de desilusionar a nadie (incluyendome) vean esto (mitos y realidades página 9 de 858_USB.pdf):

(http://img131.imageshack.us/img131/6678/pag9858usbkb2.th.jpg) (http://img131.imageshack.us/my.php?image=pag9858usbkb2.jpg)

una cosa que hay que tener en consideración y sobre todo para lo que estudiamos esto en lenguaje de alto nivel, el protocolo de transmisión USB también lo llaman la pila USB

(http://img131.imageshack.us/img131/7890/pag26usb20jm4.th.jpg) (http://img131.imageshack.us/my.php?image=pag26usb20jm4.jpg)

tomado de usb_20.pdf, figura 5-2, pág26

observen que tiene cierto parecido al modelo OSI (http://es.wikipedia.org/wiki/Modelo_OSI). en las capas superiores tenemos las funciones basicas que el usuario puede realizar(comunicación lógica). esto a su vez va a parar a la segunda capa y luego a la tercera capa(comunicación física) que involucra el aspecto eléctrico. En nuestro caso estariamos directamente metidos en la capa superior, pero algunas veces entrando en las otras dos:

primera capa(superior): programación básica en C.
segunda capa(intermedio): llamados a los drivers que trae el compilador de C.
tercera capa(inferior):  llamados a los drivers que trae el compilador de C (procesos dentro de los drivers) y conexión del módulo USB al HOST.

esta tema es fascinante pero a la vez extenso así que hay que ir por partes, para no perdernos dentro de esos "jardines" (http://www.todopic.com.ar/foros/index.php?topic=13418.msg77887#msg77887) como lo llama RedPic  :D

- ESTUDIO DEL LADO DEL PIC:

por lo pronto lo que hay que hacer, es estudiar los drivers que trae el CCS (que es el compilador de C que uso), estos son:

- pic18_usb.h
- PicUSB.h
- usb.c
- usb.h
 
tratando de meter un poco de teoría a cada línea que nos encontremos y siguiendo el mismo método anterior: analizando el código a la inversa.

veamos el código reza así:
Código: C
  1. /////////////////////////////////////////////////////////////////////////
  2. ////                            PicUSB.c                             ////
  3. ////                                                                 ////
  4. //// Este ejemplo muestra como desarrollar un sencillo dispositivo   ////
  5. //// USB con el PIC18F2550, aunque puede ser facilmente adaptado     ////
  6. //// para la serie 18Fxx5x. Se suministra el PicUSB.exe, así como    ////
  7. //// su código fuente para Visual C# 2005, podréis encontrar tb      ////
  8. //// los drivers para el dispositivo. No se suministra esquema de    ////
  9. //// conexión puesto que está pensado para ser usado en el GTP USB,  ////
  10. //// cualquiera de las tres versiones disponibles, si aun no teneis  ////
  11. //// el programador, podeis utilizar el esquema de ese proyecto.     ////
  12. ////                                                                 ////
  13. //// Cuando el dispositivo sea conectado al PC, saldrá el asistente  ////
  14. //// para la instalación del driver. Instala el suministrado junto   ////
  15. //// a este ejemplo, lo encontrareis dentro de la carpeta Driver.    ////
  16. //// Una vez instalado podreis usar el PicUSB.exe para encender o    ////
  17. //// apagar el led bicolor del GTP USB, y para realizar la suma de   ////
  18. //// dos números introducidos.                                       ////
  19. ////                                                                 ////
  20. //// Realizado con el compilador CCS PCWH 3.227                      ////
  21. ////                                                                 ////
  22. //// Por: Jaime Fernández-Caro Belmonte        hobbypic@hotmail.com  ////
  23. ////                                                                 ////
  24. //// http://www.hobbypic.com                                         ////
  25. /////////////////////////////////////////////////////////////////////////
  26. #include <18F4550.h>
  27. //#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL3,CPUDIV1,VREGEN
  28. #fuses XTPLL,MCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL1,CPUDIV1,VREGEN,NOPBADEN // el fuse
  29. // modificado para USB -> VREGEN
  30. #use delay(clock=48000000)
  31.  
  32. /////////////////////////////////////////////////////////////////////////////
  33. //
  34. // CCS Library dynamic defines.  For dynamic configuration of the CCS Library
  35. // for your application several defines need to be made.  See the comments
  36. // at usb.h for more information
  37. //
  38. /////////////////////////////////////////////////////////////////////////////
  39. #define USB_HID_DEVICE     FALSE             //deshabilitamos el uso de las directivas HID
  40. #define USB_EP1_TX_ENABLE  USB_ENABLE_BULK   //turn on EP1(EndPoint1) for IN bulk/interrupt transfers
  41. #define USB_EP1_RX_ENABLE  USB_ENABLE_BULK   //turn on EP1(EndPoint1) for OUT bulk/interrupt transfers
  42. #define USB_EP1_TX_SIZE    1                 //size to allocate for the tx endpoint 1 buffer
  43. #define USB_EP1_RX_SIZE    3                 //size to allocate for the rx endpoint 1 buffer
  44.  
  45.  
  46. /////////////////////////////////////////////////////////////////////////////
  47. //
  48. // If you are using a USB connection sense pin, define it here.  If you are
  49. // not using connection sense, comment out this line.  Without connection
  50. // sense you will not know if the device gets disconnected.
  51. //       (connection sense should look like this:
  52. //                             100k
  53. //            VBUS-----+----/\/\/\/\/\----- (I/O PIN ON PIC)
  54. //                     |
  55. //                     +----/\/\/\/\/\-----GND
  56. //                             100k
  57. //        (where VBUS is pin1 of the USB connector)
  58. //
  59. /////////////////////////////////////////////////////////////////////////////
  60. //#define USB_CON_SENSE_PIN PIN_B2  //CCS 18F4550 development kit has optional conection sense pin
  61.  
  62. /////////////////////////////////////////////////////////////////////////////
  63. //
  64. // Include the CCS USB Libraries.  See the comments at the top of these
  65. // files for more information
  66. //
  67. /////////////////////////////////////////////////////////////////////////////
  68. #include <pic18_usb.h>     //Microchip PIC18Fxx5x Hardware layer for CCS's PIC USB driver
  69. #include <PicUSB.h>           //Configuración del USB y los descriptores para este dispositivo
  70. #include <usb.c>        //handles usb setup tokens and get descriptor reports
  71.  
  72.  
  73. /////////////////////////////////////////////////////////////////////////////
  74. //
  75. // Al conectar el PicUSB al PC encendemos el Led Rojo hasta que el dispositivo
  76. // halla sido configurado por el PC, en ese momento encederemos el Led Verde.
  77. // Esperaremos hasta que se reciba un paquete proveniente del PC. Comprobaremos
  78. // el primer byte del paquete recibido para comprobar si queremos entrar en el
  79. // modo Suma, donde se realizará una suma de dos operandos, que corresponderan
  80. // con los dos bytes restantes del paquete recibido; una vez realizada la suma
  81. // enviaremos el paquete con el resultado de vuelta al PC. Si entramos en el
  82. // modo Led comprobaremos el segundo byte del paquete recibido para comprobar
  83. // si deberemos apagar los leds, encender el verder o el rojo.
  84. //
  85. /////////////////////////////////////////////////////////////////////////////
  86. #define LEDV    PIN_B6
  87. #define LEDR    PIN_B7
  88. #define LED_ON  output_high
  89. #define LED_OFF output_low
  90.  
  91. #define modo      recibe[0]
  92. #define param1    recibe[1]
  93. #define param2    recibe[2]
  94. #define resultado envia[0]
  95.  
  96.  
  97. void main(void) {
  98.  
  99.    int8 recibe[3];                  //declaramos variables
  100.    int8 envia[1];
  101.  
  102.    LED_OFF(LEDV);                   //encendemos led rojo
  103.    LED_ON(LEDR);
  104.  
  105.    usb_init();                      //inicializamos el USB
  106.  
  107.    usb_task();                      //habilita periferico usb e interrupciones
  108.    usb_wait_for_enumeration();      //esperamos hasta que el PicUSB sea configurado por el host
  109.  
  110.    LED_OFF(LEDR);
  111.    LED_ON(LEDV);                    //encendemos led verde
  112.  
  113.    while (TRUE)
  114.    {
  115.       if(usb_enumerated())          //si el PicUSB está configurado
  116.       {
  117.          if (usb_kbhit(1))          //si el endpoint de salida contiene datos del host
  118.          {
  119.             usb_get_packet(1, recibe, 3); //cojemos el paquete de tamaño 3bytes del EP1 y almacenamos en recibe
  120.  
  121.             if (modo == 0) // Modo_Suma
  122.             {
  123.                resultado = param1 + param2;  //hacemos la suma
  124.  
  125.                usb_put_packet(1, envia, 1, USB_DTS_TOGGLE); //enviamos el paquete de tamaño 1byte del EP1 al PC
  126.             }
  127.  
  128.             if (modo == 1) // Modo_Led
  129.             {
  130.                if (param1 == 0) {LED_OFF(LEDV); LED_OFF(LEDR);} //apagamos los leds
  131.                if (param1 == 1) {LED_ON(LEDV); LED_OFF(LEDR);} //encendemos led verde
  132.                if (param1 == 2) {LED_OFF(LEDV); LED_ON(LEDR);} //encendemos led rojo
  133.             }
  134.          }
  135.       }
  136.    }
  137. }

allí estan las funciones usb_task(), usb_init() que ya las vimos por encimita, la novedad son las funciones: usb_wait_for_enumeration(), usb_get_packet y usb_put_packet

también estan las definiciones USB_EP1_TX_ENABLE  USB_ENABLE_BULK ...

comencemos por el principio (lógico ¿no? ;))

Código: C
  1. #define USB_HID_DEVICE     FALSE             //deshabilitamos el uso de las directivas HID

¿que significa HID?

HID es acrónimo en español de Dispositivo de Interfaz Humana como bien lo describe Diego en su artículo EL USB DESENCADENADO : HID USB
 (http://picmania.garcia-cuervo.net/USB_2_HIDTransfers.htm)

y resulta que en los driver´s del CCS viene activado por defecto.

Código: C
  1. ...
  2. //// USB_HID_DEVICE (TRUE) - HID devices require extra code to handle  ////
  3. ////                         HID requests.  You can disable to save    ////
  4. ////                         ROM space if you are not using a HID      ////
  5. ////                         device.  If you are not using a HID       ////
  6. ////                         device you must provide your own O/S      ////
  7. ////                         (Windows) driver.                         ////
  8. ...
  9.  
  10. ...
  11. //should the compiler add the extra HID handler code?  Defaults to yes.
  12. #IFNDEF USB_HID_DEVICE
  13.    #DEFINE USB_HID_DEVICE TRUE
  14. #ENDIF
  15. ...

si lo vamos a usar, no colocamos nada. si NO lo usaremos, lo negamos en el define
(está programado al revés, digo yo :))
-------------------------------------------------------------------------

Código: C
  1. #define USB_EP1_TX_ENABLE  USB_ENABLE_BULK //turn on EP1(EndPoint1) for IN bulk/interrupt transfers

¿que es eso de endpoint? ¿bulk/interrup transfers?

voy a colocar aquí una explicación que me pareció excelente tomada del proyecto especial de grado  link (http://pablohoffman.com/oscusb/doc/)  cápitulo 3: Bus Serie Universal, funcionamiento pag 38

Código: [Seleccionar]
cita:
...
"Los dispositivos (o mejor dicho, las funcionas) tienen asociados unos canales
lógicos unidireccionales (llamados pipes) que conectan al host controlador con
una entidad lógica en el dispositivo llamada endpoint. Los datos son enviados
en paquetes de largo variable (potencia de 2). Típicamente estos paquetes son
de 64, 128 o más bytes.
Estos endpoints (y sus respectivos pipes) son numerados del 0 al 15 en cada
dirección, por lo cual un dispositivo puede tener hasta 32 endpoints (16 de
entrada y 16 de salida). La dirección se considera siempre desde el punto de
vista del host controlador. Así un endpoint de salida será un canal que
transmite datos desde el host controlador al dispositivo. Un endpoint solo
puede tener una única dirección. El endpoint 0 (en ambas direcciones) está
reservado para el control del bus."
...

Se puede decir que los endpoint son buffer temporales de datos de entrada/salida en cada tipo. En el módulo USB existen 16 de salida (OUT) y 16 de entrada (IN) pero agrupados en forma bidirecional, de acuerdo a un par de bits de configuración (ver pag171). Ojo un endpoint es unidireccional.

para quien tenga dudas con el pipe, una imagen representativa:

(http://img47.imageshack.us/img47/1765/pag33usb20mh6.th.jpg) (http://img47.imageshack.us/my.php?image=pag33usb20mh6.jpg)

ver pag33 usb_20.pdf

respecto a la otra pregunta, existen 4 tipos de transferencias:

· transferencias de control:
 usado para comandos (y respuestas) cortos y simples. Es el tipo de transferencia usada por el pipe 0
 
· transferencias isócronas:
 proveen un ancho de banda asegurado pero con posibles pérdidas de datos. Usado típicamente para audio y video en tiempo real
 
· transferencias interruptivas:
 para dispositivos que necesitan una respuesta rápida (poca latencia), por ejemplo, mouse y otros dispositivos de interacción humana.
 
· transferencias masivas (BULK):
 para transferencias grandes y esporádicas utilizando todo el ancho de banda disponible, pero sin garantías de velocidad o latencia. Por ejemplo, transferencias de archivos.

entonces nosotros debemos definir que tipo de transferencia vamos a realizar.
en el ejemplo de Jaime se estan declarando 4 endpoints (2 bidirecionales) como transferencia masiva o BULK.
corrección: son 2 endpoints (1 bidireccional)

hay otra definición:

Código: C
  1. #define USB_EP1_TX_SIZE    1   //size to allocate for the tx endpoint 1 buffer

podemos definir el tamaño del buffer en bytes, el límite lo tendremos que buscar en el driver correspondiente (con FS hasta 64 bytes por transacción).

nota: no confundir FS con HS, con High Speed se llega hasta 480Mbps, el módulo USB del pic soporta Full Speed = 12Mbps

-----------------------------------------------------------------------------

usb_wait_for_enumeration() según el concepto que dan en el driver, hace lo mismo que usb_enumerated(). La diferencia está en que el primero se queda en un bucle indefinido hasta que el HOST le dé la orden de habilitación.

para propositos donde queramos hacer otras actividades en el PIC, usaremos el segundo.

-----------------------------------------------------------------
ahora hablaremos de como se hace para transmitir y recibir datos.

para eso estan usb_put_packet(,,) y usb_get_packet(,,)

ambas necesitan de 3 argumentos. vamos con put_packet:

Código: [Seleccionar]
...
/* usb_put_packet(endpoint,*ptr,len,toggle)
/*
/* Input: endpoint - endpoint to send packet to
/*        ptr - points to data to send
/*        len - amount of data to send
/*        toggle - whether to send data with a DATA0 pid, a DATA1 pid, or toggle from the last DATAx pid.
/*
/* Output: TRUE if data was sent correctly, FALSE if it was not.  The only reason it will
/*         return FALSE is if because the TX buffer is still full from the last time you
/*         tried to send a packet.
/*
/* Summary: Sends one packet out the EP to the host.  Notice that there is a difference
/*          between a packet and a message.  If you wanted to send a 512 byte message you
/*          would accomplish this by sending 8 64-byte packets, followed by a 0 length packet.
/*          If the last (or only packet) being sent is less than the max packet size defined
/*          in your descriptor then you do not need to send a 0 length packet to identify
/*          an end of message.
...

 - el 1 argumento endpoint ya se explicó.
 - el 2 argumento apunta a la dirección del dato a enviar (es una variable declarada por nosotros).
 - el 3 argumento es el tamaño del paquete en bytes.
 - el 4 argumento habla sobre DATA1, DATA2, toggle. ¿y eso que es?
 
  como parte de su protocolo, nos encontraremos entre otras cosas que USB maneja la transmisión de datos por paquetes, llamados TOKEN en la cuál el HOST es el iniciador de todas las transferencias que se producen en el BUS [2]  (http://server-die.alc.upv.es/asignaturas/LSED/2003-04/0.USB/)
 
(http://img443.imageshack.us/img443/8118/pag206usb20ll4.th.jpg) (http://img443.imageshack.us/my.php?image=pag206usb20ll4.jpg)

ver pag206 usb_20.pdf

 pués bien en la parte de transmisión de datos USB, los paquetes de datos se encuentran en grupos de paquetes de datos, y dentro de estos, existen unos llamados DATA1, DATA2. hay un proceso llamado sincronización del data toggle. a grandes rasgos esto no es mas que un método de validación de paquetes, y lo que hace es enviar alternadamente a DATA1 y DATA2 en una secuencia seguido de su ACK respectivo. todo con el objetivo de mantener la sincronización transmisor <-> receptor.

CORRECCIÓN: ES DATA0 y DATA1
 
(http://img443.imageshack.us/img443/1742/pag233usb20xb0.th.jpg) (http://img443.imageshack.us/my.php?image=pag233usb20xb0.jpg)
 
 ver pag232 usb_20.pdf
 
 ese tercer argumento definido en el código ejemplo: USB_DTS_TOGGLE
 
 
Código: C
  1. enum USB_DTS_BIT {USB_DTS_DATA1=1, USB_DTS_TOGGLE=2, USB_DTS_DATA0=0,
  2.                    USB_DTS_STALL=3, USB_DTS_USERX=4};

según la página 174 de 39632c.pdf el data toggle está definido por un bit llamado DTSEN y es mas, allí lo explican.

(http://img443.imageshack.us/img443/7699/pag17439632cfs1.th.jpg) (http://img443.imageshack.us/my.php?image=pag17439632cfs1.jpg)

 hay toda una teoría en lo relacionado a los grupos de paquetes, no lo mencionaré para no salirme del objetivo principal.

no ha terminado, sigue-->
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: PalitroqueZ en 17 de Febrero de 2007, 15:54:37
-->viene de arriba

seguro alguien preguntará, ¿y si yo no quiero usar la sincronización del data toggle?
esto depende del tipo de transferencia a usar, hay casos donde es recomendable usarlo. ej: transferencias de multiples transacciones y casos donde no se puede usar. para mayor información ver paginas 56 y 232 de usb_20.pdf

-----------------------------------------------------------------
usb_get_packet()

Código: [Seleccionar]
/*******************************************************************************
/* usb_get_packet(endpoint, *ptr, max)
/*
/* Input: endpoint - endpoint to get data from
/*        ptr - where to save data to local PIC RAM
/*        max - max amount of data to receive from buffer
/*
/* Output: the amount of data taken from the buffer.
/*
/*         NOTE - IF THERE IS NO PACKET TO GET YOU WILL GET INVALID RESULTS!
/*                VERIFY WITH USB_KBHIT() BEFORE YOU CALL USB_GET_PACKET()!
/*
/* Summary: Gets a packet of data from the USB buffer and puts into local PIC RAM.
/*          Until you call usb_get_packet() the data will sit in the endpoint
/*          buffer and the PC will get NAKs when it tries to write more data
/*          to the endpoint.
...

el argumento 1 es el buffer de datos de entrada, donde llega el paquete de datos.
el argumento 2 es el apuntador adonde guardaremos ese dato.
el argumento 3 es el tamaño de paquete en bytes.


 -vaya- se fué todo en pura teoría, entonces en la próxima parte veremos si hacemos el estudio del lado del HOST mediante mpusbapi.dll y como hacerla funcionar por ej: en VB a través de una Interfaz de Programación de Aplicaciones ó API
 
 
-------------------------------------------------------------------------
Fuentes Consultadas (Lectura super altamente recomendadas para leer):

858 USB Introduction to Full-Speed USB (http://techtrain.microchip.com/masters2004/(kgmnvafutocq2355egt11231)/downloads/classes/858/858_USB.pdf)

Manual de Formación de USB (http://www.fujitsu.com/downloads/EU/es/soporte/escaneres/cursousb.pdf)  cursousb.pdf

Universal Serial Bus Specification 2.0 (http://www.usb.org/developers/docs/usb_20_05122006.zip) usb_20.pdf

INGENIERIA EN MICROCONTROLADORES - Protocolo USB (http://www.i-micro.com/pdf/new_temarios/tem-Usb.pdf) usb.pdf

unpaseoporusb-2.pdf
 (http://www.fujitsu.com/downloads/EU/es/soporte/discosduros/UnpaseoporUSB-2.pdf)

Osciloscopio USB. Documentación autores: Pablo Hoffman y Martín Szmulewicz (http://pablohoffman.com/twiki/pub/Oscusb/OscusbDocumentacion/oscusb-documentacion.pdf)

este último viene de:
http://pablohoffman.com/oscusb/doc/
http://pablohoffman.com/oscusb/

Osciloscopio USB abierto (http://vampiroz.org/2006/06/osciloscopio-usb-abierto)

Protocolo USB aplicado a placas con microcontroladores (http://server-die.alc.upv.es/asignaturas/LSED/2003-04/0.USB/)

Salu2
Pedro
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: PalitroqueZ en 22 de Febrero de 2007, 13:00:54

- ESTUDIO DEL LADO DEL HOST:

para hacer este estudio vamos a ver unos ejemplos de Slalen (http://www.todopic.com.ar/foros/index.php?topic=15208.msg103215#msg103215)(programa1) y Ernesto Mozota Navarro(programa2). Este último lo pueden bajar de www.hobbypic.com

ambos sirven para el firmware que escribió Jaime J1M, el programa2 también añade otras posibilidades (PWM, CAD)

lo primero, probar el código. ¡Claro! jeje y grabar el firmware PICusb en el PIC. Esto ya lo hice (http://www.todopic.com.ar/foros/index.php?topic=15208.msg98098#msg98098) varios post atras, pero no lo expliqué y ahora le toca el turno al Visual Basic usando el programa1.

nota offtopic:
les voy a mostrar el que me está ayudando hacer esto posible:

mi_programador.bmp
(http://img480.imageshack.us/img480/746/miprogramadorso4.th.jpg) (http://img480.imageshack.us/my.php?image=miprogramadorso4.jpg)

mi abuelo programador de pic´s (sigue dando guerra después de todo :) risa) y ¡el winpic800 por supuesto!
-------------------------------------------------------------------

como mencioné anteriormente, para usar nuestra aplicación corriendo en VB, tenemos que hacer uso de unas llamadas a la librería mpusbapi.dll (apis).
Estas son:

Código: Visual Basic
  1. Public Declare Function MPUSBGetDLLVersion Lib "mpusbapi.dll" () As Long
  2. Public Declare Function MPUSBGetDeviceCount Lib "mpusbapi.dll" (ByVal pVID_PID As String) As Long
  3. Public Declare Function MPUSBOpen Lib "mpusbapi.dll" (ByVal instance As Long, ByVal pVID_PID As String, ByVal pEP As String, ByVal dwDir As Long, ByVal dwReserved As Long) As Long
  4. Public Declare Function MPUSBClose Lib "mpusbapi.dll" (ByVal handle As Long) As Long
  5. Public Declare Function MPUSBRead Lib "mpusbapi.dll" (ByVal handle As Long, ByVal pData As Long, ByVal dwLen As Long, ByRef pLength As Long, ByVal dwMilliseconds As Long) As Long
  6. Public Declare Function MPUSBWrite Lib "mpusbapi.dll" (ByVal handle As Long, ByVal pData As Long, ByVal dwLen As Long, ByRef pLength As Long, ByVal dwMilliseconds As Long) As Long
  7. Public Declare Function MPUSBReadInt Lib "mpusbapi.dll" (ByVal handle As Long, ByVal pData As Long, ByVal dwLen As Long, ByRef pLength As Long, ByVal dwMilliseconds As Long) As Long

aquí aparecen 7 ,yo conté unas 10 en el código fuente. parece que estas 7 son las necesarias para hacer transacciones a la función.

nota: función = dispositivo = módulo USB del PIC, en adelante me referiré a "dispositivo" para no confundir cuando hable de funciones en C.

la api mas sencilla aquí, parecer ser la de mostrar la versión

veamos que dice la traducción que nos pasó Slalen:

Código: Visual Basic
  1. MPUSBGetDLLVersion(Void)
  2. Lee el nivel de revision del MPUSAPi.dll. Es un nivel de revision de 32bits.
  3. Esta funcion no devuelve la version del codigo, no realiza nada con el USB.

yo le agregaría que devuelve un dato de 32 bits, la versión de la dll en formato MMMMmmmm.

vamos agregar un procedimiento para ver que hace:

Código: Visual Basic
  1. Private Sub Command2_Click()
  2. Dim version_dll As Long
  3.     version_dll = Hex(MPUSBGetDLLVersion)
  4.     MsgBox Str(version_dll)
  5. End Sub


(http://img45.imageshack.us/img45/7907/versiondllhe5.th.jpg) (http://img45.imageshack.us/my.php?image=versiondllhe5.jpg)

nos arroja 10000, y pienso que como hay 8 dígitos, ya que la versión es en hexa (8 nibbles = 32bits) -> versión dll = 1.0.0.0.0

yo podría describir cada una de las funciones, pero para eso estan estas direcciones:

- La mpusbapi.dll desencadenada: PC <-> PIC vía USB en Delphi  (http://www.todopic.com.ar/foros/index.php?topic=13418.0)
- RE: Proyecto PicUSB  (http://www.demo-1.com.ar/foros/index.php?topic=2260.msg19436#msg19436)
- Traducción de mpusbapi.doc (http://slalen.4shared.com/)

de lo que si voy hablar es como podemos usar esas apis en VB.

veamos:

cuando arrancamos esta aplicación, primero se debe ejecutar el form_load

Código: Visual Basic
  1. Private Sub Form_Load()
  2.     OpenMPUSBDevice     'abre comunicaciones
  3. End Sub

¿quién es openMPUSBDevice?

R: éste llama a MPUSBOpen:

Código: Visual Basic
  1. Sub OpenMPUSBDevice()
  2.         myOutPipe = MPUSBOpen(0, vid_pid, out_pipe, 0, 0)       'como salida
  3.        myInPipe = MPUSBOpen(0, vid_pid, in_pipe, 1, 0)         'como entrada
  4. End Sub

configura el conducto(pipe) de acceso a cada endpoint, uno de salida y uno de entrada. para outpipe tenemos operación de escritura -> MP_WRITE=0 y para inpipe -> MP_READ=1. El resultado de esta llamada se guardará en my(In/Out)Pipe

si para ambos tenemos como resultado -1 -> entonces quiere decir que no se pudo establecer el enlace lógico con el dispositivo.

Código: Visual Basic
  1. INVALID_HANDLE_VALUE = -1

si observan el programa2 notaran que hay comprobaciones en casi todas partes, preguntando si hay enlace.

para terminar la aplicación, debemos cerrar el enlace (igual como se hace en RS-232) mediante:

Código: Visual Basic
  1. Sub CloseMPUSBDevice()
  2.     MPUSBClose (myOutPipe)
  3.     MPUSBClose (myInPipe)
  4. End Sub

esto es parecido al sistema de mensajeria de windows, donde el resultado de una api, es utilizada por otra (handle) para ejecutar otros procesos.

nota: es bueno añadirle el método debug.print a cada api para poder analizar cada línea ejecutada:

Código: Visual Basic
  1. Sub OpenMPUSBDevice()
  2.         myOutPipe = MPUSBOpen(0, vid_pid, out_pipe, 0, 0)  'como salida
  3.        Debug.Print "myOutPipe= " & myOutPipe
  4.        
  5.         myInPipe = MPUSBOpen(0, vid_pid, in_pipe, 1, 0)    'como entrada
  6.        Debug.Print "myInPipe= " & myInPipe
  7. End Sub

vamos a escribir un código para abrir y cerrar un enlace virtual con el dispositivo. ¿les parece?

Código: Visual Basic
  1. Option Explicit
  2.  
  3. Private Declare Function MPUSBOpen Lib "mpusbapi.dll" (ByVal instance As Long, ByVal pVID_PID As String, ByVal pEP As String, ByVal dwDir As Long, ByVal dwReserved As Long) As Long
  4. Private Declare Function MPUSBClose Lib "mpusbapi.dll" (ByVal handle As Long) As Long
  5.  
  6. Const INVALID_HANDLE_VALUE = -1
  7. Const MPUS_FAIL = 0
  8. Const MPUSB_SUCCESS = 1
  9.  
  10.  
  11. Const vid_pid = "vid_04d8&pid_0011" ' Vendor id (Microchip) y Periferico id
  12. Const out_pipe = "\MCHP_EP1"        ' endpoint 1
  13. Const in_pipe = "\MCHP_EP1"         ' endpoint 1
  14.  
  15. Const MP_WRITE = 0                  '
  16. Const MP_READ = 1
  17.  
  18. Public myInPipe As Long             ' para guardar el manejador
  19. Public myOutPipe As Long
  20.  
  21.  
  22. Private Sub cmdabrir_Click() ' abrir enlace o pipe
  23.        myOutPipe = MPUSBOpen(0, vid_pid, out_pipe, 0, 0)       'como salida
  24.        Debug.Print "myOutPipe= " & myOutPipe   ' para monitoreo
  25.        
  26.         If myOutPipe = INVALID_HANDLE_VALUE Then   ' si es -1
  27.            lblpipeout = "Fallo el enlace de salida"
  28.         Else
  29.             lblpipeout = "Enlace salida establecido"
  30.         End If
  31.        
  32.         myInPipe = MPUSBOpen(0, vid_pid, in_pipe, 1, 0)         'como entrada
  33.        Debug.Print "myInPipe= " & myInPipe
  34.        
  35.         If myInPipe = INVALID_HANDLE_VALUE Then
  36.             lblpipein = "Fallo el enlace de entrada"
  37.         Else
  38.             lblpipein = "Enlace entrada establecido"
  39.         End If
  40.        
  41. End Sub
  42.  
  43. Private Sub cmdcerrar_Click()  ' cerrar enlace pipe
  44. Dim resul_o As Long: Dim resul_i As Long
  45.     resul_o = MPUSBClose(myOutPipe)
  46.     Debug.Print "MPUSBClose(myOutPipe)= " & resul_o
  47.     If resul_o = MPUSB_SUCCESS Then
  48.         lblpipeout.Caption = "Enlace salida cerrado"
  49.     Else
  50.         lblpipeout.Caption = "Error al cerrar el enlace salida, puede que este cerrado"
  51.     End If
  52.     resul_i = MPUSBClose(myInPipe)
  53.     Debug.Print "MPUSBClose(myInPipe)= " & resul_i
  54.     If resul_i = MPUSB_SUCCESS Then
  55.         lblpipein.Caption = "Enlace entrada cerrado"
  56.     Else
  57.         lblpipein.Caption = "Error al cerrar el enlace entrada, puede que este cerrado"
  58.     End If
  59. End Sub

algunas pantallas de nuestro programilla abriendo y cerrando pipes


(http://www.subirimagenes.com/imagenes/previo/thump_827831abrir_1.JPG)

(http://www.subirimagenes.com/imagenes/previo/thump_827846abrir_2.JPG)

(http://www.subirimagenes.com/imagenes/previo/thump_827866abrir_3.JPG)

(http://www.subirimagenes.com/imagenes/previo/thump_827872abrir_4.JPG)

ya tenemos una idea de como se usa la api MPUSBOpen.

el adjunto con el programilla


continuará...


PD: ¿que está pasando con imageshacks.us?  :?
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: PalitroqueZ en 23 de Febrero de 2007, 15:06:19
...continuando

este post estará interesante, porque veremos las apis mas importantes de la biblioteca mpusbapi.dll. Me refiero a:

MPUSBRead
MPUSBWrite


- ¿como hizo el programa1 para encender un led?
R:
en el botón verde, tenemos:

Código: Visual Basic
  1. Private Sub Command1_Click(Index As Integer)
  2.     Send_Buf(0) = 1     'Para que reconozca que se encienden o apagan Leds
  3.    Send_Buf(1) = Index
  4.     Send Send_Buf, 2
  5. End Sub

ajá ya empezaron las dudas, vamos a ver quien es Send_Buf:

Código: Visual Basic
  1. Dim Send_Buf(0 To 2) As Byte
  2. ...
  3.  
  4. ' Función enviar
  5.  
  6. Function Send(ByRef SendData() As Byte, bytes As Integer) As Long
  7.     Dim SentDataLength As Long
  8.     Call MPUSBWrite(myOutPipe, VarPtr(SendData(0)), bytes, VarPtr(bytes), 1000)     'VarPtr()= puntero a la variable
  9. End Function

es lógico pensar que como se trabaja con bytes, entonces para varios datos es necesario crear arrays de bytes. y eso es precisamente lo que hace Send_Buf()

aquí hay una sentencia curiosa VarPtr(), yo nunca la había visto, además no pertenece al VB en sí, leyendo por aquí, por acá, conseguí:

Código: Visual Basic
  1. Declare Function VarPtrAny Lib "vb40032.dll" Alias "VarPtr" (lpObject As Any) As Long
  2. 'The VarPtr-function retrieves the memory handle of an object.
  3. '· lpObject
  4. ' Handle that identifies the object

¡-ahh- conque viene del runtime! :)

hurgando en la biblioteca MSDN, aparecen tres metodos NO documentados sobre usar direccionamiento en VB, VarPtr, ObjPtr y StrPtr

esto si es un descubrimiento para mi, el uso de punteros en basic (bajo ciertas condiciones).

volviendo a la api MPUSBWrite, el segundo argumento:

Código: Visual Basic
  1. pData -> salida: puntero al buffer que contiene los datos que se van a escribir en la pipe.

para explicar un momento el uso del puntero en este caso, este argumento lo que necesita es la dirección donde está alojado el dato que queremos enviar

el problema que tiene visual basic es que no podemos usar punteros, pero con el método varptr podemos tomar dicha dirección, y esto no es lo mejor de todo, lease bien. Lo mejor es que gracias a que en un array de bytes las direcciones de esos datos son contiguos, entonces con solo tener la dirección del primer byte de datos es lo necesario que debe tener la api para hacer el recorrido en memoria.

para demostrar esto que estoy diciendo, voy a escribir un código donde:

- guardaré un dato (byte) en 2 variables
- tomaré la dirección de esas 2 variables mediante varptr
- luego llamando una api CopyMemory, recuperaré el valor que hay en
  esas direcciones que vienen siendo el mismo dato.
 
Código: Visual Basic
  1. ' en este ejemplo se DEMUESTRA el uso de punteros para manejar datos en Visual Basic
  2. ' mediante el uso de Varptr y CopyMemory
  3. ' Varptr(dato): devuelve la direccion (Long) donde se almacena la variable dato
  4. ' con CopyMemory podemos recuperar el dato en memoria a partir de su direccion
  5.  
  6. ' por: Pedro - PalitroqueZ.     23-feb-2007   10:19AM
  7.  
  8. Option Explicit
  9.  
  10. Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, pSrc As Long, ByVal ByteLen As Long)
  11.  
  12. Dim d(0 To 1) As Byte, dato(0 To 1) As Byte, r1 As Long, r2 As Long
  13.  
  14. Private Sub Command1_Click()
  15.     d(0) = 25  ' un valor cualquiera
  16.    Debug.Print "d(0)= " & d(0)
  17.     d(1) = 97   ' un valor cualquiera
  18.    Debug.Print "d(1)= " & d(1)
  19.    
  20.     r1 = VarPtr(d(0)) ' en r1 se guarda la direccion donde esta almacenado d(0)
  21.    Debug.Print "r1= " & r1
  22.    
  23.     r2 = VarPtr(d(1))
  24.     Debug.Print "r2= " & r2
  25.    
  26.     ' ahora se procede a recuperar el dato, usando CopyMemory
  27.    CopyMemory ByVal VarPtr(dato(0)), ByVal r1, 2
  28.     ' debe usarse byval OBLIGATORIO para que se pueda copiar el dato en vez de la direccion
  29.    
  30.     ' el ultimo argumento corresponde a la longitud del dato en bytes
  31.    ' si se coloca 2, es para que tome la direccion del dato contiguo
  32.    ' es decir, dato(1).
  33.    ' como dato(0), dato(1) -> se almacenan en direcciones contiguas
  34.    ' entonces CopyMemory almacenara el par de bytes de datos, en  dato(0)
  35.    ' y dato(1) mediante sus direcciones respectivas
  36.    
  37.     Debug.Print "dato(0)= " & dato(0)
  38.     Debug.Print "dato(1)= " & dato(1)
  39.     MsgBox "se recuperó d(0)=" & Str(dato(0)) & " y d(1)=" & Str(dato(1))
  40.    
  41. Unload Me
  42. End Sub
 

una imagen del debugger:

(http://img144.imageshack.us/img144/5877/usovarptrnx7.jpg)

así pues, donde veamos el varptr ya sabemos a que se está refiriendo, además el argumento de la api también lo delata con la letra 'p' ej: pData, pLenght

esto es la parte complicada de entender el uso de la api, para MPUSBRead es similar y al revés, el segundo argumento es el puntero de una variable previamente declarada por nosotros para que se alojen los datos que vayan llegando del USB.

como veran esta es otra aplicación del concepto del puntero, por un lado tenemos la casilla(dirección de almacenamiento) y por el otro tenemos el valor del dato almacenado.

el resto de los argumentos es fácil de entender, como la longitud del dato (en bytes). esto depende de como configuremos el envío desde el dispositivo

el tiempo en milisegundos: es para que la api no se quede en un bucle infinito si llegara a ocurrir un problema

y por supuesto el pipe, o mejor dicho el handle del pipe, que se puede decir que es un puntero representado en VB como un long (ver fuentes consultadas)

bueno volviendo al uso de la función Send

Código: Visual Basic
  1. Send_Buf(0) = 1     'Para que reconozca que se encienden o apagan Leds
  2.    Send_Buf(1) = Index
  3.     Send Send_Buf, 2

esto interpretado desde el punto de vista del micro, es un paquete de datos, donde hay 2 bytes. en el primer byte se guarda  el modo (modo_led) y el en otro byte se guarda el paraml que es la acción para ambos led´s (apagado, on, off -> led rojo y verde)

luego el array de bytes se envía a la función send

Código: Visual Basic
  1. Function Send(ByRef SendData() As Byte, bytes As Integer) As Long
  2.     Dim SentDataLength As Long
  3.     Call MPUSBWrite(myOutPipe, VarPtr(SendData(0)), bytes, VarPtr(bytes), 1000)      'VarPtr()= puntero a la variable
  4. End Function

observen el VarPtr(SendData(0)), es lo mismo que hablé hace rato, se toma la dirección del primer byte es lo único que necesita pData para tomar el resto del array de datos

el que falta, la suma:

Código: Visual Basic
  1. Dim a As Byte       'buffer de datos intermedio
  2.    
  3.     Send_Buf(0) = 0     'Para que reconozca que es una suma
  4.    a = CByte(sumando(0).Text) 'convierte el texto a byte
  5.    Send_Buf(2) = a
  6.     Send_Buf(0) = 0
  7.     a = CByte(sumando(1).Text)
  8.     Send_Buf(1) = a
  9.     Send_Buf(0) = 0
  10.     Send Send_Buf, 3                'envía los sumandos
  11.    recibir (a)                     'recibe el resultado
  12.    resultado.Caption = CStr(rec)   'convierte el dato a string

el Send ya lo hablamos, falta la función recibir:

Código: Visual Basic
  1. Public rec As Long
  2. ...
  3. Dim SentDataLength As Long
  4.     Call MPUSBRead(myInPipe, VarPtr(s), 1, 1, 1000)
  5.     rec = s             'guardo el dato recibido en una variable intermedia

aquí sucede lo contario, es decir, la api MPUSBRead necesita la dirección del byte 's' para almacenar el dato que viene del PIC (que en este caso es 1 byte de longitud).

esto fué el análisis realizado al programa1 y programa2.

vamos a usar el estupendo SnoopyPro para ver los bufferes del USB jijiji :)

abrimos y ejecutamos las siguientes acciones en secuencia:

1.- led rojo = ON
2.- led verde = ON
3.- apaga led´s
4.- 1 + 0 = 1
5.- 1 + 7 = 8
6.- 12 + 7 = 19

(http://img20.imageshack.us/img20/2295/snopy1ro8.th.jpg) (http://img20.imageshack.us/my.php?image=snopy1ro8.jpg)

a ver que tenemos allí


(http://www.todopic.com.ar/foros/index.php?action=dlattach;topic=15208.0;attach=5335)


tenemos un paquete de 2 bytes, en el primer el modo = 1 (modo led). y en el segundo paraml = 2 (led rojo ON)

(http://www.todopic.com.ar/foros/index.php?action=dlattach;topic=15208.0;attach=5337)


tenemos un paquete de 2 bytes, en el primer el modo = 1 (modo led). y en el segundo paraml = 1 (led verde ON)


(http://www.todopic.com.ar/foros/index.php?action=dlattach;topic=15208.0;attach=5339)


tenemos un paquete de 2 bytes, en el primer el modo = 1 (modo led). y en el segundo paraml = 0 (led rojo y verde off)


(http://www.todopic.com.ar/foros/index.php?action=dlattach;topic=15208.0;attach=5341)

tenemos un paquete de 3 bytes, en el primer el modo = 0 (modo suma). y en el segundo y tercer byte tenemos 0 y 1 que son los operandos de la suma. ojo vean que esto es un paquete down , que transmite HOST -> PIC.

un poco mas abajo:


(http://img217.imageshack.us/img217/4998/snopy6kw7.jpg)

tenemos un paquete de PIC -> HOST de 1 byte ¿y que trae? nada mas y nada menos que el resultado de la suma.

el par de sumas que faltan:

(http://img341.imageshack.us/img341/487/snopy7hy7.jpg)


(http://img341.imageshack.us/img341/6324/snopy8me8.jpg)

observaciones:

- después de haber visto varias veces el código de Jaime hasta ahora es que me doy cuenta que el led verde es RB6 y led rojo RB7 yo lo tenía invertido. pero lo extraño de todo es que con el programa PicUSBDelphi.exe de Diego se ejecuta OK con los led´s invertido. ¿¿??

- faltaría implementar un algoritmo de validación, porque si ocurre un problema, hay que resetear tanto al programa como al pic para normalizar.

- tengo que instalar el driver wdmstub.sys cada vez que conecto el cable USB en un puerto distinto, ¿no se supone que esos conectores son compartidos?
esto también sucede con la clase CDC.


Fuentes consultadas:

- Interacting with Microchip Full-Speed USB Demo Board using Visual Studio Tools (Part II) (http://www.comvcon.com/VB6MCHPUSB.html)

- API-Guide (http://www.allapi.net/)

- MSDN Library Visual Studio 6.0

Salu2
Pedro
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: Slalen en 24 de Febrero de 2007, 14:55:54
Hola de nuevo!!!
Ya me he puesto a programar y dejar las traducciones (ya era hora...).
Desde mi último mensaje, he colgado:
- Alguno de los programas que PalitroqueZ ha hecho en CCS programados en C18 (Los que creo más interesantes) y he añadido uno del PWM.
- La traducción de las palabras de programación de los PIC18Fxx5x
- Manuales de microchip del MPLAB (Assambler y C18)
Como siempre aqui (http://slalen.4shared.com)

A ver si me pongo al día que ya has avanzado mucho PalitroqueZ....

Un saludo!!!! :-/
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: PalitroqueZ en 24 de Febrero de 2007, 15:07:44
Hola Slalen. me estoy ayudando con tus traducciones y veo que trabajas con el C18, mejor que mejor así hay material para ambos compiladores. voy a bajarlo a ver que tal es..


Salu2
Pedro
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: FJPPitta en 25 de Febrero de 2007, 00:05:54
PalitroqueZ muchas gracias por el aporte, en un inicio como no tengo puertos seriales usaba un adaptador rs232-usb y un max232 para comunicarme con mi PIC, ahora acabo de pasar mi codigo para que use USB para que emule el puerto COM y va de maravilla ya no necesito ninguno de los dispositivos que anteriormente mencione solo el pic y directo a la PC  :-/ :-/ :-/ :-/.

Sigue adelante que la información que posteas es muy valiosa.

Saludos
FJPPitta

Título: Re: Mis primeros pasos con el 18F4550
Publicado por: Slalen en 25 de Febrero de 2007, 08:16:04
Hola!!

Hola Slalen. me estoy ayudando con tus traducciones y veo que trabajas con el C18, mejor que mejor así hay material para ambos compiladores. voy a bajarlo a ver que tal es..

Si, trabajo con el C18 por consejo de Maunix.
Los programas son muy simples y puedes considerarlos incompletos ya que sólo son para probar algo determinado. No están comentados si alguien quiere más información (En inglés) que lea el archivo MPLAB_C18_Libraries_51297f.pdf dentro de MPLAB Assambler & C18 Docs.zip.

Por cierto, grandioso trabajo comentando mi programa de VB. En cuanto pueda modifico la traducción del MPUSBAPI con lo que comentas.

Gracias por tu ayuda!!!!!

Slalen nose si pudieras colocar todos los archivos del vb, para que los que se inician en ello tb aprendan sobre el software que va en la PC, estaria mas completo creo, si es que podes, weno gracias, adios!!

Perdona por tardar tanto en responderte Cryn!!! :mrgreen:
No se a que archivos te refieres, yo he colgado todo lo que creo necesario. Si alguien tiene alguna duda yo creo que le basta con leer este tema; PalitroqueZ está haciendo un gran trabajo explicando todo.

De todas formas si crees que falta algo dime que es y lo cuelgo.

Un saludo!!!!
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: Slalen en 26 de Febrero de 2007, 09:51:33
Hola de nuevo!! :-/
Ya me he puesto a trabajar para hacer un programa para el USB cdc.
He visto que me faltaban cosas por traducir y aclarar en los archivos "macros C18" y "librerias C18", bueno pues ya están. Iré modificando estos archivos según me vaya aclarando más sobre el tema.

También he modificado el MPUSBAPI.pdf con lo comentado por PalitroqueZ.

He borrado el rar de las librerías corregidas porque no es del todo correcto. Microchip varia las librerías dependiendo de la clase (HID, CDC o MSD).
Recordad que hay que modificar una librería porque tiene erratas, lo he comentado en el archivo "librerías C18".

Todo esto como siempre aqui (http://slalen.4shared.com)
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: Slalen en 28 de Febrero de 2007, 19:13:37
Hola!!! :mrgreen:
Ya he colgado un programa del USB en C18, es el PicUSB de J1M en este lenguaje.

He vuelto a modificar los archivos de librerías y macros indicando lo que hay que cambiar en cada programa y por los distintos tipos de clase.

El firmware del USB cdc tiene que esperar, me sale el error 10 y no se por que, en cuanto me funcione bien lo cuelgo.

Un Saludo!!! :-/

PD: archivos (http://slalen.4shared.com)
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: PalitroqueZ en 08 de Marzo de 2007, 11:07:55
PalitroqueZ muchas gracias por el aporte, en un inicio como no tengo puertos seriales usaba un adaptador rs232-usb y un max232 para comunicarme con mi PIC, ahora acabo de pasar mi codigo para que use USB para que emule el puerto COM y va de maravilla ya no necesito ninguno de los dispositivos que anteriormente mencione solo el pic y directo a la PC  :-/ :-/ :-/ :-/.

Sigue adelante que la información que posteas es muy valiosa.

Saludos
FJPPitta


si eso es lo bueno FJPPitta, que te ahorras una circuitería y puedes ir rápido.

volviendo a la carga con la transmisión USB que trae el 18F4550...

quisiera hacer unas observaciones, varios mensaje atrás hablando sobre la api MPUSBGetDLLVersion() escribí:

Cita de: PalitroqueZ

nos arroja 10000, y pienso que como hay 8 dígitos, ya que la versión es en hexa (8 nibbles = 32bits) -> versión dll = 1.0.0.0.0


bueno, ahora no estoy tan seguro que eso sea cierto (después de todo es una suposición), ahora me baso en lo siguiente:

- que dicha api, devuelve un puntero que contiene la versión de la librería mpusbapi.dll

- si esto es cierto, entonces la versión correcta es 0.0.1.0

aquí (http://www.4shared.com/file/11915946/94485aab/version_mpusbapi_en_vb.html) está un adjunto con un programa en visual basic que hace lo que digo.

eso lo dejaré a su criterio, si un forero conoce la versión correcta, adelante, tiene toda libertad de refutar esta hipótesis (claro, con evidencia  :))

continuamos...

---------------------------------------------

voy a tomar el ejemplo del CDC explicado con anterioridad y lo voy a modificar para usarlo con la librería mpusbapi.dll

- lo primero, hacer la detección del lado del dispositivo

- lo segundo hacer la detección del lado del Host


Detección del lado del dispositivo

es de la misma forma que para la clase CDC estudiada, mediante el USB_CON_SENSE_PIN

el código con la modificación:

Código: C
  1. /* ejemplo7_parte4.c
  2.   se pretende hacer la deteccion de conexion al puerto USB, mediante la mpusbapi.dll
  3.   mostrando en una pantalla LCD 2x16 el estado.
  4.  
  5.   Este codigo es un hibrido del cual se tomo partes de:
  6. - PicUSB.c de J1M
  7. - RRCdcUSB de RedPic
  8. - probando_USB.c del ejemplo6_parte5 de PalitroqueZ
  9.  
  10. Pedro - PalitroqueZ 07-Mar-2007. Hora: 3:54 PM
  11. */
  12.  
  13. #include <18F4550.h>
  14. #fuses XTPLL,NOMCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL1,CPUDIV1,VREGEN,NOPBADEN
  15. #use delay(clock=48000000)
  16.  
  17. #define use_portb_lcd TRUE
  18.  
  19. #define USB_HID_DEVICE     FALSE             //deshabilitamos el uso de las directivas HID
  20. #define USB_EP1_TX_ENABLE  USB_ENABLE_BULK   //turn on EP1(EndPoint1) for IN bulk/interrupt transfers
  21. #define USB_EP1_RX_ENABLE  USB_ENABLE_BULK   //turn on EP1(EndPoint1) for OUT bulk/interrupt transfers
  22. #define USB_EP1_TX_SIZE    1                 //size to allocate for the tx endpoint 1 buffer
  23. #define USB_EP1_RX_SIZE    1                 //size to allocate for the rx endpoint 1 buffer
  24.  
  25. #define USB_CON_SENSE_PIN PIN_E3
  26.  
  27. #include <pic18_usb.h>     //Microchip PIC18Fxx5x Hardware layer for CCS's PIC USB driver
  28. #include "PicUSB.h"      //Configuración del USB y los descriptores para este dispositivo
  29. #include <usb.c>        //handles usb setup tokens and get descriptor reports
  30. #include <lcd.c>
  31.  
  32. void mostrar_estado_usb();
  33.  
  34. void main(){
  35.    int envia[1];
  36.    int recibe[1];
  37.    envia[0]='a';
  38.    usb_init_cs();  // inicializa el USB y lo desactiva
  39.    lcd_init();    // llamadas necesarias para iniciar la LCD
  40.     while(true){
  41.       usb_task();    //habilita periferico usb e interrupciones
  42.       mostrar_estado_usb();
  43.       if(usb_enumerated()){ // primer if
  44.          if(usb_kbhit(1)){  // segundo if
  45.          //si el endpoint de salida contiene datos del host        
  46.             usb_get_packet(1, recibe, 1);
  47.             //cojemos el paquete de tamaño 1bytes del EP1 y almacenamos en recibe
  48.              if(recibe[0]=='a'){ // tercer if
  49.                 usb_put_packet(1, envia, 1, USB_DTS_TOGGLE);
  50.                 //enviamos el paquete de tamaño 1byte del EP1 al PC
  51.                 lcd_gotoxy(1,1);
  52.                 lcd_putc("llego una a     ");
  53.                 delay_ms(500);
  54.             } // fin del tercer if
  55.          } // fin del segundo if
  56.       } // fin del primer if
  57.       lcd_gotoxy(1,1);
  58.       lcd_putc("otros procesos");
  59.       delay_ms(500);
  60.    } // fin del ciclo while
  61. }
  62. /************************************************
  63. // esta llamada imprime en la LCD los estados de conectado
  64. // y desconectado del USB dependiendo de la bandera
  65. // estado_usb
  66. //***********************************************/
  67. void mostrar_estado_usb(){
  68.  lcd_gotoxy(10,2);
  69.  if(usb_attached()){
  70.   lcd_putc(" USB:On");
  71.  }else{
  72.   lcd_putc("USB:Off");
  73.  }
  74. // delay_ms(500);
  75. }

video ejemplo7parte4 (http://www.4shared.com/file/11915935/42009dd6/e7p4v1.html)

voy a hacer unas observaciones sobre este programa, porque pasé un buen rato tratando de que funcionara.

- en usb_kbhit(1), el 1 es el endpoint de datos (el argumento es requerido).

- sustituí a usb_init por usb_init_cs ¿porque?

R: aquí entra el simulador paso a paso del MPLAB.

la función:
Código: C
  1. void usb_init(void) {
  2.    usb_init_cs();
  3.  
  4.    do {
  5.       usb_task();
  6.    } while (usb_state != USB_STATE_POWERED);
  7. }

se queda en un bucle eterno a menos que el dispositivo sea conectado, pero mi interes es hacer que el pic haga otras actividades independientemente si está presente ó no, el HOST.

usb_init_cs() -> inicializa el módulo USB y lo desactiva, está bien así que se desactive por defecto (menos consumo para el circuito).

- entonces ¿como enciendo el módulo?

para eso está usb_task() dentro del bucle eterno del while(true), en cada instante él preguntará por el USB_CON_SENSE_PIN y dependiendo del Vusb en este pin, él activará/desactivará.

ven lo importante que es el USB_CON_SENSE_PIN, basicamente es una detección por hardware, se está sensando si llega voltaje del HOST (Vusb).

- eliminé la bandera estado_usb, porque es igual que preguntar por usb_attached(), me ahorro 1 bit de memoria (que mezquino jaja). Además que no hay que modificar el driver original pic18_usb.h

- el resto del código queda igual, solo ajustar los paquetes de datos a 1 byte, usando un eco. el HOST le envía un carácter (a) y el dispositivo se lo devuelve.

ustedes pensaran que este tema se volcó ahora sobre el estudio de Universal Serial Bus, pos ni modo. seguiré un rato masticando a esta joyita  :wink:


el adjunto (http://www.4shared.com/file/11915945/d410b11/ejemplo7_parte4.html) de costumbre.

Salu2
Pedro
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: PalitroqueZ en 08 de Marzo de 2007, 11:08:53
Detección del lado del Host

empezaremos hacer modificaciones al ejemplo de Slalen (esperemos que Slalen no se moleste  :D)

Código: Visual Basic
  1. ' este programa envia un caracter y recibe un eco del dispositivo
  2. ' para confirmacion.
  3. '
  4. '
  5. ' adaptacion del programa original de Slalen
  6. ' Pedro-PalitroqueZ   07-Mar-2007 Hora: 7:51 PM
  7.  
  8. Option Explicit
  9. Dim Send_Buf(0) As Byte
  10. Const verde = &HFF00&
  11. Const rojo = &HFF&
  12.  
  13. Private Sub cmdversiondll_Click()
  14. Dim version_dll As Long, digitos(4) As Byte, cad As String, t As Integer
  15.    version_dll = VarPtr(MPUSBGetDLLVersion) 'toma el puntero de la version
  16.   For t = 0 To 3
  17.        digitos(t) = 0  ' limpiar variables
  18.   Next t
  19.  
  20.    CopyMemory ByVal VarPtr(digitos(0)), ByVal version_dll, 5
  21.    ' recupera de la memoria los digitos de la version y lo copia en digitos()
  22.   cad = ""
  23.    For t = 0 To 3   ' concatena los digitos en una cadena
  24.      cad = cad & Str(digitos(t)) & "."
  25.    Next t
  26.    lblversiondll.ForeColor = &HFFFF&
  27.    lblversiondll.Caption = Left$(cad, Len(cad) - 1) ' muestra la version
  28. End Sub
  29.  
  30. Private Sub Command2_Click()
  31.   Dim eco As Byte, dato As Long
  32.   Timer1.Enabled = False
  33.   Send_Buf(0) = Asc("a") 'envia la "a"
  34.  OpenMPUSBDevice     'abre comunicaciones
  35.  Send Send_Buf, 1
  36.   dato = recibir(eco)
  37.   If eco = 97 Then
  38.     lblrespuesta.Caption = "El dispositivo respondio Exitosamente"
  39.   Else
  40.     lblrespuesta.Caption = "No hubo respuesta del Dispositivo"
  41.   End If
  42.   CloseMPUSBDevice    'cierra comunicaciones
  43.  Timer1.Enabled = True
  44. End Sub
  45.  
  46. Private Sub Form_Load()
  47.   Timer1.Interval = 50
  48.   Timer1.Enabled = True
  49. End Sub
  50.  
  51. Private Sub Form_Unload(Cancel As Integer)
  52.    CloseMPUSBDevice    'cierra comunicaciones
  53. End Sub
  54.  
  55. Private Sub Timer1_Timer()
  56.     OpenMPUSBDevice     'abre comunicaciones
  57.    If (myOutPipe <> INVALID_HANDLE_VALUE) And (myInPipe <> INVALID_HANDLE_VALUE) Then
  58.       shpestado.FillColor = verde
  59.     Else
  60.       shpestado.FillColor = rojo
  61.     End If
  62.     CloseMPUSBDevice    'cierra comunicaciones
  63. End Sub


videito ejemplo7parte5 (http://www.4shared.com/file/11916213/87b51a6e/e7p5v1.html)

como ven lo adapté para transferencias de paquetes de datos de 1 byte, y como siempre mi empeño en agregarle un sensor de estado del dispositivo, muy similar que con la clase CDC: un timer abriendo y cerrando el pipe cada 50 mS y preguntando si hubo enlace.

cabe decir que el código del PIC es el mismo del ejemplo anterior y funciona igual.

en los ensayos en el protoboard

- reconexión de la extensión USB.

- abriendo y cerrando el programa en VB

- incluso se desconectó/conectó la alimentación al PIC y los resultados fueron satisfactorios.


el adjunto (http://www.4shared.com/file/11916217/80d8de77/pic_usb_vb.html) con el programa.

Salu2
Pedro
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: Slalen en 10 de Marzo de 2007, 13:08:46
Como siempre me quito el cráneo!!!


empezaremos hacer modificaciones al ejemplo de Slalen (esperemos que Slalen no se moleste  :D)


¿¿¡¡¡Pero a estas alturas del post andamos así!!!??:D :mrgreen: :D

Ahora lo descargo y le echo un vistazo.

Un saludo!!!!
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: PalitroqueZ en 12 de Marzo de 2007, 11:25:42
¿se acuerdan del ejemplo donde usamos el CAD y haciamos transferencias y otras actividades? bien vamos a tomar ese ejemplo, pero con la biblioteca mpusbapi.dll y con los conocimientos aprendidos en el tema Estudio de Graficos en VB (http://www.todopic.com.ar/foros/index.php?topic=16233.msg105918#msg105918) vamos a visualizar los datos obtenidos.

los paquetes de datos se mantienen en 1 byte, hice pruebas con 64 bytes, y los resultados fueron casi los mismos.

el código del dispositivo:

Código: C
  1. /* ejemplo8_parte1.c
  2.    adaptación del ejemplo6parte6. transmision del resultado del CAD al PC
  3.    al puerto USB, mediante la mpusbapi.dll
  4.    mostrando en una pantalla LCD 2x16 el resultado del CAD y el estado USB.
  5.  
  6.   Este código es un híbrido del cuál se tomó partes de:
  7. - PicUSB.c de J1M
  8. - RRCdcUSB de RedPic
  9. - probando_USB.c del ejemplo6_parte5 de PalitroqueZ
  10.  
  11. Pedro - PalitroqueZ 08-Mar-2007. Hora: 9:01 AM
  12. */
  13.  
  14. #include <18F4550.h>
  15. #DEVICE ADC=8 // cad a 8 bits
  16. #fuses XTPLL,NOMCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL1,CPUDIV1,VREGEN,NOPBADEN
  17. #use delay(clock=48000000)
  18.  
  19. #define use_portb_lcd TRUE
  20.  
  21. #define USB_HID_DEVICE     FALSE             //deshabilitamos el uso de las directivas HID
  22. #define USB_EP1_TX_ENABLE  USB_ENABLE_BULK   //turn on EP1(EndPoint1) for IN bulk/interrupt transfers
  23. #define USB_EP1_RX_ENABLE  USB_ENABLE_BULK   //turn on EP1(EndPoint1) for OUT bulk/interrupt transfers
  24. #define USB_EP1_TX_SIZE    1                 //size to allocate for the tx endpoint 1 buffer
  25. #define USB_EP1_RX_SIZE    1                 //size to allocate for the rx endpoint 1 buffer
  26.  
  27. #define USB_CON_SENSE_PIN PIN_E3
  28. #define DERECHA 0
  29.  
  30. #include <pic18_usb.h>     //Microchip PIC18Fxx5x Hardware layer for CCS's PIC USB driver
  31. #include "PicUSB.h"      //Configuración del USB y los descriptores para este dispositivo
  32. #include <usb.c>        //handles usb setup tokens and get descriptor reports
  33. #include <lcd.c>
  34.  
  35. void mostrar_estado_usb();
  36. void config_adcon2(short justificacion);
  37.  
  38. int  value;
  39.  
  40. void main(){
  41.    int i;
  42.    int envia[1];
  43.    int recibe[1];
  44.  
  45.    set_tris_a(0x1);  // Ra[0]=entradas, los demas=salida
  46.  
  47.    usb_init_cs();  // inicializa el USB y lo desactiva
  48.    lcd_init();    // llamadas necesarias para iniciar la LCD
  49.    setup_adc_ports( AN0 || VSS_VDD );  // canal AN0, Vref+ = Vdd, Vref- = Vss
  50.    config_adcon2(DERECHA);   // justificación derecha, Tacq= 2Tad
  51.  
  52.     while(true){
  53.        usb_task();    //habilita periferico usb e interrupciones
  54.        mostrar_estado_usb();
  55.        envia[0]= read_adc();
  56.  
  57.        for(i=0;i<16;i++){// muestra resultado del CAD en binario, linea1 LCD
  58.           lcd_gotoxy(16-i,1);
  59.           lcd_putc((char)(bit_test(envia[0],i)+0x30));
  60.        }
  61.        printf(lcd_putc,"\n0x%Lx",envia[0]);
  62.        // muestra el resultado del CAD en Hexa, linea2 LCD
  63.  
  64.        if(usb_enumerated()){ // primer if
  65.           if(usb_kbhit(1)){  // segundo if
  66.              //si el endpoint de salida contiene datos del host        
  67.              usb_get_packet(1, recibe, 1);
  68.              //cojemos el paquete de tamaño 1bytes del EP1 y almacenamos en recibe
  69.              if(recibe[0]=='a'){ // tercer if
  70.                 usb_put_packet(1, envia, 1, USB_DTS_TOGGLE);
  71.                 //enviamos el paquete de tamaño 1 bytes del EP1 al PC
  72.              } // fin del tercer if
  73.           } // fin del segundo if
  74.         } // fin del primer if
  75.    } // fin del ciclo while
  76. }
  77. /***********************************************************
  78. // esta llamada imprime en la LCD los estados de conectado
  79. // y desconectado del USB dependiendo de la bandera
  80. // estado_usb
  81. //**********************************************************/
  82. void mostrar_estado_usb(){
  83.  lcd_gotoxy(10,2);
  84.  if(usb_attached()){
  85.   lcd_putc(" USB:On");
  86.  }else{
  87.   lcd_putc("USB:Off");
  88.  }
  89. // delay_ms(500);
  90. }
  91. //-----------------------------------------------------------------------------------------
  92. // cumple la función de configurar el bit ADFM para hacer
  93. // la justificación, también se incluye el retardo por hardware de Tacq
  94. // datos de entrada: bandera de justificación
  95. // datos de salida: nada
  96. //-----------------------------------------------------------------------------------------
  97. void config_adcon2(short justificacion){
  98.    setup_adc(ADC_CLOCK_DIV_64 );  // reloj de conversión = Fosc / 64
  99.     if(justificacion){
  100.     #asm
  101.     bsf 0xFC0,7    // ADFM <- 1
  102.     #endasm
  103.     }
  104.     else{
  105.     #asm
  106.       bcf 0xFC0,7   // ADFM <- 0
  107.    #endasm
  108.    }
  109.    #asm          // configura Tacq = 2Tad
  110.     bsf 0xFC0,3
  111.     bcf 0xFC0,4
  112.     bcf 0xFC0,5
  113.    #endasm
  114.    set_adc_channel(0);
  115. }

la resolución del CAD es a 8 bits y aunque el paquete de datos es de 1 byte, se debe declarar las variables como tipo array:

   int envia[1];
   int recibe[1];

porque sino no les funcionará (comprobado)

del resto todo es igual como en el ejemplo mencionado anteriormente.


el programa del lado del HOST:

Código: Visual Basic
  1. ' programa para explotar el uso del picturebox realizando graficas en
  2. ' tiempo de ejecucion.
  3. ' para una aplicacion practica se recibiran paquetes de 1 bytes
  4. ' del dispositivo (18F4550) con el resultado del CAD a 8 bits y se mostrara
  5. ' la onda en el picturebox
  6. '
  7. '
  8. ' la parte del codigo de transferencia de datos por USB, pertenece a Slalen
  9. '
  10. ' Saludos a foro TodoPic http://www.todopic.com.ar/foros/index.php
  11. '
  12. ' por: Pedro - PalitroqueZ  10-Mar-2007 Hora: 09:34 PM
  13.  
  14. Option Explicit
  15.  
  16. Dim cx As Integer, cy As Integer
  17. Dim cx1 As Integer, cy1 As Integer
  18. Dim i As Integer, j As Long
  19. Dim x As Long, y As Integer
  20. Dim dato(1000) As Long
  21. Dim pcx As Long, pcy As Long
  22. Dim fcx As Long, fcy As Long
  23. Dim n As Integer    ' n define la base de tiempo o time-division
  24.  
  25. Dim Send_Buf(0) As Byte
  26. Const verde = &HFF00&
  27. Const rojo = &HFF&
  28.  
  29. Dim valor As Single, maximo As Integer
  30. Dim te As Byte
  31.  
  32. Private Sub Form_Load()
  33.     valor = 0 'VScroll1.Value
  34.    ' el resultado del CAD en un tiempo discreto
  35.    maximo = 255 'VScroll1.Max
  36.    ' viene siendo el maximo numero de pasos del CAD (8 bits=255, 10 bits=1023)
  37.    n = 30
  38.     ' wl time-division
  39.    cy = Picture1.ScaleHeight ' 117
  40.    cx = Picture1.ScaleWidth   ' 253
  41.    
  42.     cy1 = Picture1.ScaleHeight ' 117
  43.    cx1 = Picture1.ScaleWidth   ' 253
  44.    
  45.     pcx = Picture1.Width
  46.     pcy = Picture1.Height
  47.    
  48.     fcx = Me.Width
  49.     fcy = Me.Height
  50.    
  51.     ajustar_tiempo (n)
  52.    
  53.     Timer1.Enabled = False
  54.     Timer2.Enabled = False
  55.     Timer3.Interval = 50
  56.     Timer3.Enabled = True
  57.     'Timer3.Enabled = False
  58.    
  59.     HScroll1.Value = n
  60. End Sub
  61.  
  62. Private Sub Form_Resize()
  63.     Timer1.Enabled = False
  64.     Timer2.Enabled = False
  65.    
  66.     Picture1.Height = Form1.Height / (fcy / pcy)
  67.     Picture1.Width = Form1.Width / (fcx / pcx)
  68.    
  69.     Picture1.ScaleHeight = Picture1.Height / (pcy / cy1)
  70.     Picture1.ScaleWidth = Picture1.Width / (pcx / cx1)
  71.     cy = Picture1.ScaleHeight
  72.     cx = Picture1.ScaleWidth
  73.     Picture1.Cls
  74.     x = -1: y = 0:  i = 0: j = -1
  75.     ajustar_tiempo (n)
  76.     Timer1.Enabled = True
  77.    
  78. End Sub
  79.  
  80. Private Sub Form_Unload(Cancel As Integer)
  81.  
  82.     CloseMPUSBDevice    'cierra comunicaciones
  83.  
  84. End Sub
  85.  
  86. Private Sub HScroll1_Change()
  87.     n = HScroll1.Value
  88.     lblconta.Caption = n
  89.     Form_Resize
  90. End Sub
  91.  
  92. Private Sub HScroll1_Scroll()
  93.     lblconta.Caption = HScroll1.Value
  94. End Sub
  95.  
  96. Private Sub Timer1_Timer()
  97.     Label1.Caption = VScroll1.Value
  98.  
  99.     dato(i + 1) = Int(cy - valor * (cy / maximo))
  100.     If Not j > (cx - n) Then ' pregunta si i no ha llegado a cx
  101.        Picture1.Line (x, dato(i))-(j, dato(i + 1)), vbBlack
  102.         x = j
  103.         i = i + 1
  104.         j = j + n
  105.     Else
  106.    Timer1.Enabled = False  ' ya llego, deja de dibujar
  107.   Timer2.Enabled = True  '
  108.    End If
  109. Label1.Caption = "CAD= " & Round(valor * (5 / maximo), 3) & " volts -> 0x" & Hex(valor)
  110. End Sub
  111.  
  112. Private Sub Timer2_Timer()
  113.     Picture1.Cls
  114.     x = -1
  115.     j = -1
  116.    
  117.     Label1.Caption = VScroll1.Value
  118.      'valor = VScroll1.Value
  119.    If n > 1 Then
  120.     dato(Int((cx / n) + 2)) = Int(cy - valor * (cy / maximo))
  121.     Else
  122.     dato(Int((cx / n)) + 1) = Int(cy - valor * (cy / maximo))
  123.    
  124.     End If
  125.     For i = 0 To cx ' pregunta si i no ha llegado a cx
  126.        Picture1.Line (x, dato(i))-(j, dato(i + 1)), vbBlack
  127.         x = j
  128.         j = j + n ' para lograr el ajuste time-division
  129.        dato(i) = dato(i + 1) ' rellenar el dato(n) : 0 < n < cx
  130.    Next i
  131.     Label1.Caption = "CAD= " & Round(valor * (5 / maximo), 3) & " volts -> 0x" & Hex(valor)
  132. End Sub
  133.  
  134. Function ajustar_tiempo(time_division As Integer)
  135.     If time_division > 1 Then
  136.         Timer1.Interval = 3 * time_division
  137.         Timer2.Interval = 3 * time_division
  138.     Else
  139.         Timer1.Interval = 1
  140.         Timer2.Interval = 1
  141.     End If
  142. End Function
  143.  
  144. Private Sub Timer3_Timer()
  145.     Send_Buf(0) = Asc("a")
  146.    
  147.     OpenMPUSBDevice     'abre el pipe (si se puede)
  148.    
  149.     If (myOutPipe <> INVALID_HANDLE_VALUE) And (myInPipe <> INVALID_HANDLE_VALUE) Then
  150.         shpestado.FillColor = verde
  151.     Else
  152.         shpestado.FillColor = rojo
  153.     End If
  154.  
  155.     Send Send_Buf, 1
  156.     recibir (te)
  157.    
  158.     If rec = 0 Then
  159.         valor = 1   ' para ajustar el gráfico
  160.    Else
  161.         valor = rec
  162.     End If
  163.    
  164.     CloseMPUSBDevice    'cierra comunicaciones
  165.  
  166. End Sub
  167. Private Sub cmdayuda_Click()
  168.  Dim mensaje As String
  169.  
  170.  mensaje = "Este programa recoge los datos enviado desde un" & vbCrLf
  171.  mensaje = mensaje & "dispositivo (PIC18F4550) y grafica la señal correspondiente" & vbCrLf
  172.  mensaje = mensaje & "al resultado de una conversion analogica-digital" & vbCrLf
  173.  mensaje = mensaje & "a 8 bits de resolución"
  174.  
  175.  MsgBox mensaje, vbInformation, "Informacion"
  176.  
  177. End Sub

el Timer3_Timer() es primordial, porque cumple triple propósito:
 
 - envía el dato de confirmación (el ECO).
 - recibe el dato del dispositivo.
 - sensa el estado de conexión del dispositivo, ya que ante cada ejecución y transferencia abre y  cierra el pipe.

un ventanazo en acción:

(http://www.todopic.com.ar/foros/index.php?action=dlattach;topic=15208.0;attach=5343)


Video (http://www.4shared.com/file/12126923/3ad6446c/e11v3.html)

en el video, se hizo ensayos variando un potenciometro, y reconectando el dispositivo, y ¡TODO VA DE LUJO!  :-/ :-/ :-/ :-/

en base a mis experiencias, debo decir que trabajar con mpusbapi.dll como que es la mejor opción, mucho mas rápido y práctico (conociendo la programación). pero para no subestimar a la clase CDC, entonces:

- de acuerdo a la situación dada, se debe escoger que es conveniente: CDC ó mpusbapi.dll

- eso dependerá del programador que tendrá que decidir cuál es mejor.

como diria Neo: "todo es cuestión de elección"  (tomado de la película Matrix, Revolutions)

y este fué el estudio realizado al módulo USB si se quiere decir  'por encima' ya que queda mucha información a nivel de capas inferiores por estudiar.

el adjunto

Salu2
Pedro
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: Slalen en 14 de Marzo de 2007, 10:40:29
Nuevos avances:
He colgado aqui (http://slalen.4shared.com) un archivo que se llama "placa pruebas.rar" que es el esquema de la placa que he estado utilizando para probar todo.
Incluye.
- programa en vb que controla: 2 motores CC, 1 motor Paso-Paso bipolar, 2 conversores A/D, 5 Entradas digitales, 8 salidas digitales
- circuito de la placa
- adaptación de los drivers del picUSB de J1M para la placa :mrgreen: (gracias J1M)
- programa en C18 para el microcontrolador

Un saludo!!!
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: Slalen en 17 de Marzo de 2007, 09:15:21
PalitroqueZ he comparado los resultados de la función de la MPUSBAPI de ver la versión de la dll.
Si la versión del archivo es la correcta, el primer programa da un resultado más ajustado (1.0.0.0.0), ya que la versión que pone en las propiedades del archivo es 1.0.0.0.

Un saludo!!
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: PalitroqueZ en 17 de Marzo de 2007, 11:17:32
Slalen yo creo que una forma de despejar esta duda, es cambiando la versión en el código fuente y recompilar la DLL de nuevo y ver que sale.

repetir esto varias veces para estar seguro.

Salu2
Pedro
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: poncho1479 en 20 de Marzo de 2007, 04:47:24
hola compañeros se me hace interesante este tema, les tengo una pregunta se podria comunicar este pic con un celular via usb??
en especifico mandar codigos at al telefono??
saludos
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: elmasvital en 20 de Marzo de 2007, 11:23:09
Palitroquez usa los adjuntos del foro para las fotos que tienes pegadas... que los servicios gratuitos los borran con el tiempo. Entiendo que los pusiste así para evitar cargar el foro pero las imágenes y el post son lo suficientemente interesantes para conservarlas aquí.

1 saludo
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: PalitroqueZ en 21 de Marzo de 2007, 13:37:05
hola compañeros se me hace interesante este tema, les tengo una pregunta se podria comunicar este pic con un celular via usb??
en especifico mandar codigos at al telefono??
saludos

Hola poncho1479. no me he metido con la comunicación hacia un celular, sería cuestión de estudiar el protocolo del mismo y ver la forma de hacerlo interactuar con un pic.

también habría que averiguar si el celular puede actuar en modo HOST, porque en la arquitectura USB debe haber un HOST y al menos un dispositivo

---------------------------------------------------------------------------------------

Palitroquez usa los adjuntos del foro para las fotos que tienes pegadas... que los servicios gratuitos los borran con el tiempo. Entiendo que los pusiste así para evitar cargar el foro pero las imágenes y el post son lo suficientemente interesantes para conservarlas aquí.

1 saludo

elmasvital ya me acostumbré al imageshacks  :D. trataré de hacer lo que me dices para la próxima.

de todas maneras aquí está un compacto en chm que complementa a la primera que colgué, se llama:


Mis_primeros_pasos_con_el_18F4550_parte2.rar (http://www.4shared.com/file/12656408/38cf809d/Mis_primeros_pasos_con_el_18F4550_parte2.html)

son 22 Mb porque allí está todo, los videos, imagenes, adjuntos y es lo mismo publicado pero mejor arreglado y con la mención de los autores de los códigos y fuentes respectivas




Título: Re: Mis primeros pasos con el 18F4550
Publicado por: PalitroqueZ en 22 de Marzo de 2007, 11:36:07
Hola Amig@s.

como ya le dimos bastante rosca al lenguaje C, ahora vamos hacer el estudio en ensamblador sobre todo para conocer las nuevas instrucciones que trae la familia 18.

El primer estudio será el como manejar tablas ROM de datos constantes.

para manejar tablas ROM en PIC18 se usa 2 formas:

- Computed GOTO
- Table Reads

ver pág 62 39632D.pdf

el método computed goto es la acostumbrada tabla que hemos usado, el addwf PCL,F
el cuál consiste en sumar un valor a la dirección de la memoria de programa para caer en un
retlw k y así obtener la constante deseada.
pero tiene un incoveniente, solo llega hasta el ancho de PCL que son 8 bits y vendrian siendo 2^8 = 256 constantes entonces si queremos continuar la tabla hay que aplicar otras tecnicas haciendo engorrosa la programación.

la otra es Table Reads y consta de usar un par de SFR llamados TBLRD para lectura y TBLWT para escribir en la ROM

con este método podemos direccionar el ancho de la memoria de programa (21 bits) y leer datos de 1 byte, es decir, que esto nos viene como anillo al dedo porque podemos almacenar datos contiguos en UNA SOLA tabla, (dependiendo de la memoria disponible en el PIC18F4550 la memoria llega hasta 0x3FFF)

(http://www.todopic.com.ar/foros/index.php?action=dlattach;topic=15208.0;attach=4283)

según la figura 6-1 pag 81 se observa que para acceder a la ROM se usan 3 registros de 8 bits


TBLPTRU:TBLPTRH:TBLPTRL

y el dato almacenado se guardará en TABLAT

el TABLAT hay que usarlo mediante un puntero que es el intermediario entre la dirección de la ROM y TABLAT, este puntero es un SFR llamado TBLPTR (ver página 84)

(http://www.todopic.com.ar/foros/index.php?action=dlattach;topic=15208.0;attach=4285)

noten que tenemos hasta la opción de incrementar/decrementar el puntero para hacer una lectura en secuencia

notas:
- me voy a enfocar solo en la lectura de datos para darle aplicación al manejo de tablas (TBLRD)

- el término ROM es mejor adaptarlo a Flash ROM ya que es evidente que se puede grabar en tiempo  de ejecución del PIC

vamos a ver el ejemplo que trae la datasheet

(http://www.todopic.com.ar/foros/index.php?action=dlattach;topic=15208.0;attach=4287)

la explicación es la siguiente:

- se carga el valor de la dirección de la Flash ROM donde está nuestro dato a buscar.

- se llama al puntero TBLPTR para que cargue el dato en TABLAT

- luego procedemos a usar el contenido de TABLAT para usarlo en nuestra aplicación.

ahora viene una pregunta: ¿y como se crea la tabla?

investigando en la fuente de abajo, vemos que usan 2 directivas: ORG y DB

ORG n: indica que todo las lineas que esté por debajo se alojaran a partir de la dirección n

DB:  Reserva valores de 8 bits en la memoria de programa

(ver en la ayuda de MPASM Assembler Help)

si tomamos el ejemplo del link de abajo:

Código: ASM
  1. org 0x100 ; Starting address of table (any valid address)
  2. DB 0x01, 0x02 ; stored as 0x0201 at location 101:100


claro este método tiene su inconveniente:
- si la dirección del dato no es la correcta entonces el dato será errado, entonces hay que estar pendiente con la asignación.

- es el detalle que le encuentro a primera vista, con los ejemplos veremos si existen otros.

vamos hacer un ejemplito para comprobar lo dicho.

vamos a crear una tabla con la cadena "Hola TodoPic"

Código: ASM
  1. ; se hace uso del TBLRD para el manejo de tablas
  2. ; se crea un tabla con "Hola TodoPic"  y se vá llamando
  3. ; un carácter a la vez que se guarda en dato
  4. ;
  5. ; Pedro - PalitroqueZ     21-Mar-2006   05:03PM
  6.  
  7.     LIST P=18F4550   ;directive to define processor
  8.     #include <P18F4550.INC> ;processor specific variable definitions
  9.  
  10.  CBLOCK 0x0
  11.  dato
  12.  ENDC
  13.  
  14.  org 0
  15.  goto inicio
  16.  
  17. inicio:
  18.  MOVLW 0       ; limpia TBLPTRU
  19.  MOVWF TBLPTRU
  20.  MOVLW 0
  21.  MOVWF TBLPTRH ; limpia TBLPTRU
  22.  MOVLW 0x82
  23.  MOVWF TBLPTRL  ; carga a 82 en TBLPTRL
  24.  
  25. ciclo:
  26.  TBLRD*+        ; TABLAT++
  27.  MOVF TABLAT, W ; W <- TABLAT
  28.  movwf dato     ; dato <- W
  29.  goto ciclo     ; bucle eterno
  30.  
  31.  ; se crea la tabla
  32.  org 0x82
  33.  db "Hola TodoPic"
  34.  
  35.  end

un video de demostración:

usando tablas1.wmv (http://www.4shared.com/file/12713043/c57ab19a/usando_tablas1.html)

bueno al menos funciona la simulación de la teoría planteada.

nota: con este uC pic estoy aprendiendo cosas que no llegué a estudiar con el 16F

el adjunto (http://www.4shared.com/file/12713066/87262797/ejemplo9parte1.html)

fuente consultada:

Storing lookup table data in PIC18 devices using Assembly Language (http://support2.microchip.com/KBSearch/KB_StdProb.aspx?ID=SQ6UJ9A004JU6)
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: manuelroin24 en 22 de Marzo de 2007, 13:21:44
Q bien!!! ahora si me conecto aqui el assembler es lo mio jejejeje gracias
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: PalitroqueZ en 22 de Marzo de 2007, 14:14:18
Hola manuel. ¡que bueno!, ya he visto varias instrucciones que valen la pena mencionarlas.



continuando con esto de las tablillas en la flash ROM...

vamos a crear una tabla que pase de los 255 datos a ver que sucede:

como los datos a guardar serán nibbles (ya les diré), entonces debemos usar los db con 8 datos.
¿porque?

porque se guardan en la flash en espacios de 2 bytes contiguos, entonces para que no leer ceros de por medio se deben introducir datos que sean multiplos de 2

y en este ejemplo cada db tendrá 4 bytes = 8 nibbles

Código: ASM
  1. ; se hace uso del TBLRD para el manejo de tablas
  2. ; se crea un tabla > 255 datos y se vá llamando
  3. ; de a un nibble a la vez que se guarda en dato
  4. ;
  5. ; Pedro - PalitroqueZ     21-Mar-2006   08:23PM
  6.  
  7.     LIST P=18F4550   ;directive to define processor
  8.     #include <P18F4550.INC> ;processor specific variable definitions
  9.  
  10.  CBLOCK 0x0
  11.  dato
  12.  ENDC
  13.  
  14.  org 0
  15.  goto inicio
  16.  
  17. inicio:
  18.  clrf dato
  19.  MOVLW 0       ; limpia TBLPTRU
  20.  MOVWF TBLPTRU
  21.  MOVLW 0
  22.  MOVWF TBLPTRH ; limpia TBLPTRU
  23.  MOVLW 0x82
  24.  MOVWF TBLPTRL  ; carga a 82 en TBLPTRL
  25.  
  26. ciclo:
  27.  TBLRD*+        ; TABLAT++
  28.  MOVF TABLAT, W ; W <- TABLAT
  29.  movwf dato     ; dato <- W
  30.  goto ciclo     ; bucle eterno
  31.  
  32.  ; se crea la tabla
  33.  org 0x82
  34.  db  0x1,0x2,0x3,0x4,0x5,0x6,0x7,0x8
  35.  db  0x9,0x1,0x2,0x3,0x4,0x5,0x6,0x7
  36.  db  0x1,0x2,0x3,0x4,0x5,0x6,0x7,0x8
  37.  db  0x9,0x1,0x2,0x3,0x4,0x5,0x6,0x7
  38.  db  0x1,0x2,0x3,0x4,0x5,0x6,0x7,0x8
  39.  db  0x9,0x1,0x2,0x3,0x4,0x5,0x6,0x7
  40.  db  0x1,0x2,0x3,0x4,0x5,0x6,0x7,0x8
  41.  db  0x9,0x1,0x2,0x3,0x4,0x5,0x6,0x7
  42.  db  0x1,0x2,0x3,0x4,0x5,0x6,0x7,0x8
  43.  db  0x9,0x1,0x2,0x3,0x4,0x5,0x6,0x7
  44.  db  0x1,0x2,0x3,0x4,0x5,0x6,0x7,0x8
  45.  db  0x9,0x1,0x2,0x3,0x4,0x5,0x6,0x7
  46.  db  0x1,0x2,0x3,0x4,0x5,0x6,0x7,0x8
  47.  db  0x9,0x1,0x2,0x3,0x4,0x5,0x6,0x7
  48.  db  0x1,0x2,0x3,0x4,0x5,0x6,0x7,0x8
  49.  db  0x9,0x1,0x2,0x3,0x4,0x5,0x6,0x7
  50.  db  0x1,0x2,0x3,0x4,0x5,0x6,0x7,0x8
  51.  db  0x9,0x1,0x2,0x3,0x4,0x5,0x6,0x7
  52.  db  0x1,0x2,0x3,0x4,0x5,0x6,0x7,0x8
  53.  db  0x9,0x1,0x2,0x3,0x4,0x5,0x6,0x7
  54.  db  0x1,0x2,0x3,0x4,0x5,0x6,0x7,0x8
  55.  db  0x9,0x1,0x2,0x3,0x4,0x5,0x6,0x7
  56.  db  0x1,0x2,0x3,0x4,0x5,0x6,0x7,0x8
  57.  db  0x9,0x1,0x2,0x3,0x4,0x5,0x6,0x7
  58.  db  0x1,0x2,0x3,0x4,0x5,0x6,0x7,0x8
  59.  db  0x9,0x1,0x2,0x3,0x4,0x5,0x6,0x7
  60.  db  0x1,0x2,0x3,0x4,0x5,0x6,0x7,0x8
  61.  db  0x9,0x1,0x2,0x3,0x4,0x5,0x6,0x7
  62.  db  0x1,0x2,0x3,0x4,0x5,0x6,0x7,0x8
  63.  db  0x9,0x1,0x2,0x3,0x4,0x5,0x6,0x7
  64.  db  0x1,0x2,0x3,0x4,0x5,0x6,0x7,0x8
  65.  db  0x9,0x1,0x2,0x3,0x4,0x5,0x6,0x7
  66.  
  67. ; offset= 256
  68.  db  "llego"
  69.  end

si la tabla se creó a partir de 0x82 entonces cuando TBLPTR = 0x82 + 0xFF + 1 = 0x182 habrá
llegado a 256 datos. y después.. se desborda...  -ahh- ¿se lo creyeron? ..  :mrgreen: jaja. por supuesto que el contador continuuua (y NO se desborda)...

un video

ejemplo9_parte2v1.wmv (http://www.4shared.com/file/12721619/b1fc6228/ejemplo9_parte2v1.html)

Título: Re: Mis primeros pasos con el 18F4550
Publicado por: LABmouse en 22 de Marzo de 2007, 23:04:36
Caramba pedro que bueno todo este trabajo tuyo. Te felicito mucho por ello.

El pasarte al asm, seria pelearte con el monstrico PIC18F4550 con solo palos y piedras.  :D

Suerte amigo y mucho animo que en asm es muchotototote lo que hay que estudiar.

Saludos!
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: PalitroqueZ en 23 de Marzo de 2007, 13:32:27
Gracias Ernesto, yo voy a llegar hasta donde se pueda, sobre todo quiero entender ciertas instrucciones, para darle aplicaciones cuando tenga inconvenientes en C
Título: pasos con el 18F4550 driver microchip
Publicado por: txiku en 23 de Marzo de 2007, 15:30:08
Hola palitroquez, mi nombre es javier y soy un estudiante de electronica de santander y llevo ya un par de meses siguiendo tus pasos en el mundo del usb, asi como los de Redpic.
Estoy desarrollando un proyecto sobre esta comunicacion usb-cdc y tengo una serie de problemas con los que quizas me podrias ayudar, si tienes tiempo claro esta.
1. El primero, es que he estado programando el prototipo que utiliza Redpic en su pagina con el ICD2 de microchip. Al principio no he tenido problemas para trabajar desde Mplab. En el pc estoy trabajando con VB5 y el objeto Mscomm. He instalado el driver que nos suministra microchip "mchpcdc.inf" y ha llegado un momento en el cual el PC me deja de reconocer mi placa, eliminando toda posibilidad de comunicacion usb.
  He comprobado que el pic18f4455 esta correctamente
  He comprobado las conexiones del pequeño prototipo
  He vuelto a instalar el driver de microchip con la opcion del boton derecho
  He cambiado de PC
  He cambiado de cable usb
No encuentro la forma de que mi host vuelva a reconocer mi placa prototipo. Por ello te pido desde mi posicion de alumno, que si tienes alguna idea para echar a andar de nuevo mi placa, me contestes.
Gracias por todo y un cordial saludo.
javier
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: LABmouse en 23 de Marzo de 2007, 16:42:15
txiku, ante tan formal peticion de ayuda, no hay un por que no ayudarte, se que la pregunta es para pedro, pero permisito me meto.

La mejor forma de ayudarte es de esta forma:

1.) intenta quitando todo al programa y solo dejale la parte de comunicacion USB en CDC.

2.) Monta el codigo para revisarlo.

3.) Mira si es el cristal el que esta malo.

4.) Verifica que estas configurando bien el PLL interno del PIC.

4.)Prueba programado en el PIC que tienes el siguiente programa que te paso y me dices si te conecta. Si lo hace, descartas, PIc, Impreso y demas y solo quedamos en que el problema es el programa. Colocale al pic un cristal de 20MHz

Saludos!

Título: Re: Mis primeros pasos con el 18F4550
Publicado por: PalitroqueZ en 23 de Marzo de 2007, 17:55:54
eso mismo que dice PICmouse  :mrgreen:

txiku también quiero preguntarte :

el programa CDC en VB que usas, ¿es el último que colgué?

si es así te diré que en ese programa, yo usé 2 timer con un intervalo muy pequeño y determiné que después de cierto tiempo el programa puede colgarse, la solución es quitarle el timer que sensa el estado del dispositivo. ( este es en comunicación CDC, el otro corre perfectamente)
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: txiku en 25 de Marzo de 2007, 17:23:01
Hola amigos!! joder, me alegro un monton de que ustedes me hayan contestado.Gracias de nuevo por su ayuda.
Palitroquez, mi programa de VB5 lo confeccione yo, no es de los que has colgado tu, pero pienso que el error esta mucho antes de abrir el visual basic ya que para poder establecer una conexion, el dispositivo debe de ser reconocido por el host y para ello solo hay que conectar el cable usb.
Esto me lleva a pensar que el driver de microchip no esta funcionando correctamente o que mi programa tiene algo que impide que se produzca esta conexion usb.
Picmouse, voy a intentar hacer lo que me dices, pero antes decirte que el cristal que uso es de 20 MHz y con otro pequeño programa ajeno a la conexion usb he comprobado que oscila yque el pic18f4455 funciona.
En los fuses tengo habilitado el modulo HSPLL y configurado a PLL5 ya que mi cristal es de 20MHz.
No estoy seguro de poder probar tu archivo *.HEX porque mi herramienta de programacion es ICD2 via usb y no tengo en mi placa mas puertos.¿como puedo hacerlo?
Mañana seguire con las pruebas y ya os voy comentando.
saludos
javi
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: LABmouse en 25 de Marzo de 2007, 18:18:06
Claro que con el ICD2 lo puedes hacer, solo debes seleccionar en MPLAB Select Programmer, le das ICD2, despues le das File- Import, y buscas el .hex y ya esta, lo puedes programar.

Saludos!
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: txiku en 26 de Marzo de 2007, 15:18:48
Hola picmouse! estoy haciendo pruebas con la placa usb cdc yte cuento:
he cambiado mi programa y dejado solo las instrucciones de la comunicacion usb. Con este programa asi como con tu archivo *.hex, me reconoce el dispositivo de una vez por todas, pero... no me lo reconoce como un puerto serie virtual sino como un 'dispositivo desconocido' en administrador de dispositivos/controladores de bus serie universal.

Entonces el sistema operativo le ha asignado un controlador de windows, que no es el de microchip. Estoy intentando instalar el driver de microchip, pero me dice que el controlador de windows es el mas adecuadoy que el de microchip no le quiere.
Aunque desinstale el dispositivo y me lo vuelva a reconocer siempre me lo pilla como desconocido y no de da opcion de cargar el driver de microchip.
¿alguna idea?
gracias por todo.javi
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: PalitroqueZ en 28 de Marzo de 2007, 11:18:45
Hola txiku.

si dices que el problema es en el driver, entonces puede ser complejo de resolver ¿porque? por la misma razón del Windows. Ese problema que comentas me ha pasado con otros driver, que por un motivo x el windows lo instaló mal, o no lo reconoce y se queda allí estancado.

de verdad no se que pueda ser, haber si alguien le ha pasado lo mismo que a tí y sugiere algo.
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: Slalen en 02 de Abril de 2007, 09:41:00
Hola!!
Hace mucho que no pongo nada pero es que estoy muy liado con el proyecto.
Sólo quería comentaros que el archivo que colgué tiempo atrás "placa prueba.rar" hay un nuevo módulo para VB para la recepción con el USB.
El antiguo sólo permitía recibir 2 bytes mientras que este los que se quiera.

txiku, para cambiar de driver busca en el editor de registros el driver después de desinstalarlo para borrarlo completamente y después instala el nuevo.

Espero que te sirva de algo!!! :mrgreen:

Un saludo!!!
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: __ERoS__ en 11 de Abril de 2007, 13:10:45
Hola a todos

Se que soi nuevo aki pero keria preguntaros una dudilla a ver si sabeis porque me pasa esto con el pic18f4550

Resulta que monte el circuito basico con un led para hacerlo parpadear durante un segundo (codigo del primer post de este hilo, que enciende durante un segundo el led y lo apaga) y uso un cristal de 8MHZ con lo que configuro mis fuses asi:

#fuses XSPLL,MCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG, USBDIV,PLL2,CPUDIV1,NOVREGEN,NOPBADEN (iguales al primer ejemplo pero con PLL2 ya que uso cristal de 8MHZ)
#use delay(clock=48000000)

EL problema es que el led parpadea y se enciende (y apaga) durante dos segundos y pico cuando deberia hacerlo durante un segundo

Lo curioso, es que si pongo el CPUDIV3 (96/4=24MHZ) y use delay(24000000) y el resto del codigo igual, funciona perfectamente encendiendose y apagandose durante un segundo. LO he probado varias veces de ambas maneras programandolo de manera igual (con winpic800) y nada, de una manera va bien y de la otra va mas lento

Que le pasa a mi PIC? Me interesa poder usarlo a su velocidad maxima, que hago mal? Yo creo haber entendido la configuracion de los fuses.

Muchas gracias
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: LABmouse en 11 de Abril de 2007, 13:19:38
Y porque no montarle el cristal de 20MHz??
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: __ERoS__ en 11 de Abril de 2007, 15:11:11
POrque no lo tengo, solo tengo de 8MHZ y si en ppio se puede usar cualquiera para conseguir los 48MHZ pues no tengo necesidad de usar otro (salvo que no consiga hacerlo con este claro)
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: LABmouse en 11 de Abril de 2007, 15:34:12
Lo unico que veo raro es que XSPLL no existe para el PIC18F4550, o por lo meos eso creo. El que tiene CCs es XTPLL. Prueba. de todas maneras toy mirando que mas hay.
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: __ERoS__ en 11 de Abril de 2007, 16:15:44
Weno eso es un error, es HSPLL.

Creo haber encontrado el error, volvi a configurar los fuses asi:

#fuses HSPLL,MCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG, USBDIV,PLL2,CPUDIV1,NOVREGEN,NOPBADEN (iguales al primer ejemplo pero con PLL2 ya que uso cristal de 8MHZ, y tengo que dividir por 2)
#use delay(clock=48000000)

Y le aplique al pic 5v procedentes del regulador 7805 (5,01v medidos), antes le metia directamente los 5v de la fuente, y medidos por polimetro eran 5,22v, asi que sin saber si eso puede provocar un mal funcionamiento en el pic, de esta manera SI me funciona bien y tengo el pic a 48MHZ!

Era esa la causa verdad? Desde luego, se nota que soi novato, no sabia la importancia de tener los 5v clavados a la entrada del pic

Título: Re: Mis primeros pasos con el 18F4550
Publicado por: LABmouse en 11 de Abril de 2007, 16:28:24
Bueno me alegra que solucionaras el problema.
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: txiku en 20 de Abril de 2007, 17:20:36
Hola a todos los Picmaniacos, en especial palitroquez, picmouse y slalen. Siento haber tardado tanto en informaros sobre el proyecto usb_cdc que estaba desarrollando.
Quizas sea una decepcion pero el causante de todos mis problemas con esta comunicacion, eran las lineas de datos del conector usb (D+ y D-)que encontraban intercambiadas sin que me diera cuenta hasta el dia de hoy.
La dificultad de esta nueva comunicacion y el escaso tiempo que tuve para su desarrollo, me llevaron a no ver o no revisar lo que tenia delante, obcecandome en las mismas comprobaciones siempre.
Os doy las gracias por ese tiempo que se emplea en pensar un poco y escribir un mensaje de ayuda para un picmaniaco. De verdad os aseguro que el solucionar este problema ha supuesto la mayor satisfaccion que obtendre en este proyecto, sin olvidar la imprescindible ayuda prestada por mi tutor (Luis).

Sin mas dilacion, antes de que ocurriera todo esto, me estuve rompiendo la cabeza para conseguir realizar una suma aritmetica de 2 operandos en el pic16f4550. Los operandos son enviados desde 2 textbox en visual studio .net 5, mediante el objeto mscomm. La suma deberia ser ejecutada usando solamente las instrucciones que nos ofrece la libreria usb_cdc.h, y el resultado volvera a otro textbox de mi programa de control en visual basic.
Si alguien sabe como tratar los datos que le llegan al pic para sumarlos y devolverlos correctamente, seria muy interesante saberlo.
Saludos
Javi

Título: Re: Mis primeros pasos con el 18F4550
Publicado por: PalitroqueZ en 20 de Abril de 2007, 17:42:57
Hola txiku.

en el caso de hacerlo con la clase CDC, deberias tratar el código como si estuvieras transmitiendo por RS-232, es decir, implementar un mecanismo de validación y parada para cada dato, como un ECO por ejemplo. en cada transferencia envias un carácter que debe validar la otra terminal antes de hacer cualquier envío

hay otro método que es bastante bueno, es el saludo de 3 vias que usa el protocolo TCP.

la idea es que el dato no se pierda ó que llegue cuando sea requerido.

Título: Re: Mis primeros pasos con el 18F4550
Publicado por: LuNaTk en 22 de Abril de 2007, 01:41:57
Hola Palotroques, Picmouse y Slalen.

Soy nuevo en esto del uso del USB con esta maravilla de pic, hasta antes de ver este post, habia estado comunicanco mis curcuitos por el usb mediante la HID de Mecanique.

Gracias a este foto, eh podido realizar una comunicacion usando la MPUSBAPI.dll  de Microchip, pero tengo una pregunta, aver si alguien me puede orientar, quiero usar un "clock" de control para un circuito el cual necesita una frecuencia de 1 mhz y entre estas oscilaciones del clock necesito enviar datos binarios que deben estar presentes en el flanco de bajada del clock, y lo que se requiere hacer es que mediante una aplicacion en VB se controle ese clock y el envio de datos, lo maximo que puedo conseguir de frecuencia mediante un bucle for  es de 1Khz aprox, pero porque es esto??? si no estoy usando ningun delay (retraso) se supone que las transiciones deben de ser mucho mas rapidas a que de debe que no pueda lograr una frecuencia mayor a 1 Khz????

Saludos desde Mexico, y gracias a todos ustedes de antemano, haganme saber si esta bien aqui esta pregunta o la hago en otro lado.
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: Slalen en 22 de Abril de 2007, 13:30:28
Hola LuNaTk
Lo unico que te puedo contar es que si estas usando el timer que trae VB, solo puedes crear una frecuencia de KHz ya que el periodo es de ms. Al calcular la inversa tienes la frecuencia.
Para crear un reloj de MHz tendras que crear el temporizador, en lo que no te puedo ayudar por que no tengo ni idea :(
Para lo de los flancos de bajada, lo unico que se me ocurre es que el microcontrolador chequee el dato con una frecuencia mayor que la de envio (MHz en tu caso). No detectaras el flanco de bajada pero te aproximaras mucho.

Un saludo!!!
Siento no ser de mas ayuda!!!! :mrgreen:
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: LuNaTk en 22 de Abril de 2007, 20:29:09
Primero que nada Gracias Slalen por responde, claro k es de mucha ayuda tu respuesta, me da una idea, tal vez deba de hacer esa instruccion en el propio PIC y activar esa oscilacion por medio de un comando desde VB (commandbutton por ejemplo)  y enviar mis datos en paquetes de mmm no se unos 10 bytes y ajustar mi reloj en el pic unas 80 veces mas rapido que la velocidad en que llegan esos bytes ( 1 khz aprox que es la velocidad en que puedo recibir los paquetes) para que ocurra una transicion del clock en cada bit y despues esos datos hacer k tengan una salida serial mediante un pin del PIC, creo k lo dificil va a ser sincronizarlo, bueno para no "ensuciar" el post del amigo Palitroquez  creo k abrire un tema aparte para este problema.

Gracias.
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: PalitroqueZ en 23 de Abril de 2007, 15:50:37
Hola LuNaTk.

si tienes problemas con retardos usando mpusbapi.dll, prueba disminuyendo el tiempo en las llamadas MPUSBRead y MPUSBWrite, es el último argumento. Busca en mpusbapi.pdf (http://slalen.4shared.com/) es un documento que tradujo Slalen. allí explican lo que hace el parámetro dwMilliseconds.

Título: Re: Mis primeros pasos con el 18F4550
Publicado por: carlos7890 en 16 de Mayo de 2007, 12:45:00
Estimado PalitroqueZ:
Tendrías la amabilidad de subir el archivo "Mis primeros pasos con el 18F4550",ya que el mismo no se encuentra disponible para bajar.
Muchas gracias desde ya y felicitaciones por este excelente trabajo
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: PalitroqueZ en 16 de Mayo de 2007, 17:36:50
Carlos ya está arreglado, gracias por avisar
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: txiku en 25 de Mayo de 2007, 09:32:47
Hola Picmaniacos:
Respecto a la pregunta que le hize a palitroquez hace ya unas semanas, tengo una solucion bastante interesante acerca de como enviar desde Visual basic variables de tipo entero, strings, etc hacia el micro PIC18f4550 y que este realize operaciones con ellos. Ahora mismo estoy utilizando una serie de instrucciones que la libreria usb_cdc.h pone a disposicion del programador, como es get_string_usb(*p,20). Desde visual basic y a traves del puerto serie COM solo permite enviar variables de tipo string. Desde el pic y a traves de esta instruccion puedo facilmente capturar cualquier tipo de mensaje enviado a traves del puerto serie, solo tengo que definir un array con una longitud maxima como argumentos de dicha funcion.
De la misma forma esta libreria posee get_int_usb() y para float y double, todavia no he comprobado su funcionamiento pero seguramente funcionen igual de bien que la de strings.

Palitroquez, a ver si me puedes echar una mano con esto. me he dado una vuelta por el foro buscando informacion sobre generar o empaquetar ficheros ejecutables o instalables de mis aplicaciones creadas con visual studio .net 2005. La informacion encontrada no me acaba de resolver de todo el problema. El objetivo es hacer unos ficheros instalables para correr mis aplicaciones en otros equipos que no posean el entorno visual studio instalado. La verdad es que se me echa el tiempo encima. Gracias de antemano.
Txiku
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: PalitroqueZ en 25 de Mayo de 2007, 14:01:22
Hola txiku


...
De la misma forma esta libreria posee get_int_usb() y para float y double, todavia no he comprobado su funcionamiento pero seguramente funcionen igual de bien que la de strings.

tampoco he realizado pruebas con tipos de datos floats ni double  :(

Palitroquez, a ver si me puedes echar una mano con esto. me he dado una vuelta por el foro buscando informacion sobre generar o empaquetar ficheros ejecutables o instalables de mis aplicaciones creadas con visual studio .net 2005. La informacion encontrada no me acaba de resolver de todo el problema. El objetivo es hacer unos ficheros instalables para correr mis aplicaciones en otros equipos que no posean el entorno visual studio instalado. La verdad es que se me echa el tiempo encima. Gracias de antemano.
Txiku

otra mala noticia que darte  :( he usado solo el visual basic 6.0 y del .net no he podido conseguirlo, y por las cosas que he leido, es bastante diferente en varios aspectos respecto al 6.0

a ver si un forero que tenga experiencia con el .net nos informe.
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: Slalen en 28 de Mayo de 2007, 06:36:31
Hola de nuevo!!!!!
Por fin puedo comentaros algo sobre mi trabajo fin de carrera!! :mrgreen:
He colgado aqui (http://slalen.4shared.com) la memoria y los programas. Es una recopilación de los demás archivos, con correcciones y más anotaciones para simplificar un poco más las cosas.

No se si será la definitiva, pero debido a las preguntas sobre las librerías y los códigos que colgué en su día me he dado más prisa y he subido los archivos.

Un saludo a todos!!!

Espero que toda esa parrafada sirva para ayudar a alguien :mrgreen:
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: Nocturno en 28 de Mayo de 2007, 06:52:37
Enhorabuena Slalen, ¡te habrás quedado agusto después de escribir 653 páginas, macho!
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: txiku en 28 de Mayo de 2007, 15:22:33
Hola Palitroque:

Ya resolvi el problema de los ficheros ejecutables e instalables de Visual studio. Este es mi caso particular ya que estaba usando el control Mscomm importado desde VB6 con el Mscomm32.ocx. La forma de crear ficheros ejecutables y llevarlos a otro equipo es mediante el menu "BUILD" y se crearan en el directorio del proyecto en una carpeta llamada Debug o Release. Para crear un archivo instalable y exportarlo a otro equipo sirve con el menu "PUBLISH". En mi caso he tenido que registrar en el Pc donde queria correr mi aplicacion, el fichero Mscomm32.ocx, que se encarga de controlar el puerto serie. Haciendo este registro y ejecutando el fichero ejecutable ya tengo mi aplicacion funcionando en cualquier Pc.
No olvidar instalar la version correspondiente del Microsoft .NET framework

Saludos Txiku
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: jfh900 en 28 de Mayo de 2007, 21:41:36
Enhorabuna Slalen por tu proyecto de fín de carrera y gracias por compartirlo con todos. Es un excelente trabajo que aclara muchas dudas en cuanto al USB y a los micros (practicamente tenemos un datasheet en toda regla). Solo me queda animarte para que continues con la superior.

Un saludo.
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: Slalen en 29 de Mayo de 2007, 05:37:25
Enhorabuena Slalen, ¡te habrás quedado agusto después de escribir 653 páginas, macho!

Enhorabuna Slalen por tu proyecto de fín de carrera y gracias por compartirlo con todos. Es un excelente trabajo que aclara muchas dudas en cuanto al USB y a los micros (practicamente tenemos un datasheet en toda regla). Solo me queda animarte para que continues con la superior.

Un saludo.

Muchas gracias a los dos!!! :mrgreen:
Cuando lo presente ya os comentaré.... (que cague)
Lo de la superior... no creo. Pero gracias por los ánimos  :mrgreen:

A ver si puedo colgaros unas fotos del trasto...

Un saludo, Muchas gracias!!
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: PalitroqueZ en 29 de Mayo de 2007, 12:29:00
...
Ya resolvi el problema de los ficheros ejecutables e instalables de Visual studio. Este es mi caso particular ya que estaba usando el control Mscomm importado desde VB6 con el Mscomm32.ocx. La forma de crear ficheros ejecutables y llevarlos a otro equipo es mediante el menu "BUILD" y se crearan en el directorio del proyecto en una carpeta llamada Debug o Release. Para crear un archivo instalable y exportarlo a otro equipo sirve con el menu "PUBLISH". En mi caso he tenido que registrar en el Pc donde queria correr mi aplicacion, el fichero Mscomm32.ocx, que se encarga de controlar el puerto serie. Haciendo este registro y ejecutando el fichero ejecutable ya tengo mi aplicacion funcionando en cualquier Pc.
No olvidar instalar la version correspondiente del Microsoft .NET framework
...

¡¡que bién txiku!! por lo que comentas es muy parecido al VB 6.0 a excepción que hay que instalar el framework



(Slalen) ¿Guillermo ese es tu nombre?

acabo de darle una ojeada a tu tesis, y dejame FELICITARTE por el empeño y el esmero que le pusiste. como decimos aquí "le echaste un camión a ese proyecto"   :-/ :-/


bueno amig@s con esta tesis tienen una BUENA referencia para los que quieran empezar con el 18F4550 y sus hermanos 'menores', está TODO TODO explicado y en ESPAÑOL sobre la arquitectura de este uC PIC y como no podía faltar el módulo USB.

seguiré leyendo en otro rato, son demasiadas paginas.  :)

PD:
le echaste un camión: dedicarle mucho empeño a una meta propuesta.
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: Slalen en 30 de Mayo de 2007, 06:26:43
(Slalen) ¿Guillermo ese es tu nombre?

acabo de darle una ojeada a tu tesis, y dejame FELICITARTE por el empeño y el esmero que le pusiste. como decimos aquí "le echaste un camión a ese proyecto"   :-/ :-/


bueno amig@s con esta tesis tienen una BUENA referencia para los que quieran empezar con el 18F4550 y sus hermanos 'menores', está TODO TODO explicado y en ESPAÑOL sobre la arquitectura de este uC PIC y como no podía faltar el módulo USB.

seguiré leyendo en otro rato, son demasiadas paginas.  :)

PD:
le echaste un camión: dedicarle mucho empeño a una meta propuesta.


Muchas gracias PalitroqueZ, pero parte de los méritos son tuyos y de otra gente de este foro!!

Si, mi nombre es guillermo, no lo había puesto en ningún sitios (hasta ahora)

(http://todos.gif)
Cuelgo un gif animado de las vistas del cochecito.

Un saludo y muchas gracias a todos!!!
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: akelaver en 30 de Mayo de 2007, 08:06:26
disculpen pero tengo un ligerillo problema ya que el CCS que tengo para programar no cuenta con las librerias de !*F2550 ni la del 18F4550 ni otras maas q son necesarias para los ejemplos que han venido explicando aqui si alguien me las pudiera facilitar o decirme donde las puedo conseguir se los agradeceria mucho

saludos desde mexico
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: PalitroqueZ en 01 de Junio de 2007, 14:07:34
¡Hola!

ha pasado tiempo que no le dedico al aprendizaje, aprovecharé un tiempito libre que tengo, a ver que se puede hacer con el 18f4550

ahora le toca al módulo Timer1 , ya le había echado el guante para generar demoras en modo temporizador con base de tiempo interno (ver este tema (http://www.todopic.com.ar/foros/index.php?topic=16982.0)), pués ahora le toca la temporización con base de tiempo externa  e interrumpiendo la cuenta al desborde.

yendo a la página 131 del 39632D.pdf tenemos lo necesario para hacer arrancar a este señor.

antes de ver registros, etc vamos por el dibujito (FIGURE 12-1), así se hace fácil de entrarle :)

(http://www.todopic.com.ar/foros/index.php?action=dlattach;topic=15208.0;attach=5345)

esa imagen lo dice todo, si yo quiero por ejemplo que el timer1 me cuente x segundos en modo sleep, trayendo como consecuencia que debo usar una base de tiempo externo mediante un cristal e independientemente del ritmo a que vá el micro, entonces a dibujaré mi camino de registros a usar.


(http://www.todopic.com.ar/foros/index.php?action=dlattach;topic=15208.0;attach=5347)

siguiendo el camino de la 'culebrita' entonces los bits de los SFR van de esta manera:

T1OSCEN <- b'1'

TMR1CS <- b'1'

T1CKPS1:T1CKPS0 <- b'00'

T1SYNC <- b'1'

TMR1ON <- será tratado para habilitar el timer1 cuando sea requerido

TMR1IF <- será tratado en el servicio de petición a la interrupción

(ISR ó SRI)

y ¿donde estan esos bits? todos estan el el SFR T1CON

(http://www.todopic.com.ar/foros/index.php?action=dlattach;topic=15208.0;attach=5349)

¡ah! me faltaron 2

RD16 y T1RUN ¿quienes son esos?

Código: C
  1. RD16: 16-Bit Read/Write Mode Enable bit
  2. 1 = Enables register read/write of Timer1 in one 16-bit operation
  3. 0 = Enables register read/write of Timer1 in two 8-bit operations
  4.  
  5. T1RUN: Timer1 System Clock Status bit
  6. 1 = Device clock is derived from Timer1 oscillator
  7. 0 = Device clock is derived from another source

en mi caso quedaran así:

RD16 <- b'0'
T1RUN <- 0b'0'

ya tenemos lista la parte de configurar el T1CON, falta saber cuanto debo cargar el par TMR1H:TMR1L

usaré un cristal de 32Khz -> d'32000' -> 0x7D00 entonces para completar la cuenta de 1 segundo restaré el máximo permitido d'65535' -> 0xffff - 0x7D00 -> 0x82FF

con esto quiero decir que al encender el timer, éste comenzará a contar o incrementarse a partir de 0x82FF y al llegar a 0xffff + 1 se desbordará el par TMR1H:TMR1L y ocurrirá mi interrupción de 1 segundo

(sumando a los ciclos de las lineas dentro del SRI)

parte del código quedaría así

Código: ASM
  1. ...
  2.  movlw b'00001111'      ; Configure for external clock,
  3.         movwf T1OSC             ; Asynchronous operation, external
  4.  
  5. oscillator
  6.  ...
  7.  movlw  0xff
  8.         clrf    TMR1L
  9.         movlw   0x82
  10.         clrf    TMR1H

antes de escribir el programa completo, me conseguí con una piedra nueva en el camino, me refiero al tema de las interrupciones, resulta que en la familia 18, existen 2 tipos de interrupciones, no ahondaré mucho ya que el amigo micro_cadaver lo está desarrollando en este post (http://www.todopic.com.ar/foros/index.php?topic=17017.msg117440#msg117440)  (y además estoy empezando, quee voy a está explicando yo jeje)
 
peero si me remitiré como usarlo en este ejemplo.

(http://www.todopic.com.ar/foros/index.php?action=dlattach;topic=15208.0;attach=5351)

(pág 135)

aquí señalé los SFR involucrados con la interrupción

empecemos por el último:

TMR1IP: TMR1 Overflow Interrupt Priority bit
1 = High priority
0 = Low priority

como yo usaré la dirección 0x8 para el ISR, es decir, la ISR de alta prioridad, entonces

TMR1IP <- 0x1

PIE1: ya es conocido de los que vienen de la familia 16, selecciona la fuente de interrupción timer1

TMR1F: la bandera que se activa cuando ocurre el desbordamiento, no es tan necesario en este caso.

GIE: ya es conocido de los que vienen de la familia 16, es el 'papá de los helados' de las interrupciones, sin éste nadie vá pal baile, es decir, no ocurrirá ninguna interrupción.

esto que hice se puede representra graficamente con el camino de la culebrita:

(http://www.todopic.com.ar/foros/index.php?action=dlattach;topic=15208.0;attach=5353)

el código completo:

Código: ASM
  1. ;******************************************************************************************
  2. ; haciendo arrancar el timer1 en modo contador externo asincrono (base de tiempo externa)
  3. ; a traves de un cristal 32Khz para contar tiempos de 1 Seg poniendo a dormir el micro,
  4. ; despertando luego de una interrupcion para encender o apagar un led
  5. ; Pedro - PalitroqueZ
  6. ; 30-Mayo-2007    10:30 PM
  7. ;*****************************************************************************************
  8.         #DEFINE LED_RD0 LATD,0,ACCESS           ; RD0
  9. ;**************************************************************************
  10.         LIST P=18F4550  ;directive to define processor
  11.         #include <P18F4550.INC> ;processor specific variable definitions
  12.  
  13. ;**************************************************************************
  14.         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
  15.  
  16. ;**************************************************************************
  17.         org 0
  18.         goto inicio
  19.  
  20.         org 0x8                         ;interrupcion alta prioridad
  21.         bcf PIR1, TMR1IF                        ; Clear interrupt flag
  22.         btg     LED_RD0         ; togglea a rd0 para encender o apagar al led
  23.         movlw   0xff            ; carga 0x82ff en TMR1
  24.         movwf   TMR1L
  25.         movlw   0x82
  26.         movwf   TMR1H
  27.         retfie
  28.  
  29. ;********************************************************
  30. inicio:
  31.         clrf LATA ; limpia los latch
  32.         clrf LATB
  33.         clrf LATC
  34.         clrf LATD
  35.         clrf LATE
  36.         clrf TRISA
  37.         clrf TRISB ; configura RB0<- entrada, el resto -> salida
  38.         clrf TRISC
  39.         clrf TRISD
  40.         clrf TRISE
  41. ;//------------------------------------------------------
  42. ; ahora viene la deshabilitacion de modulos (pheriperals)
  43. ;*******************************************************
  44.         clrf ADCON0 ; desactiva el CAD
  45.         movlw 0xf
  46.         movwf ADCON1 ; todas digitales
  47.         bcf INTCON,GIE ; desactiva interrupciones
  48.         movlw 0x7
  49.         movwf CMCON ;desactiva el modulo comparador
  50.         ;clrf SPPCON ; desactiva el modulo Streaming Parallel Port (SPP)
  51.         clrf SSPCON1 ; desactiva el modulo MSSP,SSPEN
  52.         ;bcf UCON,USBEN ; desactiva el modulo USB
  53.         bsf INTCON2,RBPU ; desactiva las resistencias de amarre en PORTB
  54.  
  55. ;//-------------------------------------------
  56.  
  57.         movlw b'01001000'
  58.         movwf   OSCCON
  59.        
  60.         movlw b'00001110'       ; Configure for external clock, timer1=off
  61.         movwf T1CON             ; Asynchronous operation, external oscillator
  62.         bsf PIE1,TMR1IE         ; Enable Timer1 interrupt
  63.  
  64.         movlw   0xff
  65.         movwf   TMR1L
  66.         movlw   0x82
  67.         movwf   TMR1H
  68.         bsf     RCON,IPEN               ; se acepta las interrupciones prioritarias
  69.         bsf     IPR1,TMR1IP             ; TMR1 Overflow Interrupt Priority bit, High priority
  70.         bsf T1CON,TMR1ON                                        ; enciende el timer1
  71.         bsf     INTCON,GIEH
  72.         ;sleep
  73. d:      nop
  74.         goto d
  75.  
  76.         END

correción: al final del programa va así:

Código: ASM
  1. ...
  2. bsf     INTCON,GIEH
  3. d:      sleep
  4.                 goto d
  5.  
  6.                 END


el que tenga dudas con las palabras de configuraciones, busque hlpPIC18ConfigSet.chm


notas:

- traté de simular la interrupción en MPLAB-SIM, y en la ayuda está muy confuso, por un lado dicen que si se puede colocando un clock stimulus (haciendo la de clock external):


16-bit Core (PIC18) Peripherals
Along with core support, MPLAB SIM supports the following

peripheral modules, in addition to general purpose I/O:

Timers
...
Timer0
...
All Other Timers in their various modes are supported, except for

modes using an external crystal. MPLAB SIM supports Timer interrupts

generated on overflow, and interrupts generated by wake-up

from sleep. Although the external oscillator is not simulated, a clock

stimulus can be assigned to those pins.



y por el otro dicen:


Depending on device:
Timer1 increments on RC0, not RC1, for Timer1 enabled


tendré que montar el programa en el pic y ensayar

- LOW-POWER TIMER1 OPTION esta opción la dejaré habilitada por defecto (high power)

- para los que quieran probar con otros 18Fxxxx en proteus, a mi no me funcionó en modo sleep. funciona OK con el 18f4525 poniendo un bucle eterno.

ahora se procede a grabar, montar y...

¡ no funciona !

¿porque?

a ver... después de un par de minutos revisando conexiones y el programa, se me ocurrió 'tocar' los cristales estando alimentado el micro. ¡PRENDIÓ!

umm ya me conseguí con una limitación física: el ruido.  La mejor fuente de ruidos para ensayar circuitos es el mismo

protoboard, porque incluso acercando los dedos sin tocar los cristales, empezaba a oscilar el led.

haré otro intento para tratar de estabilizar a TOSC1, mirando la pág 134

(http://www.todopic.com.ar/foros/index.php?action=dlattach;topic=15208.0;attach=5355)

enrollaré un pedazo de cable en ambos cristales cuyos terminales conectados a gnd.....

nada, intento fallido :( bueno que le vamos hacer, no todo es de color de rosa en esta vida jeje

¿y que tal si configuramos el bloque oscilador para que cpu se sincronice de los 4Mhz internos?

esa es otra historia...


PD: que largo, ¡¡ y todo para encender un led durante 1 segundo !!
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: PalitroqueZ en 02 de Junio de 2007, 14:22:45
Ahora usaré el bloque oscilador interno que trae este pic, específicamente quiero hacer trabajar el CPU y los perifericos a 4Mhz.

en este ejemplo, se encenderá/apagará un led en ~1 segundo

y para añadirle un ingrediente a la receta usaremos el timer0 como retardo, a ver que cositas trae.

dando una miradita a la página 26 tenemos la gran estructura donde se configura el oscilador, mi camino a seguir:

(http://www.todopic.com.ar/foros/index.php?action=dlattach;topic=15208.0;attach=5359)

el SFR encargado es OSCCON

(http://www.todopic.com.ar/foros/index.php?action=dlattach;topic=15208.0;attach=5361)

mi configuración irá así:


   movlw   b'1100010'
   movwf   OSCCON
 
aquí aparecen unos bits curiosos, como lo son:
 
 OSTS e IOFS
 
para generar nuestro retardo de 1 segundo, usaremos el timer0 en modo temporizador, con cuenta interna e interrumpiendo al desbordarse.

para que lo sepan: no se puede poner a dormir al señor pic porque el timer0 se detiene
pág 129

Citar
Since Timer0 is shut down in Sleep mode, the TMR0
interrupt cannot awaken the processor from Sleep.

 
bueno no importa, para el caso, lo hacemos por encuesta (polling ó poleo) mediante un bucle eterno.

ajá aquí viene algo interesante:


(http://www.todopic.com.ar/foros/index.php?action=dlattach;topic=15208.0;attach=5363)

resulta que el timer0 posee un registro de 16 bits TMR0H:TMR0L

umm.. con un par de bytes puedo llegar a 1 segundo si uso prescaler ¿como?

usando la herramienta Timer calc:


(http://img392.imageshack.us/img392/5929/timercalcgq1.jpg)

entonces solo me queda cargar d'3036' -> 0xBDC a TMR0H:TMR0L y ya está

el resto es configurar los SFR para generar la interrupción por desborde, igual que en el post anterior

- selecciono interrupción prioritaria. TMR0IP <- 1
- selecciono fuente interrupción timer0. TMR0IE <- 1
- activo la cuenta. TMR0ON <- 1
- habilito todo el sistema de interrupciones. GIE <- 1

me está faltando algo, el juego de palabra de configuración, incorporé:

FOSC = INTOSC_XT y FCMEN = ON (éste último lo explicaré mas adelante)

el código quedará así:

Código: ASM
  1. ;******************************************************************************************
  2. ;  encender y apagar un led durante ~1 segundo
  3. ;  USANDO como clock primario el Internal Oscillator Block a 4Mhz para el CPU
  4. ;
  5. ; 02-Junio-2007    12:17 AM
  6. ;******************************************************************************************
  7.         #DEFINE LED_RD0 LATD,0,ACCESS           ; RD0
  8. ;**************************************************************************
  9.         LIST P=18F4550  ;directive to define processor
  10.         #include <P18F4550.INC> ;processor specific variable definitions
  11.  
  12. ;**************************************************************************
  13.         CONFIG FOSC = INTOSC_XT, PWRT = ON,BOR = SOFT, VREGEN = OFF, FCMEN = ON
  14.         CONFIG WDT = OFF ,WDTPS = 1,MCLRE = ON,PBADEN = OFF,LVP = OFF,XINST = OFF,DEBUG = OFF
  15.  
  16. ;**************************************************************************
  17.         org 0
  18.         goto inicio
  19.  
  20.         org     0x8
  21.         btg     LED_RD0
  22.         call    cargar_timer0  
  23.         bcf     INTCON,TMR0IF
  24.         retfie
  25.        
  26. ;********************************************************
  27. inicio:
  28.         clrf LATA ; limpia los latch
  29.         clrf LATB
  30.         clrf LATC
  31.         clrf LATD
  32.         clrf LATE
  33.         clrf TRISA
  34.         clrf TRISB ; configura RB0<- entrada, el resto -> salida
  35.         clrf TRISC
  36.         clrf TRISD
  37.         clrf TRISE
  38.         movlw   b'1100010'
  39.         movwf   OSCCON
  40. ;//------------------------------------------------------
  41. ; ahora viene la deshabilitacion de modulos (pheriperals)
  42. ;*******************************************************
  43.         clrf ADCON0 ; desactiva el CAD
  44.         movlw 0xf
  45.         movwf ADCON1 ; todas digitales
  46.         bcf INTCON,GIE ; desactiva interrupciones
  47.         movlw 0x7
  48.         movwf CMCON ;desactiva el modulo comparador
  49.         clrf SPPCON ; desactiva el modulo Streaming Parallel Port (SPP)
  50.         clrf SSPCON1 ; desactiva el modulo MSSP,SSPEN
  51.         bcf UCON,USBEN ; desactiva el modulo USB
  52.         bsf INTCON2,RBPU ; desactiva las resistencias de amarre en PORTB
  53.  
  54.        
  55.         movlw   b'11'
  56.         movwf   T0CON
  57.         movlw   b'00100000'
  58.         movwf   INTCON 
  59.         bsf             INTCON2,TMR0IP
  60.         call    cargar_timer0
  61.         bsf     T0CON,TMR0ON
  62.         bsf     INTCON,GIEH
  63.         goto    $
  64.  
  65. cargar_timer0:
  66.         movlw   0xdc
  67.         movwf   TMR0L
  68.         movlw   0xb
  69.         movwf   TMR0H
  70.         return
  71. ;//-------------------------------------------
  72.         END

un pantallazo en MPLAB

(http://img66.imageshack.us/img66/6010/mplabkb3.th.jpg) (http://img66.imageshack.us/my.php?image=mplabkb3.jpg)


creo que se podía haber llegado a 1 Seg exacto, pero ya sería bastante para el ejemplito

finalmente, les cuento que fué montado, probado en protoboard con resultados SATISFACTORIO.  :-/  :mrgreen:

Allí estaba el pic no mas, solito y corriendo por si mismo, sin que nadie le dictara los pasos, ya aprendió a caminar el muchacho. asi es que, iiijjaa  :D :D

nota:

- se me ha pasado por alto, cuando se está escribiendo en asm, hay que tomar en cuenta todos los SFR y la configuration word, yo coloqué solo los que necesito, los demás no se como estan por defecto. Así que no se fien, y lean esos registros antes de ensayar.

Título: Re: Mis primeros pasos con el 18F4550
Publicado por: coromoto en 14 de Diciembre de 2007, 13:50:25
hola PalitroqueZ con lo que me dijiste muchas gracias estoy empezando a revisar material, y este sobretodo ya que es el micro con el que tengo que trabajar, mi proyecto en si es una tarjeta de adquisicion de datos ahora me dijeron que la haga por comunicacion serial ya es menos complicado el trabajo pero igual como estoy empezando no es tan facil, te agradeceria si me pudieras publicar   algunos ejemplos del pic18f4550 en mplab para guiarme un poco su uso ademas estoy revisando el material de este foro y muchisimas gracias te cuento como voy, ademas me gustaria muchisimo poder realizar mi proyecto de las dos formas serial y usb bueno gracias cuidate coromoto :g)
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: PalitroqueZ en 14 de Diciembre de 2007, 16:57:09
Hola coromoto.

revisa en la segunda página:

http://www.todopic.com.ar/foros/index.php?topic=15208.msg103042#msg103042


y cuarta página:
http://www.todopic.com.ar/foros/index.php?topic=15208.msg109265#msg109265

hay 2 documentos de todo lo que está aquí para que lo leas en modo off-line y unos cuantos ejemplos usando el mplab.

Título: Re: Mis primeros pasos con el 18F4550
Publicado por: coromoto en 08 de Enero de 2008, 20:07:22
hola PalitroqueZ espero hallas pasado unas estupendas navidades!!! te deseo un feliz año, te mando muchos saludos yo retomando mi proyecto de la comunivcacion con el pic18f4550, tengo unas dudas todo lo que he lleido del mismo es para trabajar con usb, yo antes solo he trabajado con el 16c74a que es el que nos dan en materia en la universidad, tengo dudas se mas o menos lo que tengo que hacer la adquisicion de los datos pero tengo dudas yo puedo trabajr este pic parecido al que trabaje?? claro con sus instrucciones y demas, pero para trabajar el puerto serial no me preocupo  se que tengo que configurar la rapidez de transmision, es que estoy trabajando sola y no tengo quien me pueda guiar ni un poco, asi que te agradeceria cualquier ayuda y disculpa las molestias, gracias 
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: PalitroqueZ en 08 de Enero de 2008, 20:48:50
Hola coromoto, gracias. Feliz año para tí también  :P

creo que te refieres es al 16C745 el que tiene módulo usb, estuve mirando por encima la datasheet 41124c.pdf y trabaja con la versión 1.1 ,es decir, baja velocidad.

la respuesta de si puedes trabajar con el 18f4550 de la misma forma que con el 16c745, supongo que si, por 2 cosas:

- que lo que cambia a nivel de módulo seria la velocidad, aunque no he leido a fondo el modulo del 16c745, pero forzosamente tienen que ser compatible por eso de la compatibilidad ascendente entre la v2.0 y las anteriores

- suponiendo que usaras el ccs, en los ejemplos y en la ayuda dicen que igual sirve para ambos pic, asi que    la programación será transparente (a excepción de los fuses y la cantidad de puertos, etc), y no será tan traumatico el cambio para un pic mas potente.

...es que estoy trabajando sola y no tengo quien me pueda guiar ni un poco, asi que te agradeceria cualquier ayuda y disculpa las molestias, gracias 

claro si esta dentro de mis conocimientos con gusto te ayudaré, y sino seguro que alguno aquí te dará una mano.

Título: Re: Mis primeros pasos con el 18F4550
Publicado por: Slalen en 09 de Enero de 2008, 06:24:43
Feliz año a todos!!!

Coromoto, aquí has encontrado una de las mejores ayudas en lo relativo a electrónica.

Que no te asuste el cambio a la gama mejorada de los PICs, al principio es un caos, pero al cabo de un tiempo, ¡¡¡¡¡todo encaja como un puzle sideral!!!!!

En lo que pueda te ayudaré, aunque no tengo casi tiempo para meterme en el foro :(

Un saludo!!!!
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: coromoto en 10 de Enero de 2008, 14:00:32
hola nueva nuevamente y gracias por responderme, efectivamente lo que he trabajado es el 16c74 el cual no trae usb, tengo la duda de que si el 18f4550 puedo trabajarlo de forma serial y tal vez en forma sencilla con sus instrucciones propias, por el momento me pidieron en forma serial, no se si cuando trabajo asi se podra asemejar el mismo en la forma de programar a trabajar con otros pic (en comunicacion serial), por supuesto  no igual, y si lo puedo trabajar a 9600 baudios??

gracias y le agradezco todo de ante mano  :g) 
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: coromoto en 10 de Enero de 2008, 14:19:10
hola, se me paso por alto pregunta, lo que he leido es que el mssp para trabajar la comunicacion serial pero sincronica hay mucha diferencia que trabajar en forma asincronica ? gracias
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: PalitroqueZ en 10 de Enero de 2008, 17:43:13
... y si lo puedo trabajar a 9600 baudios??
...

sip

hola, se me paso por alto pregunta, lo que he leido es que el mssp para trabajar la comunicacion serial pero sincronica hay mucha diferencia que trabajar en forma asincronica ? gracias

mejor no te respondo ya que a lo mejor me sale un rebuzno, a ver que dicen l@s forer@s

Título: Re: Mis primeros pasos con el 18F4550
Publicado por: PerriPic en 16 de Enero de 2008, 09:43:19
Hola, estoy empezando con esto del USB y necesito una ayudita. Voy a realizar mi proyecto fin de carrera y tengo q programar un data logger, cuya conexion será con el USB. Utilizaré el 18F2550 y mi primera duda viene de qué tipo de transmision utilizar. Creo q es más fácil la transmision CDC, utilizando el COM virtual en el PC, pero no sé si sería mejor utilizar la BULK transfer...Utilizaré el lenguaje c18 xq creo q es el más sencillo para mí. Y para lo único q utilizo la transmision es para dar parametros de configuracion al PIC ncesesarios para la adquisiciond e datos y para recibir los datos tomados desde el PIC en el PC, asi q no creo q necesite algo demasiado "complejo"!!!Espero q sepaís contestarme...y asi podré seguir exponiendo mis dudas y avances!!

Gracias, un saludo
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: Slalen en 16 de Enero de 2008, 10:57:32
Hola PerriPic

En mi web tienes todo lo necesario para hacerlo en c18.

Lo mejor que te puede servir está en robótica "el cochecito leré". Tienes tutoriales en español, el datasheet,etc...


Ese fué mi proyecto de fin de carrera. Tuve que hacer un programa genérico y un manual para adaptarlo a cualquier aplicación.

Suerte!!!
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: jca en 06 de Febrero de 2008, 22:47:46
Hola a todos... haber, tengo una duda para variar jeje he estado intentando probar los distintos programas con el usb que an hecho J1M y PalitroqueZ y bueno cual ha sido mi sorpresa que para cada programa necesito unos controladores distintos... me explico... si cargo en el pic un programa de J1M me pide los driver suyos y si cargo uno de PalitroqueZ quiere los controladores de PalitroqueZ(que por cierto no los encuentro por ningún sitio a si que no he podido probar sus programas todavía) esto es asi(espero que no).... estoy haciendo algo mal....

Por otro lado en mi intento de aprender a programar en C los pics me he descargado el CCS PCWH 4.057 pero para ponerlo a funcionar me pide unos archivos de registro, tb he intentado hacerme con el MPLAB C18 pero es imposible compilar un archivo en C entre otras cosas pq por ejemplo los codigos fuente que se pueden coger de este foro pues en su cabecera incluyen dos o tres archivos los cuales tampoco encuentro, hay.... si mi ensamblador diese tanto de si como para programar el USB :D

Bueno un saludo, espero que mis preguntas no sean de autentico novato jeje aunque si me gustaría aclararlas...

PD: Por cierto que se me olvidaba un trabajo estupendo PalitroqueZ animo....
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: Slalen en 07 de Febrero de 2008, 05:45:53
Hola jca_21_yo,

los drivers que te pide para los programas de PalitroqueZ, creo que son los que suministra microchip. De todas formas si en el archivo .inf de J1M cambias el VID y el PID por los del programa de PalitroqueZ te valen por que es lo único diferente.

Si descargas el C18 de aqui (http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1406&dDocName=en010014) y lo instalas, mis programas te deberían compilar (están en mi página web).

Por último el tema del CCS, en el foro no puedes pedir los archivos de registro.

Un saludo!!!
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: PalitroqueZ en 07 de Febrero de 2008, 12:40:31
Hola a todos... haber, tengo una duda para variar jeje he estado intentando probar los distintos programas con el usb que an hecho J1M y PalitroqueZ y bueno cual ha sido mi sorpresa que para cada programa necesito unos controladores distintos... me explico... si cargo en el pic un programa de J1M me pide los driver suyos y si cargo uno de PalitroqueZ quiere los controladores de PalitroqueZ(que por cierto no los encuentro por ningún sitio a si que no he podido probar sus programas todavía) esto es asi(espero que no).... estoy haciendo algo mal....

Por otro lado en mi intento de aprender a programar en C los pics me he descargado el CCS PCWH 4.057 pero para ponerlo a funcionar me pide unos archivos de registro los cuales no encuentro por ningún sitio, tb he intentado hacerme con el MPLAB C18 pero es imposible compilar un archivo en C entre otras cosas pq por ejemplo los codigos fuente que se pueden coger de este foro pues en su cabecera incluyen dos o tres archivos los cuales tampoco encuentro, hay.... si mi ensamblador diese tanto de si como para programar el USB :D

Bueno un saludo, espero que mis preguntas no sean de autentico novato jeje aunque si me gustaría aclararlas...

PD: Por cierto que se me olvidaba un trabajo estupendo PalitroqueZ animo....

Totalmente cierto, y además agrego que no guardé los inf necesarios, la solución es buscar en los codigos fuentes los VID_PID que usé y meterlos en un .inf para que funcione. ya me pongo en ello.



Meta:

el programa se llama PicMultiCalc y se consigue en http://www.mister-e.org/

RedPic también hizo uno y lamentablemente no lo encuentro  :shock:









Título: Re: Mis primeros pasos con el 18F4550
Publicado por: jca en 07 de Febrero de 2008, 13:15:02
Hola Slalen no pido los archivos de registro jeje solo era una enumeración de los múltiples problemas con los que me encontrado estos días y anoche un poco enfadado escribí el mensaje ese(es impresionante la facilidad con la que hace la gente las cosas por aqui y yo por ejemplo para hacer una tontá de programa para el 18f me tiro 3 dias y todavía estoy que no funciona...supongo que me queda mucho por aprender)... seguiré con mi asm e intentandolo con el C18 el cual no compila pq los archivos que incluis en las cabeceras de los programas me dice que no estan.
Los driver que suministra microchip no valen para los programas de PalitroqueZ por lo menos mi ordenador no los quiere jeje y supongo que sabrá mas el que yo  :) . En cuanto a eso que cuentas de lo del VID y el PID tendré que mirarlo con detenimiento pq es la primera vez que oigo todo eso jeje, de todas formas gracias a los dos por contestarme tan rápido....

1Saludo!!
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: Slalen en 07 de Febrero de 2008, 13:40:03
Hola Jca

No te desesperes que cuesta pasar de asm a c pero con paciencia todo se consigue.

Si quieres entra en mi web, hay un tutorial sobre el usb, el c18, ejemplos de c18, etc.

Creo que el error que tienes con el C18 es porque o bien, has cambiado el directorio origen o el que ha hecho el programa lo ha cambiado. En propiedades hay un apartado para cambiar la carpeta de las librerías y archivos. No te puedo decir donde está porque estoy en el trabajo y no tengo instalado el C18.

un saludo y ánimo
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: PalitroqueZ en 08 de Febrero de 2008, 12:33:11
Hola jca. revisé los ejemplos.


comunicación CDC:

en:

ejemplo6_2.rar
ejemplo6_3.rar
ejemplo6_parte4.rar
ejemplo6_parte5.rar
ejemplo6_parte6.rar

cambiar la linea #include "usb_cdc.h" por #include <usb_cdc.h>, le puse comillas ya que cambié los descriptores de cadena, si te pide archivo instalador, busca C:\Archivos de programa\PICC\Drivers\cdc_NTXP.inf



comunicación BULK:

en:

ejemplo7_parte4.rar
ejemplo8_parte1.rar

se utilizó el PicUSB.h, es el mismo que el de J1M (lo pueden bajar de su página web), solo le cambié los descriptores de cadenas. Igual sirve porque se conserva los VID_PID


si sigues teniendo problemas avisa  :)


Título: Re: Mis primeros pasos con el 18F4550
Publicado por: pocher en 08 de Febrero de 2008, 17:21:22
Hola Pali, estoy probando los ejemplos:

- ejemplo6_parte5
- ejemplo6_parte6

El ejemplo6_parte5 no me funciona bien. No siempre que pulsas sobre enviar el caracter "a" lo hace, a veces lo hace y a veces no. Idem para la recepción del mensaje enviado por el PIC.

Creo que se debe a:

Código: [Seleccionar]
Private Sub Timer1_Timer()
On Error GoTo paca
DoEvents
If MSComm1.PortOpen = True Then
    DoEvents
    lblestado.Caption = "Conectado"
    Debug.Print "Conectado"
    MSComm1.PortOpen = False
    Exit Sub
Else
    DoEvents
    MSComm1.PortOpen = True
    Exit Sub
End If
paca: Debug.Print Err.Number & ": " & Err.Description
     Select Case Err.Number
        Case 8002   'Número de puerto no válido
            DoEvents
           lblestado.Caption = "Desconectado"
        Case 8005 'el puerto ya está abierto
            DoEvents
            lblestado.Caption = "puerto abierto"
        Case 8012 '8012 el dispositivo no está abierto
            DoEvents
            lblestado.Caption = "Desconectado"
        Case 8015
            DoEvents    ' para evitar retardos en bucles
            lblestado.Caption = "Desconectado"
    End Select
      Exit Sub
End Sub

En este procedimiento entra cada 10ms y está contínuamente cerrando y abriendo el puerto. Por eso si intentas enviar el caracter "a" y el puerto está cerrado pués no lo envia. Idem al recibir.

¿Qué te parece?

Otra cosilla, en el adjunto para bajar del ejemplo6_parte6 no aparece la parte de VB. El código se podría copiar pero la parte gráfica no. Que raro que en todo este año que ha pasado desde que lo publicaste nadie haya dicho nada.

Por estas fechas hace un año estarias hechando humo con esto del USB ... como yo ahora.

Un saludo Pali.
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: PalitroqueZ en 08 de Febrero de 2008, 19:32:20
Hola Pali, estoy probando los ejemplos:

- ejemplo6_parte5
- ejemplo6_parte6

El ejemplo6_parte5 no me funciona bien. No siempre que pulsas sobre enviar el caracter "a" lo hace, a veces lo hace y a veces no. Idem para la recepción del mensaje enviado por el PIC.

Creo que se debe a:

Código: [Seleccionar]
Private Sub Timer1_Timer()
On Error GoTo paca
DoEvents
If MSComm1.PortOpen = True Then
    DoEvents
    lblestado.Caption = "Conectado"
    Debug.Print "Conectado"
    MSComm1.PortOpen = False
    Exit Sub
Else
    DoEvents
    MSComm1.PortOpen = True
    Exit Sub
End If
paca: Debug.Print Err.Number & ": " & Err.Description
     Select Case Err.Number
        Case 8002   'Número de puerto no válido
            DoEvents
           lblestado.Caption = "Desconectado"
        Case 8005 'el puerto ya está abierto
            DoEvents
            lblestado.Caption = "puerto abierto"
        Case 8012 '8012 el dispositivo no está abierto
            DoEvents
            lblestado.Caption = "Desconectado"
        Case 8015
            DoEvents    ' para evitar retardos en bucles
            lblestado.Caption = "Desconectado"
    End Select
      Exit Sub
End Sub

En este procedimiento entra cada 10ms y está contínuamente cerrando y abriendo el puerto. Por eso si intentas enviar el caracter "a" y el puerto está cerrado pués no lo envia. Idem al recibir.

¿Qué te parece?


Hola pocher

me alegro que alguien haga prueba con esos ejemplos y exponga las fallas :mrgreen:

si es cierto, a veces lo envía y a veces no, y pienso que es por los tiempos del timer, también me ocurría a veces que se quedaba en un loop infinito y se colgaba la aplicación del vb.

pronto retomaré ese estudio, porque estoy en un proyecto que involucra esas transferencias, seguro que cuando vea esos codigos por segunda vez, ya habré madurado un poco esa parte de la programación y resolveré dichas fallas.

cuando hice esos programas, lo unico que me interesaba era entenderlo y que funcionara, y cumplió su cometido, ahora viene la segunda etapa, ajuste y depuración.



Otra cosilla, en el adjunto para bajar del ejemplo6_parte6 no aparece la parte de VB. El código se podría copiar pero la parte gráfica no. Que raro que en todo este año que ha pasado desde que lo publicaste nadie haya dicho nada.

sisi, que pena  :(, no subí ese ejemplo, ya lo busco a la casa y lo subo.  :o


he aquí el programa para el PC hecho en VB6.0 del ejemplo6parte6





Título: Re: Mis primeros pasos con el 18F4550
Publicado por: Black_Knight.B en 08 de Enero de 2009, 01:34:56
Que gran Topic en serio................. mis mas sinceras felicitaciones para PalitroqueZ, me esta siendo de mucha ayuda ahora q empiezo con este PIC.

Saludos
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: kain589 en 08 de Febrero de 2009, 22:45:11
Saludos! he estado mucho tiempo alejado de este mundillo, pero me he propuesto volver y seguir por donde me quede, empezando con el modulo usb y este hilo creo que me va a ser de gran ayuda, asi que queria darte las gracias por compartir tus hallazgos y trabajos con todo el foro.
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: kain589 en 21 de Febrero de 2009, 19:36:29
Hola de nuevo, ya hice algunas cosas con el 18f4550, pero estoy a la mitad del camino. Me propuse usar el VisualBasic.Net, y he tenido problemillas en el uso de los comando para puerto serie en modo cdc, y ahora me propongo a intentarlo con el uso de la API,pero creo que tambien me dara dolores de cabeza. ¿Alguien ha usado visualbasic.net? porque una ayuda siempre viene bien.
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: kain589 en 21 de Febrero de 2009, 21:16:24
Estoy realizando el ejemplo de abrir/cerrar el puerto ¿Hace falta enlazar a la mpusbapi.dll de alguna manera especial? Yo declaro las librerias, asi:

Código: [Seleccionar]
Public Declare Function MPUSBGetDLLVersion Lib "mpusbapi.dll" () As Long

    Public Declare Function MPUSBGetDeviceCount Lib "mpusbapi.dll" (ByVal pVID_PID As String) As Long

    Public Declare Function MPUSBOpen Lib "mpusbapi.dll" (ByVal instance As Long, ByVal pVID_PID As String, ByVal pEP As String, ByVal dwDir As Long, ByVal dwReserved As Long) As Long

    Public Declare Function MPUSBClose Lib "mpusbapi.dll" (ByVal handle As Long) As Long

    Public Declare Function MPUSBRead Lib "mpusbapi.dll" (ByVal handle As Long, ByVal pData As Long, ByVal dwLen As Long, ByRef pLength As Long, ByVal dwMilliseconds As Long) As Long

    Public Declare Function MPUSBWrite Lib "mpusbapi.dll" (ByVal handle As Long, ByVal pData As Long, ByVal dwLen As Long, ByRef pLength As Long, ByVal dwMilliseconds As Long) As Long

    Public Declare Function MPUSBReadInt Lib "mpusbapi.dll" (ByVal handle As Long, ByVal pData As Long, ByVal dwLen As Long, ByRef pLength As Long, ByVal dwMilliseconds As Long) As Long

Cuando despues intento usar :

Código: [Seleccionar]
   Private Sub Form_Load()
   OpenMPUSBDevice     'abre comunicaciones
End Sub

Me dice que variable no esta declarada.

Sin usar esta declaración, me compila pero al intentar abrir me dice:
Código: [Seleccionar]
No se puede encontrar el punto de entrada denominado 'MPUSBOpen' en el archivo DLL 'mpusbapi.dll'.
La .dll esta en la misma carpeta, pero es como si no se "conectara" con la api. Uso visualbasic.net
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: jhozate en 22 de Febrero de 2009, 22:00:55
del p...tas todo lo que han hecho con este pic, yo espero dominar el  877 (me ha sacado canas) y poder iniciarme en programas basicos con el 18F4550 como cuando me inicie con el 16F84A "prendiendo y apagando un led" :mrgreen:

Felicitaciones y gracias por estos aportes
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: ALE1973 en 22 de Febrero de 2009, 23:03:35
Buenas, despues de haber probado con exito el ejemplo de Diego, del keyboard USB, me dispuse a probar hacer un joystick, asi que con el mismo cirtuito, intento hacer andar el AD del 18f4550, pero no hay caso.. no funciona, el resultado siempre es 0, probe cambiando distintos canales, distntas frecuencias de conversion, y nada, lo utilice muchas veces a la conversion AD con el 18f452, y ahora no puedo hacer andar en el 455, pego un trozo del programa donde configuro distintas cosas para el AD, a ver si alguien ve un error, lamentablemente no tengo otro pic para comprobar que no este quemado el AD.
En este ejemplo envio el dato por USB, tambien para asegurarme que no era error del USB, hice la prueba con el puerto serie, pero siempre lo mismo.
Desde ya gracias.
Alejandro.
Código: CSS
  1. void main() {
  2.    int8 Trim[2];
  3.    int8 Buffer;
  4.  
  5.    set_tris_a(0b00001111);
  6.    //set_tris_c(0b11110000);
  7.    
  8.    setup_adc_ports(ADC_CLOCK_DIV_64);
  9.    setup_adc_ports( AN0_TO_AN3  );
  10.    setup_comparator(NC_NC_NC_NC);
  11.    setup_timer_1 ( T1_INTERNAL | T1_DIV_BY_8 );
  12.    setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1|RTCC_8_BIT);
  13.  
  14.  
  15.    delay_ms(500);
  16.  
  17.    usb_init_cs();
  18.  
  19.  
  20.    port_b_pullups(false);
  21.  
  22.    set_tris_b(0b00000001);
  23.    ext_int_edge(0,L_TO_H);
  24.    enable_interrupts(int_ext);
  25.    disable_interrupts(INT_TIMER1);
  26.    disable_interrupts(int_tbe);
  27.    enable_interrupts(INT_TIMER0);
  28.    enable_interrupts(global);
  29.  
  30.    set_adc_channel(1);
  31.  
  32.  
  33. while (TRUE)
  34.    {
  35.       int8 rTemp;
  36.       usb_task();
  37.       usb_debug_task();
  38.      
  39.       if(usb_enumerated())          
  40.       {
  41.                if (fTX){
  42.                      TxUSB[0]=read_ADC();
  43.                      usb_put_packet(1, TxUSB, 8, USB_DTS_TOGGLE);
  44.                      fTX=0;
  45.                }
  46.             }
  47.  
  48.      }
  49. }
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: PalitroqueZ en 26 de Febrero de 2009, 19:26:20
Estoy realizando el ejemplo de abrir/cerrar el puerto ¿Hace falta enlazar a la mpusbapi.dll de alguna manera especial? Yo declaro las librerias, asi:

Código: [Seleccionar]
Public Declare Function MPUSBGetDLLVersion Lib "mpusbapi.dll" () As Long

    Public Declare Function MPUSBGetDeviceCount Lib "mpusbapi.dll" (ByVal pVID_PID As String) As Long

    Public Declare Function MPUSBOpen Lib "mpusbapi.dll" (ByVal instance As Long, ByVal pVID_PID As String, ByVal pEP As String, ByVal dwDir As Long, ByVal dwReserved As Long) As Long

    Public Declare Function MPUSBClose Lib "mpusbapi.dll" (ByVal handle As Long) As Long

    Public Declare Function MPUSBRead Lib "mpusbapi.dll" (ByVal handle As Long, ByVal pData As Long, ByVal dwLen As Long, ByRef pLength As Long, ByVal dwMilliseconds As Long) As Long

    Public Declare Function MPUSBWrite Lib "mpusbapi.dll" (ByVal handle As Long, ByVal pData As Long, ByVal dwLen As Long, ByRef pLength As Long, ByVal dwMilliseconds As Long) As Long

    Public Declare Function MPUSBReadInt Lib "mpusbapi.dll" (ByVal handle As Long, ByVal pData As Long, ByVal dwLen As Long, ByRef pLength As Long, ByVal dwMilliseconds As Long) As Long

Cuando despues intento usar :

Código: [Seleccionar]
   Private Sub Form_Load()
   OpenMPUSBDevice     'abre comunicaciones
End Sub

Me dice que variable no esta declarada.

Sin usar esta declaración, me compila pero al intentar abrir me dice:
Código: [Seleccionar]
No se puede encontrar el punto de entrada denominado 'MPUSBOpen' en el archivo DLL 'mpusbapi.dll'.
La .dll esta en la misma carpeta, pero es como si no se "conectara" con la api. Uso visualbasic.net



Hola kain, tienes que leer en la ayuda de msdn la forma de como hacer llamadas a apis, yo me estoy iniciando recien con el .net y una de las cosas que recomiendan es olvidarse de programar como se hacía en vb6 (aunque sea válida la sintáxis).

Hay un herramienta que sirve de transición de un código de vb6 a vb.net, se llama

Visual Basic 6.0 Code Advisor (http://www.microsoft.com/downloads/details.aspx?FamilyID=a656371a-b5c0-4d40-b015-0caa02634fae&DisplayLang=en)

el Code Advisor te analiza el código fuente de un proyecto vb6 y te dice que sentencias ya no son validas para el .net y las que tienen sustitución, ej: varptr ya no es soportado

Título: Re: Mis primeros pasos con el 18F4550
Publicado por: PalitroqueZ en 26 de Febrero de 2009, 19:28:36
Que gran Topic en serio................. mis mas sinceras felicitaciones para PalitroqueZ, me esta siendo de mucha ayuda ahora q empiezo con este PIC.

Saludos

del p...tas todo lo que han hecho con este pic, yo espero dominar el  877 (me ha sacado canas) y poder iniciarme en programas basicos con el 18F4550 como cuando me inicie con el 16F84A "prendiendo y apagando un led" :mrgreen:

Felicitaciones y gracias por estos aportes

gracias jhozate y a Black_Knight , me alegra que le pueda servir en algo estos post de iniciación :D

Título: Re: Mis primeros pasos con el 18F4550
Publicado por: PalitroqueZ en 26 de Febrero de 2009, 19:30:41
Buenas, despues de haber probado con exito el ejemplo de Diego, del keyboard USB, me dispuse a probar hacer un joystick, asi que con el mismo cirtuito, intento hacer andar el AD del 18f4550, pero no hay caso.. no funciona, el resultado siempre es 0, probe cambiando distintos canales, distntas frecuencias de conversion, y nada, lo utilice muchas veces a la conversion AD con el 18f452, y ahora no puedo hacer andar en el 455, pego un trozo del programa donde configuro distintas cosas para el AD, a ver si alguien ve un error, lamentablemente no tengo otro pic para comprobar que no este quemado el AD.
En este ejemplo envio el dato por USB, tambien para asegurarme que no era error del USB, hice la prueba con el puerto serie, pero siempre lo mismo.
Desde ya gracias.
Alejandro.
Código: CSS
  1. void main() {
  2.    int8 Trim[2];
  3.    int8 Buffer;
  4.  
  5.    set_tris_a(0b00001111);
  6.    //set_tris_c(0b11110000);
  7.    
  8.    setup_adc_ports(ADC_CLOCK_DIV_64);
  9.    setup_adc_ports( AN0_TO_AN3  );
  10.    setup_comparator(NC_NC_NC_NC);
  11.    setup_timer_1 ( T1_INTERNAL | T1_DIV_BY_8 );
  12.    setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1|RTCC_8_BIT);
  13.  
  14.  
  15.    delay_ms(500);
  16.  
  17.    usb_init_cs();
  18.  
  19.  
  20.    port_b_pullups(false);
  21.  
  22.    set_tris_b(0b00000001);
  23.    ext_int_edge(0,L_TO_H);
  24.    enable_interrupts(int_ext);
  25.    disable_interrupts(INT_TIMER1);
  26.    disable_interrupts(int_tbe);
  27.    enable_interrupts(INT_TIMER0);
  28.    enable_interrupts(global);
  29.  
  30.    set_adc_channel(1);
  31.  
  32.  
  33. while (TRUE)
  34.    {
  35.       int8 rTemp;
  36.       usb_task();
  37.       usb_debug_task();
  38.      
  39.       if(usb_enumerated())          
  40.       {
  41.                if (fTX){
  42.                      TxUSB[0]=read_ADC();
  43.                      usb_put_packet(1, TxUSB, 8, USB_DTS_TOGGLE);
  44.                      fTX=0;
  45.                }
  46.             }
  47.  
  48.      }
  49. }


ALE, si tu código está incompleto, será dificil saber que puede estar mal, por lo que veo allí:

¿en que momento fTX es true?

además, leo que configuras 2 timer

¿que sucede en las interrupciones?

¿estás seguro que hay un resultado en TxUSB[0]=read_ADC(); ?

Título: Re: Mis primeros pasos con el 18F4550
Publicado por: kain589 en 26 de Febrero de 2009, 21:44:29
Muchas gracias por la informacion PaLitroquez, no habia caido usar la ayuda del mdsn cosa que si hice para buscar informacion de como usar el usb como puerto serie, aunque no he conseguido que me funcione bien.

Estoy planteandome inicarme en VisualC#, pues con visualbasic,.net no he podido encontar ni ayuda ni informacion clara. Asi que si sigo con basic y lo consigo, posteare por aqui.
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: ALE1973 en 27 de Febrero de 2009, 08:43:11
Palitroquez, gracias por la respuesta, te cuento que si bien el codigo que paso es incompleto, el error esta en la porcion del codigo que pase, leyendo el ASM generado, en la linea 11 y la 12, se escribe el mismo registro, y es ahi donde esta el error, la linea 11 deberia ser SETUP_ADC...., ya que si no, nunca se configura correctamente el AD, al cambiar esa linea el proyecto funciona bien.
La bandera fTX, se setea en una interrupcion por cambio de RB0, ya que por ese pin esta recibiendo una trama PPM, y se transmite al finalizar la decodificacion.

Gracias nuevamente por la respuesta.

Saludos
Alejandro.
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: PalitroqueZ en 27 de Febrero de 2009, 18:16:33
si la función setup_adc te da problemas, entonces tendrás que configurar el adc de forma manual (configurando bits individuales en cada registro) y mirar muy detenidamente mediante un simulador.






Título: Re: Mis primeros pasos con el 18F4550
Publicado por: willie_rosario_salsa en 21 de Mayo de 2009, 18:35:35
Hola estimados amigos..

En realidad mil disculpas por mi ignorancia, quisiera saber la trama que maneja el USB del pic, ya que a mucho pude meterme en el bolsillo el 16F877 para comunicaciones serie, pero este PIC4550 tiene la opción de manejar datos USB..

Si alguien puede orientarme un poco para empezar a familiarizarme con este dispositivo, le agradeceré millón, ya que tengo que presentar una propuesta de mejoras en un sistema de comunicaciones para la empresa donde trabajo, y el GPS que deseo manejar solo comunica via USB..

De antemano gracias por su acostumbrada colaboración..
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: Suky en 21 de Mayo de 2009, 19:26:29
Aqui (http://picmania.garcia-cuervo.net/usb_0_desencadenado.php) esta el tema muy bien explicado.
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: willie_rosario_salsa en 22 de Mayo de 2009, 11:02:04
Gracias..
Ahora mismo lo reviso..
 :-) :-) :-)

Título: Mis primeros pasos con el 18F4550
Publicado por: rodrigo_control2009 en 19 de Junio de 2009, 14:51:08
CONSULTA
HE  HECHO ALGO CON EL 18F4550   CON EL PUERTO USB

HAN HABIDO OCASIONES EN QUE  NO HAY  NINGUN PROBLEMA  ENVIO Y RECIBO TRAMAS  DESDE VB

PERO  EN OTRAS OCASIONES SE PRESENTAS  DIFERENTES PROBLEMAS :

1º  AL MEDIR  EL  VOLTAJE DE  TX TR CON RESPECTO A TIERRA (NEGATIVOO) ME -0 V PERO EN CONDICIONES NORMALES ESTA ENTRE +1 A 2.5 V.   Y CUANDO HAY -0V  NO  HAY RECONOCIEMIENTO POR PARTE DEL PC Y TODO ESO EN LA PLACA  NO VEO MAYOR  PROBLEMA ...  HAS  SABIDO DE ALGO PARECIDO

2º ESTOY TRABAJANDO CON WIN VISTA  Y EL DRIVER Q PROPORCIONA MICROCHIP NO LO ACEPTA   PERO  SI  OTRO Q ESTA EN LA  CARPETA DE DRIVERS  DE  SYSTEM32

3º   GRABO EL PIC  CON MPLAB Y STARPLUS (O ALGO ASI)  PERO MODIFICO LAS FRASES Q APARECEN AL FIANL DE ARCH USB_DESC_CDC  Y EN EL PC SIEMPRE ME MUESTRA EL MISMO NOMBRE  DE DISPOSITIVO AUNQ LO CAMBIE EN CADA GRABACION DEL PIC ... HABRA PROBLEMAS EN EL  GRABADOR O EL SOFT DE MICROCHIPS  ?  PERO DESPUES DEHABILITO EL DRIVER EN EL PC  Y M LO RECONOCE  PERO  COMO DIJE ANTERIORMENETE  NO  ACEPTA EL DRIVER DE MICROCHIP ...

Título: Re: Mis primeros pasos con el 18F4550
Publicado por: Slalen en 22 de Junio de 2009, 04:05:41
Por favor, no escribas en mayúsculas resulta molesto

¿Qué valor de condensador has puesto en Vusb?
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: rodrigo_control2009 en 23 de Junio de 2009, 13:02:36
Disculpen por  mis mayúsculas. Gracias
si mal no recuerdo  es  de  470nF
Pero  el  problema era  en el  codigo del  usb_cdc.c   Donde  va el  numero que describe a los  18f  esribi 0xA0   y  deberia ser 0x0A hice el  cambio  y  todo  me ha  funcionado  bien   envio  tramas  desde   VB  y  me retornan  enseguida  la  misma trama  la  misma cantidad  de bit

Pero  sabes  algo  sobre las  interrupciones de  usb  #int_usb   creo q  usb_task ()   hace  algo  parecido
La  idea  es  usar  el rtos  de  CCS con usb,i2c y rs232  en un 18f4550 para atender  un  16f877a q  controla un teclado matricial 4*4 y lcd  4*20  tipo  HMI local  y  2  18f  sclavos  para  atender  entradas y salidas digitales  analogas   e rs232  es para  el envio  inalambrico  usando un modulo xbee.
si  tienes algo de inf  te lo  agradeceria .
Si  uso rl rtos   la recepcion y eco de las  tramas recibidas  las debria  usar en una  misma tarea o en distintas ??
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: ricardo_ipn en 31 de Agosto de 2009, 00:28:18
Hola, estoy tratando de hacer funcionar un potenciometro digital MCP41010 de interface SPI: DataSheet Completa (http://ww1.microchip.com/downloads/en/DeviceDoc/11195c.pdf)

Ese dispositivo recibe dos bytes, el primero es el comando y el segundo es el dato.

Formato de Comando:
(http://i857.photobucket.com/albums/ab140/ricardo_ipn/command_byte.jpg)

Como podrán observar estoy utilizando los comandos por hardware de la libreria  spi.h   del compilador C18 para MPLab, no use fuses ni pragmas por que eso lo hice con la opcion de bits de configuración de MPLab.

En el programa trato de hacer un barrido de todos los valores del potenciómetro, es decir, desde 0x00 hasta 0xFF.

Código: [Seleccionar]
#include<p18F4553.h>
#include<spi.h>
#include<delays.h>

void envio(unsigned char valor)
{
unsigned char comando;
comando=0x00010001;
OpenSPI(SPI_FOSC_4, MODE_11, SMPEND);
WriteSPI(comando);
WriteSPI(valor);
CloseSPI();
}

void main (void)
{
int i;
for(i=0;i<=255;i++)
{
envio(i);
Delay1KTCYx(45);
}
}

Creo que hay un problema con mis comandos referentes al módilo SPI, por que no logro hacer funcionar ni siquiera la simulacion.

Alguíen tiene alguna sugerencia para usar correctamente el módulo SPI del pic 18F4550

Gracias, saludos a todos.
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: Suky en 31 de Agosto de 2009, 01:19:23
No es necesario "abrir" y "cerrar" la comunicación SPI cada vez que lo utilizas, solo se configuraría al iniciarse:

Código: C
  1. #include<p18F4550.h>
  2. #include<spi.h>
  3. #include<delays.h>
  4.  
  5. void envio(unsigned char valor)
  6. {
  7.         WriteSPI(0x11);
  8.         WriteSPI(valor);
  9. }
  10.  
  11. void main (void)
  12. {
  13. int i;
  14.         OpenSPI(SPI_FOSC_4, MODE_11, SMPEND);
  15.  
  16.         for(i=0;i<=255;i++)
  17.         {
  18.                 envio(i);
  19.                 Delay1KTCYx(45);
  20.         }
  21. }

Además tenias mal cargado el valor de comando.

Saludos!
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: taskiller666 en 17 de Diciembre de 2009, 01:34:13
Hola, buena tu info, yo también estoy dando mis primeros gateos en este tema de los 18f.
Tengo una duda, es normal que las líneas de código apunten de 2 en 2?, es decir, con los 16f ves el PC (program counter) y va cambiando de uno en uno, pero en estos va cambiando de 2 en 2.

Esto me causa problemas al usar el RETLW ya que le quiero apuntar (por ejemplo) al valor 250 de la tabla y me señala el 125, hay como configurar eso?....Saludos y muy buen aporte
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: nachogb85 en 13 de Febrero de 2010, 09:28:52
Muchas gracias Pedro, este post me esta resultando tremendamente util, tanto para el manejo del PIC como para gestionarlo con Visual Basic gracias a tu ejemplo6parte2 estoy aprendiendo bastante.

Un saludo!
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: PalitroqueZ en 15 de Febrero de 2010, 14:34:34
gracias nacho.  :mrgreen:

Título: Re: Mis primeros pasos con el 18F4550
Publicado por: carlostex en 03 de Enero de 2011, 03:06:32
Buen post, quiero configurar el pic a 48 Mhz con un cristal de 4 Mhz en la entrada, estoy programando en asm, pongo las palabras de configuración para tener los 48 Mhz como aqui esta explicado y luego simulo en proteus, pero no veo que el cpu corra a esa velocidad, en la opción de CPU speed tengo 4 Mhz, entones, a que le hace caso proteus, a ese valor que tiene o al de las palabras de configuración, ahora no tengo tal pic pero como podría probar en el circuito real que el pic funciona a 48 Mhz.
Gracias
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: Suky en 03 de Enero de 2011, 10:15:23
Buen post, quiero configurar el pic a 48 Mhz con un cristal de 4 Mhz en la entrada, estoy programando en asm, pongo las palabras de configuración para tener los 48 Mhz como aqui esta explicado y luego simulo en proteus, pero no veo que el cpu corra a esa velocidad, en la opción de CPU speed tengo 4 Mhz, entones, a que le hace caso proteus, a ese valor que tiene o al de las palabras de configuración, ahora no tengo tal pic pero como podría probar en el circuito real que el pic funciona a 48 Mhz.
Gracias

Allí tienes que colocar 48MHz, aunque en las ultimas versiones parece que hay que colocar los MIPS a lo que trabaja el micro  :?
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: jhozate en 23 de Enero de 2011, 15:41:14
he estado trasteando con el usb cdc, y tambien quiero poner al pic a hacer otras cosas mientras no esta conectado al COM, ahora, mi pregunta es si es camisa de fuerza utilizar el USB_CON_SENSE_PIN, ya que segun lei usb_task() devuelve true asi este definido o no el pin de sensado.

Edit:  :-), listo, una confusion. ;-)
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: falflores en 23 de Enero de 2011, 21:12:23
Hola PalitroqueZ muy buen trabajo, yo estoy decidiendome por iniciar con los 18F, pero he leido por allí que se necesita otro software más para usar los 18F, el C18, pero veo que tu has programado como normalmente se programaría con el C16, hay alguna diferencia importante entre ambos?, por que no logro comprender poruqe la mayoria programa con el C18 si también se puede con el de toda la vida y accesar a todos los módulos, además que con el C18 cambian algunas instrucciones, como la configuración de fuses. Gracias.
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: Suky en 23 de Enero de 2011, 22:04:47
he estado trasteando con el usb cdc, y tambien quiero poner al pic a hacer otras cosas mientras no esta conectado al COM, ahora, mi pregunta es si es camisa de fuerza utilizar el USB_CON_SENSE_PIN, ya que segun lei usb_task() devuelve true asi este definido o no el pin de sensado.

Edit:  :-), listo, una confusion. ;-)

Por las dudas, no es necesario. Se puede forzar siempre a 1 y no utilizar ningún pin para sensar.

Hola PalitroqueZ muy buen trabajo, yo estoy decidiendome por iniciar con los 18F, pero he leido por allí que se necesita otro software más para usar los 18F, el C18, pero veo que tu has programado como normalmente se programaría con el C16, hay alguna diferencia importante entre ambos?, por que no logro comprender poruqe la mayoria programa con el C18 si también se puede con el de toda la vida y accesar a todos los módulos, además que con el C18 cambian algunas instrucciones, como la configuración de fuses. Gracias.

No tienes ningún problema, puedes programar en CCS sin ningún inconveniente. Es más, la mayoría utiliza éste por ser más sencillito  ;-)


Saludos!
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: jhozate en 26 de Enero de 2011, 20:49:47
como forzaria el sensado del pin? ..y de forzarlo, aunque la placa sea alimentada por fuente externa no tendria problema en la ejecucion del codigo al validar la conexion?
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: EINNER C en 17 de Marzo de 2011, 23:24:33
hola a todos

me parece excelente este post, todo lo que se necesita para aprender usb...

he visto los ejemplos de PalitroqueZ y son muy buenos, y hoy quiero plantearle una inquietud

mi problema es el siguiente, estoy realizando una comunicacion tipo cdc, con muestreo en lcd, pero si meto en el codigo algo que tenga que ver con la lcd no me sirve, si quito lo de la lcd funciona perfecto, no se uqe pasa, en proteus funciona bn, estoy utilizando cristal de 4 mhz y los fuses los configuro asi,,,

#fuses XTPLL,MCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL1,CPUDIV1,VREGEN,NOPBADEN

con solo lcd_init(); se me traba el pic, esto en montaje real, ni siquiera se conecta,,, comento lo que tiene que ver con lcd y de una aparece el com y realiza todo bn,,, ya llevo un dia y no he logrado encontrar el error,,,,

habia leido que para poder trabajar con el usb del pic y con otros modulos habia que usar usb_init_cs();, pero igual y no funciona,,, que sera...

aqui esta mi codigo,, lo que hace es que cuando no esta conectado con usb, funciona con bateria y hace el proceso, si esta a usb funciona de ahi y hace lo mismo pero con muestreo en pc,,,, todo eso lo hace bn,,, pero si escribo o inicio la lcd, ya no sirve,,,, yo habia realizado bastantes comunicaciones usb, pero que yo recuerde no tenia este problema,,,

#include <18F2550.h>
#DEVICE ADC=10
#fuses XTPLL,MCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL1,CPUDIV1,VREGEN,NOPBADEN
#use delay(clock=48000000)

#define use_portb_lcd TRUE

#include <lcd.c>
#include "usb_cdc.h"

float luxsd;
long  temper,luxs;
unsigned int temp,lux[2],recib,modo=0,hini=0,hini1=0,warning=0x0f;
signed int enc=0xff;

void usb_com()
     {
     if(usb_cdc_connected())
       {
        output_high(pin_c6);
        output_low(pin_c7);
        if (usb_enumerated())
           { warning=0;
           if(usb_cdc_kbhit())
             {
              recib=usb_cdc_getc();
              if(recib==0x31)
                {
                 usb_cdc_putc(temp);
                 usb_cdc_putc(lux[0]);
                 usb_cdc_putc(lux[1]);
                }
              if(recib==0x32)
                {
                 output_HIGH(pin_A3);
                 //lcd_putc("\fInt Luz");
                 //lcd_putc("\n Temp:    C lux");
                 enc=1;
                }
              if(recib==0x33)
                {
                 output_low(pin_A3);
                 lcd_putc("\f");
                 enc=0xff;
                }
              if(recib==0x34)
                {
                 usb_cdc_putc(0x0f);
                 usb_cdc_putc(0x0f);
                 usb_cdc_putc(0x0f);
                }
              if(recib==0x35)
                {
                 output_high(pin_c7);
                 output_low(pin_c6);
                }
              if(recib==0x36)
                {
                 /*lcd_putc("\f Inicio de Insp");
                 lcd_putc("\nen Base de Datos");
                 delay_ms(200);
                 lcd_putc("\fInt Luz");
                 lcd_putc("\n Temp:    C lux");*/
                }
              if(recib==0x37)
                {
                 /*lcd_putc("\f  Termino Insp");
                 lcd_putc("\nen Base de Datos");
                 delay_ms(2000);
                 lcd_putc("\fInt Luz");
                 lcd_putc("\n Temp:    C lux");*/
                }
              }
            }
          }
        }

void adquisicion()
     {
     set_adc_channel(0);
     delay_us(10);
     luxs = read_adc();
     delay_us(60);
     set_adc_channel(1);
     delay_us(10);
     temper = read_adc();
     delay_us(60);
     
     luxsd = (((0.00000000000006) * (luxs ^ 6)) - ((0.0000000002) * (luxs ^ 5)) + ((0.0000004) * (luxs ^ 4)) - ((0.0003) * (luxs ^ 3)) + ((0.119) * (luxs ^ 2)) - (26.409 * luxs) + 2632);
     temp= temper*0.48828125;
     
     lux[0]=make8(luxs,0);
     lux[1]=make8(luxs,1);
     /*
     if (temp>=100)
        {
         lcd_gotoxy(7,2);
         printf(lcd_putc,"%d",temp);
        }
       
     if (temp>=10)
        {
         lcd_gotoxy(7,2);
         printf(lcd_putc,"  %d ",temp);
        }
     else
        {
         lcd_gotoxy(7,2);
         printf(lcd_putc,"  %d  ",temp);
        }
     
        //if (luxs>=100000)
        // {lcd_gotoxy(9,1);
        //printf(lcd_putc,"%ld",luxs);}
       
     if (luxs>=10000)
        {
         lcd_gotoxy(9,1);
         printf(lcd_putc," %f",luxsd);
        }
       
     if (luxs>=1000)
        {
         lcd_gotoxy(9,1);
         printf(lcd_putc," %f ",luxsd);
        }
       
     if (luxs>=100)
        {
         lcd_gotoxy(9,1);
         printf(lcd_putc,"  %f ",luxsd);
        }
       
     if (luxs>=10)
        {
         lcd_gotoxy(9,1);
         printf(lcd_putc,"  %f  ",luxsd);
        }
     else
        {
         lcd_gotoxy(9,1);
         printf(lcd_putc,"   %f  ",luxsd);
         } */
      }

void main()
     {
      set_tris_a(0x03);
      setup_adc_ports(AN0_TO_AN1);
      setup_adc(ADC_CLOCK_INTERNAL );

      output_high(pin_c7);
      output_low(pin_c6);
      output_low(pin_A3);
     
       /*lcd_init();//inicializamos el USB
       lcd_putc("\fLuxometroDigital");
       lcd_putc("\n  Mesalud Ltda");*/
   
      while(true)
           {
            if (input(pin_c0) == 1)
               {

               if (input(pin_c1) == 1)
                  {
                  if(warning==0 && hini1==1)
                    {
                     usb_cdc_putc(0xff);
                     usb_cdc_putc(0x36);
                     usb_cdc_putc(0x36);
                     warning=1;
                     }
                   /*lcd_putc("\f Desconecte USB");
                   lcd_putc("\n  o La Bateria");*/
                   delay_ms(2000);
                   /*lcd_putc("\fEl Equipo Puede");
                   lcd_putc("\n  Sufrir Danos");*/
                   delay_ms(2000);
                   hini=0;
                   enc=0xff;
                  }
               else
                  {
                   warning=0;
                   if(hini==0)
                     {
                      //lcd_putc("\fLuxometroDigital");
                      //lcd_putc("\n  Mesalud Ltda");
                     }       
                   hini=1;
                   modo=0x0f;
                  }
               }
            else
               {
                modo=0xf0;
                warning=0;
                output_low(pin_a2);
                if(hini==0)
                  {
                   //lcd_putc("\fLuxometroDigital");
                   //lcd_putc("\n  Mesalud Ltda");
                  }           
                  hini=1;
                  if(hini1==0)
                     {
                      usb_cdc_init();
                      usb_init_cs();
                     hini1=1;

                     }
                  }
                 
             if (hini==1)
                {
                if(input(pin_c2))
                  {
                   delay_ms(200);
                   enc=enc*-1;
                   if(enc==1)
                     {
                      output_HIGH(pin_A3);
                      //lcd_putc("\fInt Luz");
                      //lcd_putc("\n Temp:    C lux");
                     
                      usb_cdc_putc(0xff);
                      usb_cdc_putc(0x32);
                      usb_cdc_putc(11);
                     
                      }
                   else
                      {output_LOW(pin_A3);
                     
                       usb_cdc_putc(0xff);
                       usb_cdc_putc(0x33);
                       usb_cdc_putc(11);
                     
                       //lcd_putc("\f");
                       }
                     }
                   }
   
            if(enc==1)
              {
               if (modo==0x0f)
                  {
                  output_high(pin_a2);
                   adquisicion();
                  }
                if(modo==0xf0)
                  {
                   usb_task();
                   adquisicion();
                   usb_com();
                  }
              }
            else
              {
              output_low(pin_a2);
               if(modo==0xf0)
                 {
                  usb_task();
                  usb_com();
                  }
               }
            }
       }


de antemano muchas gracias,,,, espero que me puedan colaborar...........
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: bmfranky en 18 de Marzo de 2011, 07:44:38
Hola EINNER C, aunque suene tonto, has revisado que las conexiones entre el lcd y el pic estén en los pines correctos, postea un esquema del conexionado,real, haber si tienes algo mal. Parece que hay un problema al inicializar el lcd, por eso se queda esperando respuesta del lcd y no avanza.
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: EINNER C en 18 de Marzo de 2011, 17:22:57
hola.. gracias por responder........ pues la verdad he mirado bn las conexiones y creo que estan bn,,, pero por lo que me dices podria ser que la lcd este danada, no la habia cambiado por que no tenia otra disponible, pero conseguire una y probare,,, gracias,,, luego de probar publicare mis resultados
Título: Re: Mis primeros pasos con el 18F4550
Publicado por: EINNER C en 18 de Marzo de 2011, 21:58:07
hola a todos,,,

gracias por su ayuda, problema solucionado, era la lcd, estaba danada, no habia podido probar con otra, pero ya que la consegui, la probe y funciona perfecto,,,
gracias,,,,