Control de dispositivos a través del módulo USB del PIC18F45/2550

Bueno, me gano de mano Jonathan :)

Les comento que logre hacer un encapsulado de todo lo que es HID en una clase de vb.net. Apenas me haga un tiempo la hago prolija y la subo.
 
Te dejo la aplicación para HID, luego les subo el manual dentro de unas semanas.

muchas gracias Jonathan, voy a bajarlo y ver que puedo hacer,,,

Bueno, me gano de mano Jonathan :)

Les comento que logre hacer un encapsulado de todo lo que es HID en una clase de vb.net. Apenas me haga un tiempo la hago prolija y la subo.

muy bueno, toda informacion es util, gracias por su ayuda

saludos...

hola de nuevo

tengo una duda acerca de la comunicacion serial con vb.net, hace un tiempo realize una aplicacion que subi en este post
https://www.forosdeelectronica.com/posts/467619/
y pues no tuve problemas,,,, utilize el evento datareceived, pero ya que tenia solo un form, cuando cerraba no sabia que existian problemas con el puerto, ahora que estoy realizando otra aplicacion me doy cuanta, el problema es el siguiente

tengo un aplicacion y tengo varios form, 7 en total, el de la comunicacion serial es llamdo del principal, y en el tengo un boton de desconectar en el que cierro el puerto, pero ay veces que al darle click, me genera un error y es que estaba recibiendo es decir activado el evento datareceived y se salio inesperadamente, por lo que me cierra toda la aplicacion, pensaba quitar el boton y que cerrara el puero cuando cerrara el form, pero tbn ocurre lo mismo y me lo cierra todo, la verda intente poner condiciones para entrar a recibir, y no lo logre siempre me sale ese error y la verdad no se como solucionarlo, ya que si cierro ese form, debe permanecer abierto el prinicipal para realizar otras tareas

les agradesco su ayuda,,,

saludos......
 
Última edición:
Tenes que gestionar la recepción de datos por interrupciones...por que sino habrá colisiones de datos y la aplicación colapsará... cerrándose.

La recepción de datos se tiene que realizar en el form principal....si necesitas visualizarlos en otro formulario...guarda los datos en una variable para luego mostrar los datos...
 
Última edición:
hola jonathan, gracias por responder

segun tengo entendido este evento(datareceived) actua como una interrupcion,aqui esta el codigo de recepcion,

