Autor Tema: OSCILOSCOPIO USB  (Leído 6619 veces)

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

Desconectado kriskmilo

  • PIC10
  • *
  • Mensajes: 6
OSCILOSCOPIO USB
« en: 02 de Enero de 2009, 13:23:02 »
 :)
HOLA!!!, creo este tema por que necesito un poco de asesoria, realize un codigo para visualizar una señal a 19200 baudios proveniente de el puerto serial y funciona en parte, sin embargo me sale un errorcito que no se a que se deba los datos llegan en ascii, agradezco de antemano cualquier ayuda, en cuanto al circuito es un conversor analogo digital que toma los datos y los envia en ascii de modo serial al computador por usb. la parte referente a excel muestra como estoy intentando exportar y almacenar los datos en un xls.

en realidad no recuerdo la velocidad maxima de 232 pero este codigo creo que funciona igual para transmision rs 232 a 19200 baudios, si no me equivoco el 232 llega hasta 115200 baudios

el codigo funciona, muestra los datos tomados del puerto hasta cierto punto y entonces aparece el errorcito

se crea el archivo en excel exitosamente pero solo logra enviar uno de los datos

 

 

Option Explicit

Dim ejex As Integer

Dim ejey As Integer

Dim acum As Double

Dim x As Integer

Dim y As Integer

Dim dato As Integer

Dim i As Integer

Dim a As Integer

Dim Buffer As String

Dim Bufferfinal As String

 

 

Private Sub Command1_Click()

'MSComm1.setting="19200,N,8,1"

'MSComm1.CommPort = 6 ' selecciona el Com1

'MSComm1.InputLen=0 ' pone buffer a cero (opcional)

'MSComm1.PortOpen = True

'MSComm1.Output = "Texto a enviar"

'MSComm1.PortOpen = False ' para cerrar

'Text1.Text = MSComm1.Input

'c = Asc(g)

'---------------------- en ascii

'g = MSComm1.Input

'Text1.Text = g

'--------------------

Buffer = MSComm1.Input

For i = 1 To Len(Buffer)

Bufferfinal = Bufferfinal & Format(Asc(Mid(Buffer, i, 1)), "00") & " "

Next

'Bufferfinal = Bufferfinal & Format(Asc(Buffer), "00") & " "' SELECCIONO PARA UNO A UNO

Text1.Text = Bufferfinal

'------------------------------

'Private Function a2d(ByVal asci As String) As Integer

'a2d = Asc(asci)

'End Function

'USO DE FUNCIONES O RUTINAS

'-------------------------

'Private Sub Command2_Click()

'Textbox2.Text = a2d(Textbox1.Text)

'End Sub

'-------------------------

End Sub

Private Sub Command3_Click()

'esto te guarda el grafico en el directorio que quieras

SavePicture Picture1.Image, "C:grafico.jpeg" 'le puse .bmp porque asi me dijiste

'pero puede ser tambien .jpeg

End Sub

--------------------------------PARTE EXCEL SI DESEAN OMITANLA DEBO MODIFICARLA AUN----------------------------

Private Sub Command4_Click()

   Dim oExcel As Object

   Dim oBook As Object

   Dim oSheet As Object

   'Start a new workbook in Excel

   Set oExcel = CreateObject("Excel.Application")

   Set oBook = oExcel.Workbooks.Add   'Este codigo lo modifique tratando de que salgan los datos en una columna

   Dim DataArray(1 To 100) As Variant

   Dim r, k As Integer   

      Buffer = MSComm1.Input     

      For k = 1 To Len(Buffer)     

      Bufferfinal = Asc(Buffer)     

      Next         'Add headers to the worksheet on row 1

   Set oSheet = oBook.Worksheets(1)

   oSheet.Range("A1:C1").Value = Array("Order ID")   'Transfer the array to the worksheet starting at cell A2

   oSheet.Range("A2").Resize(100, 3).Value = DataArray

   'Save the Workbook and Quit Excel

   oBook.SaveAs "C:Book1.xls"

   oExcel.Quit

End Sub

 

Private Sub Form_Load()

MSComm1.InputLen = 1

'MSComm1.InputMode = comInputModeText

MSComm1.PortOpen = True

'MSComm.Output = hex2ascii

'Buffer = MSComm.Input

End Sub

 

'--------------------------PARTE DE GRAFICACION TENGO UN ERRORCITO QUE NO SE QUE ES...

Private Sub Command2_Click()

ejex = 0

