Autor Tema: Recepcion a 10bits (Rs_232) y 16F877A  (Leído 3894 veces)

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

Desconectado djim

  • PIC12
  • **
  • Mensajes: 75
Recepcion a 10bits (Rs_232) y 16F877A
« en: 06 de Enero de 2010, 23:59:47 »
Hola a todos muchisimas felidades!!!. Les queria hacer una consulta y que me den una mano, lo que necesito es:

*  Aquirir un dato analogo desde un MicroControlador (16F877A)
*  El dato adquirido enviarlo por Rs232 hacia la Pc
*  Recibir el dato en Visual Basic (6)
*  Visualizar el dato en forma decimal, el tema de hacer una grafica lo estudiare mas adelante.

Los problemas que tengo son los siguientes:

*  La forma que utilizo en el micro para mandar el dato es: atravez de un dato alto y otro dato bajo a 10 bits, la comunicacion esta establecida, visualizo en un textbox el dato recibido pero me parece que es ASCII y solo me muestra eso.
*  Otra manera que utilize fue: En el micro le hago la conversion DEC a BCD y mando los datos, seria algo asi: si tengo 47,2º, mando el 4 despues el 7 y luego el 2, y al recibirlo en el visual basic le digo que junte los datos de la cadena y los muestre en una texbox (de esta manera funciona) pero lo que sucede es que pienso ampliar el proyecto a por lo menos 6 sensores, mas el Id del sensor, hora y fecha, entonces este sistema no me es de mucha utilidad.

Les adjunto un .rar con el codigo del Pic (ensamblador, hex) y Proyecto Visual Basic.
El esquema de conexion es el siguiente.

analogo: RA0 (pata numero 02)
txrs232: RC6 (pata numero 25)

Desde ya muchas gracias a todos!!!                         DJIM

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Recepcion a 10bits (Rs_232) y 16F877A
« Respuesta #1 en: 07 de Enero de 2010, 08:36:59 »
En VB.NET yo lo hago de la siguiente manera:

Código: vb.net
  1. Dim Buffer as object
  2.     Dim Data as Integer
  3.  
  4.     Buffer=MSComm.input
  5.     Data= Buffer(0)*256+Buffer(1) ' Si Primero se envia byte alto.
  6.     textbox.text=Data.ToString() ' También se puede usar Cstr(Data)


Fíjate en comando equivalente en VB 6.


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado djim

  • PIC12
  • **
  • Mensajes: 75
Re: Recepcion a 10bits (Rs_232) y 16F877A
« Respuesta #2 en: 10 de Enero de 2010, 05:33:58 »
Suky: Gracias por contestar, ando re perdido, y para no andar molestando mucho estube leyendo algo. Ahora ya lo hago leer pero solo me lee el dato asta el numero 255 y de ahi vuelve a empesar de 0. Asi lo tengo visualizando el dato, pero no logro hacerlo leer a 1024 o 10 bits.


Private Sub Form_Activate()

MSComm1.CommPort = 1        'Selecciona puerto
MSComm1.PortOpen = True     'Abrir Puerto

End Sub

Private Sub MSComm1_OnComm()
   
    Select Case MSComm1.CommEvent
        'Errores
        Case comEventBreak
        Case comEventCDTO
        Case comEventCTSTO
        Case comEventDSRTO
        Case comEventFrame
        Case comEventOverrun
        Case comEventRxOver
        Case comEventRxParity
        Case comEventTxFull
        Case comEventDCB
        'Eventos
        Case comEvCD
        Case comEvCTS
        Case comEvDSR
        Case comEvRing
        Case comEvReceive
               
    Buffer = MSComm1.Input
    text1.Text = Asc(Buffer)
           
        Case comEvSend
        Case comEvEOF
    End Select

      End Sub
     
Private Sub Command1_Click()

    End

End Sub

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Recepcion a 10bits (Rs_232) y 16F877A
« Respuesta #3 en: 10 de Enero de 2010, 09:33:21 »
Cuando entre al evento OnComm pregunta si hay 2 datos en el buffer, MsCommcounter.. (No me acuerdo el nombre  :mrgreen: ) Si es cierta esa condición pasas a recibir los 2 bytes enviados por el microcontrolador para luego armar la variable de 16-bits para poder visualizar el dato correcto. Como te muestro en el mensaje anterior.


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado PalitroqueZ

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
Re: Recepcion a 10bits (Rs_232) y 16F877A
« Respuesta #4 en: 10 de Enero de 2010, 19:54:32 »
para leer solamente 2 bytes, hay que ajustar la propiedad RThreshold=2

quiere decir que cuando se genere el evento comEvReceive, habrán 2 bytes exactos en el buffer (después tendrás que controlar el flujo para recibir correctamente los datos)

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