Código:
#Region "Recepcion de Datos"
    'Al recibir los Datos
    Private Sub Recepcion(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
        'Acumula los datos recibidos en nuestro 'buffer' (integer)

        'If cerrar = 0 Then
        For i = 0 To cant
            recibidos(i) = SerialPort1.ReadByte
        Next
        'End If

        If recibidos(0) = &HFF Then
            If recibidos(1) = &H32 Then
                Me.BackgroundImage = System.Drawing.Image.FromFile("on_pant.jpg")
                band1 = 1
            End If
            If recibidos(1) = &H33 Then
                If CheckBox1.Checked = True Then
                    MsgBox("No Se Puede Apagar el Equipo, Se Esta Guardando la Base de Datos", MsgBoxStyle.Exclamation, "Base de Datos")
                    SerialPort1.Write(2)
                Else
                    Me.BackgroundImage = System.Drawing.Image.FromFile("off_pant.jpg")
                    band1 = 0
                End If
            End If
            If recibidos(1) = &H36 Then
                MsgBox("Desconecte USB o La Bateria, El Equipo Puede Sufrir Daños", MsgBoxStyle.Exclamation, "Error Posible Daño")
                Me.BackgroundImage = System.Drawing.Image.FromFile("off_pant.jpg")
                band1 = 0
            End If
            If recibidos(1) = &H37 Then
                esc = 1
                'escala.Text = "R 10000"
            End If
            If recibidos(1) = &H38 Then
                esc = 2
                'escala.Text = " R 1000"
            End If
            If recibidos(1) = &H39 Then
                esc = 3
                'escala.Text = " R 100"
            End If
            If recibidos(1) = &H40 Then
                esc = 4
                'escala.Text = " R 100"
            End If
        End If

    End Sub
#End Region

lo que aprecias comentado de if cerrar lo habia puesto para que cuando oprimiera el boton de deconectar, darle un valor para que la condicion no se cumpla, pero ni aasi,,,,

con estos datos realizo ciertas operaciones

a penas llega un dato lo recibe, no llamo dicha funcion en ningun lado, el automaticamente recibe, si estoy mal, me gustaria que me explicaraas,,,

por otro lado, no entiendo por que los datos se deben recibir desde el form principal, ya que todo lo relacionado al puerto serial lo realizo en el form al que llamo, alli abro el puerto recibo y realizo todo,...

por otro lado, vi el ejemplo de hid en vb y esta muy bn, estoy un poco apretado de tiempo pero voy a ponerme a trabajar con el, por el momento quiero aclarar mis dudas acerca del serial...

gracias

saludos...
 
Todos los eventos importantes los tenés que gestionar desde el form principal....luego cada formulario aparte vendrían siendo como funciones que llamas desde el main (formulario principal). Es para estructurar mejor la aplicación.

Por eso el evento "recepción de datos" lo tenes que gestionar desde el formulario principal.
 
Bueno, lo prometido es deuda

Aqui envio la clase HIDWrapper.vb junto con una pequeña solucion de ejemplo. Esta hecha en vb.net 2010 con framework 4 pero deberian poder adaptarla a cualquiera menor.

Lo unico que hace esta clase es tomar la comunicacion hid que nos proporciono el forista moyano johnatan y encapsularla para hacer aun mas simple su implementacion.

Ademas nos proporciona eventos de la comunicacion para hacer mas sencillo y limpio el programa.

Veran que tiene una declaracion del objeto que si o si debe hacerse con withevents y en el constructor del mismo le pasamos el vendor ID, product ID (que deben coincidir con lo definido en el programa del pic), tamaño de buffer de entrada y de salida.

Dichos buffers deben declararse del tamaño real, y no incrementar en 1 para agregar el message ID, ya que la clase se encarga de enviar siempre ese dato en 0.

Mi plotter ya esta funcionando con la misma. Bueno, que la disfruten, era para aportar un poquito.
 

Adjuntos

  • WindowsApplication1.rar
    479.5 KB · Visitas: 260
Gracias! posiblemente como decis sean las versiones pero, CREO que podrias usar solo la clase en un proyecto tuyo (copiando y pegando el codigo)

No estoy seguro pero no creo que cambie la referencia de las funciones entre distintos FW

Pregunta: ¿Te parece que facilita las cosas? (ese era mi objetivo)

AH! y les cuento algo que me paso que quiza le pase a alguno: Al llamar a alguna funcion de la libreria mcHID.dll me daba error siempre de que no podia levantar la DLL.

La misma hay que copiarla dentro de la carpeta BIN, en Debug y Release del proyecto. (O sea, donde esta el exe) o en su defecto, en la carpeta windows\system32
 
Última edición:
seaarg hola como estás.

SI, la función cumple con su cometido. Es más sencillo usar la librería. Otra mejora....FUNCIONA CON VB.NET 2010 (mejor para actualizarse).

Nuevamente, te felicito.
 
Hola comunidad, mi nombre es Christian, soy estudiante de ingenieria en México, este es el primer semestre que dedico de mi carrera a estudiar PIC's, me encuentro realizando una aplicación con un microcontrolador PIC 18F4550, es de la misma familia que el microcontrolador PIC 18F2550, en realidad es su hermanito mayor, el proposito del proyecto en general es realizar un control de temperatura con un registrador de datos, en realidad es cargar un control proporcional integrodiferencial al pic, conectar un lcd, y tener una conexion por usb para poder adquirir datos proporcionados por un sensor conectado al microcontrolador, el control proporcional integrodiferencial ya esta, el sensor es un termopar conectado a un compensador max 6655 este ultimo va directamente al puerto b de este micro conectado, el puerto d se utiliza para conectar un lcd en caso de que el dispositivo no tenga conexion usb y este trabajando de forma autonoma, esta parte tambien ya esta, la salida de potencia tambien ya esta solo necesito una salida pwm que tambien ya ha sido terminada, así que solo me falta la transmicion y recepcion de datos del PIC a la PC, en este caso una Laptop HP que ya no cuenta con puertos COM o RS232. Para lograr este objetivo me base sobre el reciente trabajo publicado por el gentil Jonathan Moyano llamado "Control de Dispositivos mediante puerto USB: Desarrollo de proyectos en Visual C#", he estado adecuando su codigo a mis necesidades, la parte del formulario en C# ya esta casi terminada, hasta el momento me reconoce la conexion y desconexion del dispositivo en este caso el PIC, para los que ya hayan tenido oportunidad de leer el trabajo, me refiero especificamente a la parte del boton "Conectar dispositivo", del lado del pic, les comento el control y el lcd ya trabajan perfectamente, pero al momento de declarar las variables Envia y Recibe, con el codigo del amable Jonathan el compilador CCS me marca un error, por lo tanto no existe comunicacion entre PIC y PC, aunque los dos por separado ya esten trabajando optimamente. Espero que puedan revisar mi codigo y puedan ayudarme. Este proyecto terminado me comprometo a subirlo con licencia freeware para poder seguir desarrollando nuevas aplicaciones. Muchisimas gracias por su atención y ayuda.
 

Adjuntos

  • Proyecto temperatura.rar
    1 MB · Visitas: 237
hola seaarg

quiero agradecerte el aporte del hid, ya que esta excelente lo de las funciones. debido a ello y a que no pude solucionar el problema que les habia mencionada anteriormente en vb.net con el serial y pic cdc, me he pasado a hid, el codigo en pic ya lo realize, me reconoce bn el dispositivo, cambie mi interfaz en visual a hid, con ayuda de tu clase, pero pues la verdad del pc al pic, envio bn, pero del pic al pc, no llega nada, nunca entra al evento oHID_onRead, y pues la verdad no se que error este cometiendo,,,

esta es la parte de envio en el pic

outbuffer[0]=0x0f;
outbuffer[1]=0x0f;
outbuffer[2]=0x0f;
usb_put_packet(1, outbuffer, 3, USB_DTS_TOGGLE);

habiendo definido en el pic

#DEFINE USB_HID_DEVICE TRUE //Tells the CCS PIC USB firmware to include HID handling code.
#define USB_EP1_TX_ENABLE USB_ENABLE_INTERRUPT //turn on EP1 for IN bulk/interrupt transfers
#define USB_EP1_TX_SIZE 3 //Numero de byte de envio (maximo 64 bytes)
#define USB_EP1_RX_ENABLE USB_ENABLE_INTERRUPT //turn on EP1 for OUT bulk/interrupt transfers
#define USB_EP1_RX_SIZE 1 //Numero de byte de Recepcion (maximo 64 bytes)

y en vb

oHID = New HIDWrapper(Me, &H4D8, &HA, 1, 3)

pues la verdad no tengo idea que sea, les agradeceria su ayuda..

nota: tengo visual basic 2008, no se si sea debido a eso, que opinan

gracias,,, saludos
 
hola seaarg
esta es la parte de envio en el pic

outbuffer[0]=0x0f;
outbuffer[1]=0x0f;
outbuffer[2]=0x0f;
usb_put_packet(1, outbuffer, 3, USB_DTS_TOGGLE);

habiendo definido en el pic

#DEFINE USB_HID_DEVICE TRUE //Tells the CCS PIC USB firmware to include HID handling code.
#define USB_EP1_TX_ENABLE USB_ENABLE_INTERRUPT //turn on EP1 for IN bulk/interrupt transfers
#define USB_EP1_TX_SIZE 3 //Numero de byte de envio (maximo 64 bytes)
#define USB_EP1_RX_ENABLE USB_ENABLE_INTERRUPT //turn on EP1 for OUT bulk/interrupt transfers
#define USB_EP1_RX_SIZE 1 //Numero de byte de Recepcion (maximo 64 bytes)

y en vb
oHID = New HIDWrapper(Me, &H4D8, &HA, 1, 3)

Bueno, te podria decir un par de lugares donde buscar.

Lo importante es que parece que definiste bien los tamaños de buffer

1)- Verificaste que el VendorID y el ProductID correspondan exactamente a los mismos que declaras en ccs?
2)- Definiste el objeto oHID con eventos (withevents), proba poner un msgbox en el evento onplugged a ver si detecta la conexion.
3)- para que el programa del pic envie datos se requiere alguna condicion especial que quiza no se este cumpliendo?