ejey = Picture1.Height 'inicializo los puntos del grafico

otro:

'--------------------------------------------------

'For acum = 0 To 100 Step 0.15 'aqui genero la onda, en tu caso aqui seria

'DoEvents 'leer los datos del puerto serial y guardarlos

'dato = Sin(acum) * 10 'en dato, a veces es necesario multiplicarlos para

'---------------funciona----------------------

Buffer = MSComm1.Input

dato = Asc(Buffer) / 5 ' SELECCIONO PARA UNO A UNO

'---------------------funciona-----------------

Call dibujar

For i = 0 To (100) Step 1 'este es un retraso que se le pone para que el

For a = 0 To (10) Step 1 'usuario pueda apreciar la onda

Next a                        'si se le quita la onda se dibuja muy rapido

Next i                       'Next acum

GoTo otro

End Sub

Public Sub dibujar()

x = ejex + (10) 'defino el valor de x que son los datos del eje x, ejex

'es el dato anterior inicialmente cero ese 10 es para que se aprecie mejor la señal

y = ((Picture1.Height / 2) - ((dato) * 20)) 'tomo el valor del alto del cuadro '

'entre dos y se le resta el valor que me va dando el valor de la función

'este valor lo multiplico por 20 para que se vea la gráfica

Picture1.Line ((ejex * 3), ejey)-((x * 3), y) 'dibujo una linea con los valores anteriores

ejex = x

ejey = y

If ejex > Picture1.Width Then 'si el valor de ejex es mayor que el ancho del cuadro

ejex = 0 'que ponga a ejex a cero

Picture1.Cls 'y que borre pantalla.

'esta parte la hago para que cuando llegue al final del cuadro inicie de nuevo

'del lado izquierdo del cuadro.

End If

End Sub

 
Muchos exitos!!!, Universidad Distrital Presente

Desconectado PalitroqueZ

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
Re: OSCILOSCOPIO USB
« Respuesta #1 en: 08 de Enero de 2009, 15:22:10 »
unas humildes sugerencias de mi parte es que trates de hacer funcionar las cosas por separado, para evaluar y corregir los errores eventuales. Por ejemplo, podrias hacer unicamente la parte de graficas, simulando el envío de datos hasta que logres hacerlo funcionar a conveniencia.

en cuanto a la transmisión sería mejor (desde mi punto de vista) que usaras el evento on_comm y manejar las transmisiones por "interrupcion", asi tienes mayor control sobre los datos.

en cuanto a las velocidad de transmisión, tienes que checar en las estructuras del código fuente del pic, que efectivamente se encuentre configurado al baudaje que quieres.

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

Desconectado kriskmilo

  • PIC10
  • *
  • Mensajes: 6
Re: OSCILOSCOPIO USB
« Respuesta #2 en: 18 de Enero de 2009, 23:30:17 »
Mil gracias palitroquez, de casualidad tienes un ejemplo de como manejar el evento On comm, Una pregunta ¿con este evento tambien debo convertir los datos de ASCII a decimal?
Muchos exitos!!!, Universidad Distrital Presente

Desconectado PalitroqueZ

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
Re: OSCILOSCOPIO USB
« Respuesta #3 en: 19 de Enero de 2009, 16:22:20 »
mira un ejemplo en este enlace:

http://www.todopic.com.ar/foros/index.php?topic=15208.msg98489#msg98489


...¿con este evento tambien debo convertir los datos de ASCII a decimal?

depende de como envies los datos al pc, generalmente se usan caracteres ascii

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

Desconectado kriskmilo

  • PIC10
  • *
  • Mensajes: 6
Re: OSCILOSCOPIO USB
« Respuesta #4 en: 21 de Enero de 2009, 00:06:25 »
Pedro Mil gracias, me parece que el error esta precisamente en la conversion de ASCII a decimal estoy utilizando la instruccion ASC() el codigo que tengo crea una señal diente de sierra que cambia valores de 0 a 255

Estuve revisando el interesantisimo tema de graficacion en visual basic y encontre el codigo que generosamente nos compartio con el que a traves de un scroll se cambia el valor de la grafica entre 0 y 255, mi pregunta es: ¿como tomar los datos en ascii procedentes del puerto y convertirlos a decimal para graficarlos en el picture box?
« Última modificación: 21 de Enero de 2009, 00:16:54 por kriskmilo »
Muchos exitos!!!, Universidad Distrital Presente

Desconectado PalitroqueZ

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
Re: OSCILOSCOPIO USB
« Respuesta #5 en: 22 de Enero de 2009, 13:33:36 »
con Val()

