Mostrando entradas con la etiqueta CDLA. Mostrar todas las entradas
Mostrando entradas con la etiqueta CDLA. Mostrar todas las entradas

jueves, 18 de julio de 2013

Comunicación Serial, transmitiendo datos PIC a Visual Basic 6

Muy Buenas a todos y todas!!!

Después de actualizar a la versión 1.1 del programa CDLA, ahora le toca el turno al programa en Visual Basic 6 para controlar las locomotoras desde el PC.

Este programa ya transmitía datos desde el PC al PIC, ahora lo que quiero que haga es que lea el control manual y muestre en la pantalla del ordenador los datos que envía el microcontrolador.

Para esto he utilizado el objeto MSCOMM1 que ya trae Visual Basic 6 con la instrucción "MScomm1.input".

Intentare explicarlo un poco y espero que sea comprensible:

Enviando datos desde PIC a VB6

Los datos que se mandan desde el microcontrolador PIC son transmitidos a una velocidad de 9600 bauds y cada variable va separada por ",":


include "modedefs.bas"   'Activa el modo de comunicación

Masterout var portc.6

Serout portb.1, N9600, [#variable1,#variable2,#variable3,"AK"]

* La variable 1 es una variable tipo BYTE que va desde 0 a 255
* La variable 2 es una variable tipo BYTE que va desde 1 a 8
* La variable 3 es una variable tipo BIT que va desde 0 a 1

Con serialComunicator de Mecanique nos mostrará en pantalla los datos en el siguiente formato:

010AK 010AK 010AK.... (Variable1 = 0, Variable2 =1, Variable3 =0, AK)

12831AK 12831AK 12831AK... (Variable1 = 128, Variable2 =,3 Variable3 =1, AK)

Esta es la trama de datos que se envían desde el microcontrolador PIC y que tendremos que decodificar en VB6.


Obtención de datos en VB6

Ahora, ¿como extraemos de esa maraña de caracteres los datos que nos interesan?

Para obtener los datos tenemos la función .Input de MScomm. con el adquirimos los datos del cual luego iremos desgranando dato por dato.

La rutina que vamos a utilizar esta dentro de un timer como podemos ver en el siguiente ejemplo:


Attribute VB_Name = "Form1"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Dim dataIn, tdataIn, Vel, total As String
Dim C, T, N, X As Integer   'cantidad, tipo, numero, valor

Private Sub Command1_Click()
  Timer1.Enabled = True
  MSComm1.PortOpen = True
  Command1.Enabled = False
  Command2.Enabled = True
End Sub

Private Sub Command2_Click()
  Command1.Enabled = True
  Command2.Enabled = False
  Timer1.Enabled = False
  MSComm1.PortOpen = False
End Sub

Private Sub Form_Load()
  Timer1.Enabled = False
  Command1.Enabled = True
  Command2.Enabled = False
End Sub

Private Sub Timer1_Timer()

  dataIn = MSComm1.Input
  If dataIn <> "" Then ' Si no es un texto vacio entonces...
    tdataIn = Len(dataIn)
    
    If tdataIn = 7 And Right(dataIn, 2) = "AK" Then
      Text2.Text = (Right(dataIn, 2))
      Text1.Text = dataIn
    
      Vel = Mid$(dataIn, 1, 3)
      total = ""
      For X = 1 To Len(Vel)
        If InStr("0123456789", Mid$(Vel, X, 1)) Then
          total = total & Mid(Vel, X, 1)
          N = total
        End If
      Next X
    
      dataIn = (Right(dataIn, 4))
      C = Left(dataIn, 1)
    
      dataIn = Right(dataIn, 3)
      T = Left(dataIn, 1)
    
      Text3.Text = C
      Text4.Text = T
      Text5.Text = N
    End If
  End If
End Sub

  • Text1: Lectura de toda la trama de datos enviados por el PIC.
  • Text2: Lectura de los caracteres de confirmación (AK).
  • Text3: Lectura de la Variable2
  • Text4: Lectura de la Variable3
  • Text5: Lectura de la Variable1


El tema de como sacar el los números de una cadena, viene muy bien explicado y con varios ejemplos en este magnifico foro de Visual Basic.


Espero que les sea de ayuda para entender como comunicar un microcontrolador PIC 16F628 o 16F876A con un sistema Visual Basic 6

Saludos a todos y todas!!!

martes, 18 de junio de 2013

CDLA Versión 2 (Control Digital Locomotoras Analógicas)

La nueva versión del CDLA ya está disponible para  descargar. También sera la última versión en tener potenciómetro, a partir de ahora sera un encoder rotatorio el encargado de  esa función, pero eso será,  espero, en próximas versiones.
para está versión, la número 2, incluye las siguientes características:

  • Posibilidad de memorizar :

  1. El número de circuitos desde el 1  hasta el 8
  2.  Velocidad máxima 
  3. Velocidad mínima .
  4. Carga de la locomotora.
  5. Intensidad de luz con el mando a 0 .
  6. Numero de desvíos
  • Luces!!! Ahora puedes estar parado con las luces encendidas!!! Si estas en la pantalla principal y pulsas "4", aparecerá un mensaje en la pantalla "Luces ON" indicando que has encendido las luces; Despues de eso el icono de la luces pasara a la posición de encendido;Si pulsas "4" de nuevo aparecerá el mensaje "Luces OFF" y el icono pasara a la posición de apagado. 
                                                      
  • Además en la pantalla de configuración he añadido una opción para resetear los valores originales.
  • También le he puesto un escape de la pantalla "igualar" para poder salir de él sin igualar la velocidad solo pulsando "#".
  • En la pantalla principal también he modificado un poco para que muestre la dirección de las locomoras y el último desvío y su posición.
  • Gestor de bucles (aun en construcción) para poder asociar los desvíos de 8 bucles retorno a los 8  circuitos. De esta manera los desvíos se abrirán o cerraran según la dirección de la locomotora.

Evidentemente yo ya la tengo instalada en la central y la verdad es que funciona bastante bien y no me ha dado problemas. Espero que alguien se anime a verla funcionar aunque sea en Proteus.


Un saludo!!!