Tambien, depende de donde en tu programa vb.net creas el objeto oHID, deberias tener conectado el pic antes de ejecutar el programa. Para simplificar, ese objeto se intenta conectar al pic en el momento de su creacion.

Ej.: En mi caso lo instancio en el form_load. Esto hace que se necesite tener el pic primero conectado. En otros ejemplos de moyano, el tenia un boton "Conectar" para poder conectarse despues.

Revisa eso y comentanos. Podrias enviar el programa completo de vb.net? (la parte de comunicacion claro)

PD: No creo que tenga mucho que ver la version de .net, ya que en realidad lo que usa es la libreria mcHID.dll
 
fycykys tu problema ya está solucionado , gracias por postear el proyecto..esperamos los avances.

EINNER C como estás, hay que ver bien como trabajan las funciones de control del USB en CCS...cambian ligeramente según las versiones....cuidado con eso.

Con respecto a la aplicación si te envía bien datos...las constantes VID y PID están bien definidas

Tendrías que ver si el PIC está enviando los datos correctamente.


seaarg Puede ser que los problemas de compilación tengan más que ver con el .Net framework de visual Studio 2010 ? Fijate si tenés tiempo de compilar tu programa con .net framework 3.5 a ver si te presenta algún error.

Les mando un saludo !
 