Desconectado alekspm

  • PIC10
  • *
  • Mensajes: 13
Re: Recepcion a 10bits (Rs_232) y 16F877A
« Respuesta #5 en: 15 de Mayo de 2010, 21:56:13 »
Yo lo hice asi... y ademas lo GRAFICA!!! Espero te sirva. Atte. Alekspm

1.Iniciar Microsoft Visual Basic 6.0
2.Crear un nuevo proyecto EXE standar (Form1) con las siguientes propiedades:
   Appearance= 1 - 3D
   AutoRedraw= True
   BackColor= H80000004
   BorderStyle= 1 – Fixed Single
   Caption= Monitor AN-0 del PIC 16F73-1/SP
   Icon= (asigne uno)
   StartUpPosition= 2 – CenterScreen
3.En el formulario padre, agregar dos etiquetas con la siguientes propiedades:
   label1, BackColor= H80000009, Caption= Dato de 8 bits:
   label2, BackColor= H80000009, Caption= Voltaje aplicado al pin 2:
4.Agregar dos cuadros de texto con las siguientes propiedades:
   text1, Locked= True, Text= (vacio)
   text2, Locked= True, Text= (vacio)
5.Agregar el control AvtiveX MSComm
   El formulario debe parecerse al siguiente, puede cambiar según el gusto del desarrollador.


6.De dos clicks sobre el formulario padre, y al aparecer el examinador de código, escriba:
   
Dim MatrizY(150), MatrizY2(150) As Integer
Dim Contador, Aux As Integer
Dim CordX, CordY As Integer
Dim Recibe As String

Private Sub Form_Load()
    Contador = 0
    CurrentX = 1000
    CurrentY = 5000
    CordX = 250 'Inicio de la grafica original 1000
    CordY = 5550
    
    'Comprueba que el puerto este cerrado para poder abrirlo
    If MSComm1.PortOpen = False Then
        MSComm1.Settings = "2400, N, 8, 1" 'BPS, Parity, Bits, Stop
        MSComm1.Handshaking = comNone   'Sin protocolo. Vea Ayuda: MSComm
        MSComm1.InputMode = 0   '0: Datos recuperados como texto. 1: en binario
        MSComm1.RThreshold = 1  'Cada cuantos bytes recibidos se genera un evento
        MSComm1.InputLen = 1    'Cuantos bytes se extraen al leer el puerto
        MSComm1.PortOpen = True 'Abre el puerto seleccionado
    End If
End Sub

Private Sub MSComm1_OnComm()
'MSComm1.CommEvent = 2 (CommEvReceive); No. de caracteres RThreshold recibido.
'Este evento se genera continuamente hasta que se usa la propiedad Input para
'quitar datos del búfer de recepción.
    If MSComm1.CommEvent = 2 Then
        'El dato que llega por el puerto se guarda en "Recibe"
        Recibe = MSComm1.Input  'El dato se recibe en bytes
        MatrizY(149) = Asc(Recibe)  'Convierte el byte (11111111= FF) Recibe en ASCII
        'El ASCII de recibe lo resta a 255 para hacer positiva la grafica
        Aux = 255 - Asc(Recibe)
    End If
    
    If Contador = 149 Then
    
        MatrizY(149) = 255 - Asc(Recibe)
        MatrizY(149) = (MatrizY(149) * 10) + 3000
        MatrizY2(149) = MatrizY(149)
    
    
        For Contador = 0 To 148
            MatrizY2(Contador) = MatrizY(Contador + 1)
        Next

        For Contador = 0 To 149
            MatrizY(Contador) = MatrizY2(Contador)
        Next
            Cls
            CordX = 250

        For Contador = 0 To 147
            Line (CordX, MatrizY2(Contador)) - (CordX + 20, MatrizY2(Contador + 1))
            CordX = CordX + 20
        Next
    End If
    'El 10 es para aumentar la escala del Aux
    'El 3000 es para ajustar el setpoint de la grafica
    Line (CordX, CordY) - (CordX + 20, (Aux * 10) + 3000)

    CordY = (Aux * 10) + 3000
    CordX = CurrentX

    MatrizY(Contador) = CordY
    Contador = Contador + 1
    
    'Muestra el dato en formato de 8 bits (255= 11111111)
    Text1.Text = Asc(Recibe)
    'Convierte los 8 bits en voltaje. El (5/255) es el factor de resolución del PIC
    Text2.Text = Asc(Recibe) * (5 / 255)
End Sub

Private Sub Form_UnLoad(Cancel As Integer)
    If MSComm1.PortOpen Then
        'Cierra el puerto utilizado
        MSComm1.PortOpen = False
    End If
    
    End 'Termina el programa
End Sub

« Última modificación: 15 de Mayo de 2010, 21:59:01 por alekspm »


 

anything