ejemplo:

Val("5") -> devuelve el número 5


mira este post, aquí se hace una especie de datalogger usando la clase CDC (emulación serial + mscomm)

http://www.todopic.com.ar/foros/index.php?topic=15208.msg104184#msg104184

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

Desconectado fenixariel

  • PIC10
  • *
  • Mensajes: 39
    • www.delphiandpic.jimdo.com
Re: OSCILOSCOPIO USB
« Respuesta #6 en: 09 de Febrero de 2009, 22:52:20 »
Hola: una sugerencia, eso de querer pasar los datos que recibes a exel, creo que te va a dar problemas, si estas tratando de acercarte a un osciloscopio de seguro que tendras que hacerlo a la mayor velocidad que en CAD y USART te lo permitan, para comenzar el CAD de un PIC es mucho mas lento que si usas un CAD externo. si intentas esto y pasar estos datos a digamos un memo...ummm que......unos 200, 300...  byte por segundo, todo tu programa se pondra tan lento que aun desconectando el PIC veras  que como 10 minutos se sigue llenando el Memo(no quiero ni imaginar el tiempo que tardaria en pasar a exel),
asi que la alternativa es almacenar los datos en otro formato como un archibo binario,etc.

Desconectado kriskmilo

  • PIC10
  • *
  • Mensajes: 6
Re: OSCILOSCOPIO USB
« Respuesta #7 en: 15 de Mayo de 2009, 16:01:32 »
Si le paso a la grafica



Decidí que para almacenar los datos lo haré en una base de datos sql, mejor q en excel.

Adjunto el código que contiene el problema, Creo que la función val toma una cadena y me devuelve un numero; si uso Val, me retornara el numero equivalente al caracter ASCII?

Private Sub Command2_Click()

ejex = 0
ejey = Picture1.Height 'inicializo los puntos del grafico
otro:

Buffer = MSComm1.Input

'dato = Asc(Buffer) / 10 ' SELECCIONO PARA UNO A UNO
dato = Val(Buffer) / 10
 

'---------------------funciona-----------------

Call dibujar
For i = 0 To (100) Step 1 'este es un retraso que se le pone para que el
For a = 0 To (10) Step 1 'usuario pueda apreciar la onda
Next a 'si se le quita la onda se dibuja muy rapido
Next i
'Next acum
GoTo otro


End Sub
Public Sub dibujar()
x = ejex + (10) 'defino el valor de x que son los datos del eje x, ejex es el dato anterior inicialmente cero ese 10 es para que se aprecie mejor la señal
y = ((Picture1.Height / 2) - ((dato) * 20)) 'tomo el valor del alto del cuadro entre dos y se le resta el valor que me va dando el valor de la función
'este valor lo multiplico por 20 para que se vea la gráfica
Picture1.Line ((ejex * 3), ejey)-((x * 3), y) 'dibujo una linea con los valores anteriores
ejex = x
ejey = y
If ejex > Picture1.Width Then 'si el valor de ejex es mayor que el ancho del cuadro
ejex = 0 'que ponga a ejex a cero
Picture1.Cls 'y que borre pantalla.'esta parte la hago para que cuando llegue al final del cuadro inicie de nuevo
'del lado izquierdo del cuadro.
End If
End Sub

Muchos exitos!!!, Universidad Distrital Presente

Desconectado PalitroqueZ

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
Re: OSCILOSCOPIO USB
« Respuesta #8 en: 15 de Mayo de 2009, 19:03:35 »
...
dato = Val(Buffer) / 10
...


umm no se, esta línea no me convence, hay que manejar la separación de los datos, como string, luego al final lo llevas a tipos numéricos.

además no entiendo bien que pretendes almacenar, ¿podrías colocar un ejemplo de un dato que llega al buffer y lo que tu quieres guardar en dato?

hay que resolver esto primero para poder avanzar a la siguiente sección del programa.

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

Desconectado fenixariel

  • PIC10
  • *
  • Mensajes: 39
    • www.delphiandpic.jimdo.com
Re: OSCILOSCOPIO USB
« Respuesta #9 en: 04 de Julio de 2009, 15:33:05 »
Hay unos componentes que hace tiempo estoy usando bastante y bueno no se si alguien puede mencionar algunos mejores, exclusivamente para este tipo de tareas y mucho mucho mas:

segun su creador solo para fines no comerciales

http://www.mitov.com/html/signallab.html