Por lo pronto, puedo decirles que me comentaron que hay que compilar con arquitectura x86, no anyCPU.

Voy a bajar el fw 3.5 a ver que pasa si lo compilo con ese. Pero insisto, por intuicion, de que si copian el codigo y lo pegan directamente en la aplicacion que tienen en 3.5 deberia andar porque el lenguaje en si no creo que cambie mucho, y no usamos herramientas de framework en si. Creo.
 
Bueno, te podria decir un par de lugares donde buscar.

Lo importante es que parece que definiste bien los tamaños de buffer

1)- Verificaste que el VendorID y el ProductID correspondan exactamente a los mismos que declaras en ccs?
2)- Definiste el objeto oHID con eventos (withevents), proba poner un msgbox en el evento onplugged a ver si detecta la conexion.
3)- para que el programa del pic envie datos se requiere alguna condicion especial que quiza no se este cumpliendo?

Tambien, depende de donde en tu programa vb.net creas el objeto oHID, deberias tener conectado el pic antes de ejecutar el programa. Para simplificar, ese objeto se intenta conectar al pic en el momento de su creacion.

Ej.: En mi caso lo instancio en el form_load. Esto hace que se necesite tener el pic primero conectado. En otros ejemplos de moyano, el tenia un boton "Conectar" para poder conectarse despues.

Revisa eso y comentanos. Podrias enviar el programa completo de vb.net? (la parte de comunicacion claro)

PD: No creo que tenga mucho que ver la version de .net, ya que en realidad lo que usa es la libreria mcHID.dll


hola

realizando lo que me dices estos son los resultados

1) si coinciden el vendor id y product id
2)el evento onplugged si se activa, ya que puse que un label dijera conectado y se viera un cuadro verde.
3)en el pic, cargue el .cof e hize el seguimiento y si llega a la instruccion de envio

por lo anterior creo que eso esta bn

lo que paso a creer es que como dices, yo cree el objeto oHid en el form load, y por eso es que cuando ejecutaba la aplicacion cuando ya estaba corriendo el proteus, me enviaba bn, si corria primero el vb, no servia, ..

el codigo en vb es el siguiente

Código:
Imports System.IO.Ports
Imports System.IO

Public Class Form4

    Dim WithEvents oHID As HIDWrapper

#Region "Variables"
    Dim recibidos As Integer() = New Integer(3) {}
    Dim values As Double = 0
    'Dim band As Integer = 0
    Dim band1 As Integer = 0
    'Dim conection As Integer = 0
    Dim conect As Integer = 0
    Dim Bd As Integer = 0
    Public fic As String
    Dim rut1 As String
    Dim name1 As String
    Dim resul As Integer = 5
    Dim cant As Integer = 2
    Dim valueslux As Double
    'Dim cerrar As Integer = 0
    Dim esc As Integer = 1
    Dim outBuffer(0) As Byte

    Dim PORTS As String() = IO.Ports.SerialPort.GetPortNames()
#End Region

    Private Sub Form4_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        oHID = New HIDWrapper(Me, &H4D8, &HA, 1, 3)
    End Sub

