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

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

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5490
    • Electrónica Didacta
Re: Mis primeros pasos con el 18F4550
« Respuesta #45 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

Manual de Formación de USB  cursousb.pdf

Universal Serial Bus Specification 2.0 usb_20.pdf

INGENIERIA EN MICROCONTROLADORES - Protocolo USB usb.pdf

unpaseoporusb-2.pdf


Osciloscopio USB. Documentación autores: Pablo Hoffman y Martín Szmulewicz

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

Osciloscopio USB abierto

Protocolo USB aplicado a placas con microcontroladores

Salu2
Pedro
« Última modificación: 17 de Febrero de 2007, 16:03:43 por PalitroqueZ »
La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5490
    • Electrónica Didacta
Re: Mis primeros pasos con el 18F4550
« Respuesta #46 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(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 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


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




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
- RE: Proyecto PicUSB
- Traducción de mpusbapi.doc

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










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

el adjunto con el programilla


continuará...


PD: ¿que está pasando con imageshacks.us?  :?
La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5490
    • Electrónica Didacta
Re: Mis primeros pasos con el 18F4550
« Respuesta #47 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:



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



a ver que tenemos allí





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




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





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)




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:




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:






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)

- API-Guide

- MSDN Library Visual Studio 6.0

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

Desconectado Slalen

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1079
    • Página web personal de Guillermo Herrero González
Re: Mis primeros pasos con el 18F4550
« Respuesta #48 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

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

Un saludo!!!! :-/

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5490
    • Electrónica Didacta
Re: Mis primeros pasos con el 18F4550
« Respuesta #49 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
La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado FJPPitta

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 116
    • Mi pagina personal
Re: Mis primeros pasos con el 18F4550
« Respuesta #50 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

Que la fuerza te acompañe

Desconectado Slalen

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1079
    • Página web personal de Guillermo Herrero González
Re: Mis primeros pasos con el 18F4550
« Respuesta #51 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!!!!

Desconectado Slalen

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1079
    • Página web personal de Guillermo Herrero González
Re: Mis primeros pasos con el 18F4550
« Respuesta #52 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
« Última modificación: 26 de Febrero de 2007, 09:56:31 por Slalen »

Desconectado Slalen

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1079
    • Página web personal de Guillermo Herrero González
Re: Mis primeros pasos con el 18F4550
« Respuesta #53 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

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5490
    • Electrónica Didacta
Re: Mis primeros pasos con el 18F4550
« Respuesta #54 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í 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

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 de costumbre.

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

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5490
    • Electrónica Didacta
Re: Mis primeros pasos con el 18F4550
« Respuesta #55 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

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 con el programa.

Salu2
Pedro
« Última modificación: 08 de Marzo de 2007, 11:14:51 por PalitroqueZ »
La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado Slalen

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1079
    • Página web personal de Guillermo Herrero González
Re: Mis primeros pasos con el 18F4550
« Respuesta #56 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!!!!

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5490
    • Electrónica Didacta
Re: Mis primeros pasos con el 18F4550
« Respuesta #57 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 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:




Video

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
« Última modificación: 30 de Octubre de 2007, 19:00:56 por PalitroqueZ »
La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado Slalen

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1079
    • Página web personal de Guillermo Herrero González
Re: Mis primeros pasos con el 18F4550
« Respuesta #58 en: 14 de Marzo de 2007, 10:40:29 »
Nuevos avances:
He colgado aqui 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!!!

Desconectado Slalen

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1079
    • Página web personal de Guillermo Herrero González
Re: Mis primeros pasos con el 18F4550
« Respuesta #59 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!!