#Region "Recepcion de Datos"
    'Al recibir los Datos

    Private Sub oHID_onRead(ByVal readedBytes() As Byte) Handles oHID.onRead

        Dim i As Integer

        For i = 0 To UBound(readedBytes)
            recibidos(i) = readedBytes(i)
        Next

        If recibidos(0) = &HFF Then
            If recibidos(1) = &H32 Then
                Me.BackgroundImage = System.Drawing.Image.FromFile("on_pant.jpg")
                band1 = 1
            End If
            If recibidos(1) = &H33 Then
                If CheckBox1.Checked = True Then
                    MsgBox("No Se Puede Apagar el Equipo, Se Esta Guardando la Base de Datos", MsgBoxStyle.Exclamation, "Base de Datos")
                    outBuffer(0) = &H32
                    oHID.writeBuffer(outBuffer)
                Else
                    Me.BackgroundImage = System.Drawing.Image.FromFile("off_pant.jpg")
                    band1 = 0
                End If
            End If
            If recibidos(1) = &H36 Then
                MsgBox("Desconecte USB o La Bateria, El Equipo Puede Sufrir Daños", MsgBoxStyle.Exclamation, "Error Posible Daño")
                Me.BackgroundImage = System.Drawing.Image.FromFile("off_pant.jpg")
                band1 = 0
            End If
            If recibidos(1) = &H37 Then
                esc = 1
                'escala.Text = "R 10000"
            End If
            If recibidos(1) = &H38 Then
                esc = 2
                'escala.Text = " R 1000"
            End If
            If recibidos(1) = &H39 Then
                esc = 3
                'escala.Text = " R 100"
            End If
            If recibidos(1) = &H40 Then
                esc = 4
                'escala.Text = " R 100"
            End If
        End If

    End Sub
#End Region

#Region "Proceso de Inspeccion"
    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick

        '      If band = 1 Then

        '     If band1 = 1 Then

        If esc = 1 Then
            escala.Text = "R 10000"
            lxlb.Text = "lux"
            FRG.Text = ""
        End If
        If esc = 2 Then
            escala.Text = " R 1000"
            lxlb.Text = "lux"
            FRG.Text = ""
        End If
        If esc = 3 Then
            escala.Text = " R 100"
            lxlb.Text = "lux"
            FRG.Text = ""
        End If

        outBuffer(0) = &H31
        oHID.writeBuffer(outBuffer)
        System.Threading.Thread.Sleep(50)

        If recibidos(0) = &HFF Then
        Else
            temp.Text = " Temp: " & recibidos(0) & " °C"
            values = (recibidos(2) * &H100) + recibidos(1)

            If esc = 1 Then
                valueslux = (10.163 * values) + 10
                values = Int(valueslux)
            End If
            If esc = 2 Then
                valueslux = (1.0071 * values) + 10
                values = Int(valueslux)
            End If
            If esc = 3 Then
                valueslux = (0.0916 * values) + 10
                values = Int(valueslux)
            End If
        End If

        If esc = 1 Or esc = 2 Or esc = 3 Then
            If values < 10 Then
                lux.Text = "   " & values
            ElseIf values < 100 Then
                lux.Text = "  " & values
            ElseIf values < 1000 Then
                lux.Text = "  " & values
            ElseIf values < 10000 Then
                lux.Text = " " & values
            ElseIf values < 100000 Then
                lux.Text = values
            ElseIf values < 200000 Then
                lux.Text = values
            End If
        Else
            lxlb.Text = ""
            lux.Text = ""
            FRG.Text = "FUERA DE RANGO"
        End If

        '    End If

        '   End If

    End Sub
#End Region

#Region "Boton On/Off"
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        If conect = 1 Then

            If band1 = 0 Then
                outBuffer(0) = &H32
                oHID.writeBuffer(outBuffer)
                Me.BackgroundImage = System.Drawing.Image.FromFile("on_pant.jpg")
                Timer1.Enabled = True
                band1 = 1
                lxlb.Text = "lux"
                If esc = 1 Then
                    escala.Text = "R 10000"
                End If
                If esc = 2 Then
                    escala.Text = " R 1000"
                End If
                If esc = 3 Then
                    escala.Text = " R 100"
                End If
            Else
                If CheckBox1.Checked = True Then
                    Beep()
                    Beep()
                    MsgBox("No Se Puede Apagar el Equipo, Se Esta Guardando la Base de Datos", MsgBoxStyle.Exclamation, "Base de Datos")
                Else
                    outBuffer(0) = &H33
                    oHID.writeBuffer(outBuffer)
                    Me.BackgroundImage = System.Drawing.Image.FromFile("off_pant.jpg")
                    band1 = 0
                    Timer1.Enabled = False
                    escala.Text = ""
                    temp.Text = " Temp: -- °C"
                    lxlb.Text = ""
                    lux.Text = "     --"
                    FRG.Text = ""
                End If

            End If
        End If
    End Sub
#End Region

#Region "Reloj"
    Private Sub Timer2_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer2.Tick
        StatusStrip1.Items(0).Text = DateTime.Now.ToLongTimeString()
    End Sub
#End Region

#Region "Opacidad"
    Private Sub NormalToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles NormalToolStripMenuItem.Click
        Opacity = 1
    End Sub

    Private Sub ToolStripMenuItem3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripMenuItem3.Click
        Opacity = 0.75
    End Sub

    Private Sub ToolStripMenuItem4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripMenuItem4.Click
        Opacity = 0.5
    End Sub

    Private Sub ToolStripMenuItem5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripMenuItem5.Click
        Opacity = 0.25
    End Sub

    Private Sub ToolStripMenuItem6_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripMenuItem6.Click
        Opacity = 0.05
    End Sub
#End Region

#Region "Dispositivio Conectado"

    Private Sub oHID_onPlugged() Handles oHID.onPlugged

        ON_USB.Text = "CONECTADO"
        USB.BackColor = Color.Green
        'band = 1
        conect = 1
        cant = 2
        'cerrar = 0

    End Sub
#End Region

#Region "Dispositivio Desconectado"

    Private Sub oHID_onUnplugged() Handles oHID.onUnplugged

        CheckBox1.Checked = False
        If band1 = 1 Then
            MsgBox("Se Recomienda Apagar el Equipo Antes de Desconectarlo, De lo Contrario El Equipo podra sufrir Danos", MsgBoxStyle.Exclamation, "Desconexion")
        End If
        band1 = 0
        conect = 0
        ON_USB.Text = "DESCONECTADO"
        USB.BackColor = Color.Red
        Me.BackgroundImage = System.Drawing.Image.FromFile("off_pant.jpg")
    End Sub

#End Region

#Region "Base de Datos"
    Private Sub CheckBox1_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBox1.CheckedChanged

        If CheckBox1.Checked = True Then
            If band1 = 1 Then

                Dim rut As String = System.AppDomain.CurrentDomain.BaseDirectory()

                outBuffer(0) = &H36
                oHID.writeBuffer(outBuffer)
                MsgBox("Inicio de Inspeccion en Base de Datos", MsgBoxStyle.OkOnly, "Base de Datos")


                With SaveFileDialog1

                    .Title = "Guardar Base de Datos"
                    .Filter = "Archivos txt|*.txt"
                    .OverwritePrompt = True

                    If .ShowDialog = Windows.Forms.DialogResult.OK Then
                        Me.RichTextBox1.SaveFile(.FileName)
                    End If

                End With

                Dim resul As String = InputBox("Digite Por Favor El Tiempo Entre Muestras (min), si Descarta Este Mensaje, El Valor Sera de 5 min", "Tiempo de Muestreo")

                If resul = "" Then
                    resul = 5
                End If

                Timer3.Interval = resul * 1000

                name1 = System.IO.Path.GetFileName(SaveFileDialog1.FileName)

                rut1 = System.Environment.CurrentDirectory()
                System.Environment.CurrentDirectory = rut

                'Const fic As String 
                fic = rut1 & "\" & name1
                'Dim texto As String = "Pablito tenía una moto con un pito."

                Dim sw As New System.IO.StreamWriter(fic, True)
                sw.WriteLine("Inspeccion de Luminarias, Muestreo Cada " & resul & " min")
                sw.WriteLine(" ")
                sw.WriteLine("Hora de Inicio: " & DateTime.Now.ToLongTimeString())
                sw.WriteLine(" ")
                sw.WriteLine(" ")
                sw.Close()
                Timer3.Enabled = True


            Else
                CheckBox1.Checked = False
                MsgBox("El Equipo esta Apagado", MsgBoxStyle.Exclamation, "Base de Datos")
            End If
        Else
            If band1 = 1 Then
                outBuffer(0) = &H37
                oHID.writeBuffer(outBuffer)
                MsgBox("Terminacion De Inspeccion en Base de Datos", MsgBoxStyle.OkOnly, "Base de Datos")
                'Const fic As String 
                fic = rut1 & "\" & name1
                Dim sw As New System.IO.StreamWriter(fic, True)
                sw.WriteLine(" ")
                sw.WriteLine("Hora de Terminacion: " & DateTime.Now.ToLongTimeString())
                sw.WriteLine(" ")
                sw.Close()
                Timer3.Enabled = False
            End If
        End If

    End Sub
#End Region

#Region "Base de Tiempo Para Muestreo"
    Private Sub Timer3_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer3.Tick
        Bd = Bd + 1

        'Const fic As String
        fic = rut1 & "\" & name1
        'Dim texto As String = "Pablito tenía una moto con un pito."

        Dim sw As New System.IO.StreamWriter(fic, True)

        sw.WriteLine("Muestra #" & Bd & ", Hora de Evento: " & DateTime.Now.ToLongTimeString())
        sw.WriteLine(" ")
        sw.WriteLine("Temperatura: " & recibidos(0) & "ºC  Intensidad Luminica por Metro Cuadrado: " & values & " lux")
        sw.WriteLine(" ")
        sw.Close()
    End Sub
#End Region

#Region "Al Salir"
    Private Sub Form4_FormClosing(ByVal sender As System.Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles MyBase.FormClosing
        Timer1.Enabled = False
        cant = 0
        outBuffer(0) = &H35
        oHID.writeBuffer(outBuffer)
    End Sub
#End Region

#Region "Abrir Archivo de Base de Datos"
    Private Sub AbrirToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles AbrirToolStripMenuItem.Click

        Dim myStream As Stream = Nothing
        Dim openFileDialog1 As New OpenFileDialog()

        openFileDialog1.Filter = "Archivos txt (*.txt)|*.txt"
        openFileDialog1.FilterIndex = 1
        openFileDialog1.RestoreDirectory = True

        If openFileDialog1.ShowDialog() = System.Windows.Forms.DialogResult.OK Then
            Try
                myStream = openFileDialog1.OpenFile()
                If (myStream IsNot Nothing) Then
                    Process.Start(openFileDialog1.FileName)
                End If
            Catch Ex As Exception
                MessageBox.Show("No se pudo leer el archivo: Se genero un Error " & Ex.Message)
            Finally
                If (myStream IsNot Nothing) Then
                    myStream.Close()
                End If
            End Try
        End If

    End Sub
#End Region

End Class

voy a probar ubicando un boton de conectar y ver que pasa, luego les comento

por otro lado, veo que la aplicacion se me bloquea muy facil, imagino que sea por estar corriendo vb y proteus al tiempo,, ustedes que piensan...

gracias por su colaboracion,,,

hola de nuevo

ya agregue el boton y funciona bn, no he probado desconectar el pic y volverlo a conectar sin cerrar la aplicacion haber si funciona, ya que tengo unos problemas con el proteus, pero hoy en la tarde lo monto en real y veo el funcionamiento,,,


espero subir la aplicacion completa cuando la termine de forma satisfactoria, este foro me ha colaborado bastante y espero tbn poder aportar, asi que en lo que les pueda colaborar con gusto...

gracias
 
Última edición:
Bueno, me alegro que te haya funcionado.

En mi experiencia es medio jodido correr proteus al mismo tiempo que la aplicacion y que ande todo bien (no probe lo mismo con hid, eso ya lo hice en real)

Por otro lado, lo que se podria hacer es que la linea:

oHID = New HIDWrapper(Me, &H4D8, &HA, 1, 3)

se haga en el momento de enviar datos de esta forma:

if IsNothing(oHid) then
oHID = New HIDWrapper(Me, &H4D8, &HA, 1, 3)
end if

De esta manera, se intentara conectar por unica vez solo al momento de enviar datos.

Ademas, estaria bueno saber si el parametro que retorna la llamada a API para conectar (un boolean) devuelve true o false si se conecto correctamente o no, para manejar esa respuesta en el codigo que mencione antes.

Asi podriamos hacer la cosa un poco mas "hot-plugged"
 
AYUDA: TENGO UNA DUDA

Estoy usando un cristal de 20MHz, resulta q para usar el USB tengo q hacer unos ajustes y cambiar el PLL resulta q al modificar el PLL queda trabajando a 48MHz internamente!!

Mi pregunta es: a la hora de configurar los timer uso 20MHz o 48MHz??

Este es el encabezado de mi programa:

#include <18F4550.h>
#fuses HSPLL,NOMCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN,NOPBADEN
#use delay(clock=48000000)
 
Atrás
Arriba