TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: cocibolca en 21 de Enero de 2008, 18:08:10
-
Hola a todos, mi problema es que cree una interfaz grafica en Visual Basic 6.0, para enviar datos a la entrada de un PIC16F84A (RA4), y el codigo enviado active una salida especifica a la cual tiene conectado un LED por cada salida (8 en total). Adjunto codigo fuente de la interfaz y el firmware del PIC.
PROGRAMA EN VB 6.0
Option Explicit
Dim Salida As Byte
Private Sub CmdGo_Click()
Dim i As Integer
Salida = 0
For i = Chk.LBound To Chk.UBound
Salida = Salida + Chk(i).Value * 2 ^ i
Next
'Salida contiene el valor a enviar
MsgBox "Representacion en decimal : " & Salida
MsgBox "Caracter a enviar : " & Chr(Salida)
End Sub
Private Sub ENVIAR_Click()
MSComm1.Settings = "9600,N,8,1"
Dim Salida As Byte
MSComm1.Output = Chr(Salida)
MsgBox "El valor ha sido enviado satisfactoriamente"
End Sub
Private Sub conectar_Click()
'comprueva que el puerto este cerrado para poder abrirlo
If MSComm1.PortOpen = False Then
'determina el puerto que seleccionado
MSComm1.CommPort = 1
MSComm1.PortOpen = True
Else
MSComm1.CommPort = 2
End If
'determina: 9600-Velocidad en Baudios, N-No utiliza ninguna paridad,
'8-Cantidad de bits de envio y recepcion por paquete,
'1-Determina los bits de parada
MSComm1.Settings = "9600,N,8,1"
'lee todo el buffer de entrada para que quede vacio
'Abre el puerto seleccionado
Me.Caption = "Conectado por el puerto " & MSComm1.CommPort
End Sub
Private Sub Desconectar_Click()
If MSComm1.PortOpen = True Then
'cierra el puerto
MSComm1.PortOpen = False
Me.Caption = "Desconectado"
End If
End Sub
Private Sub Form_Load()
Dim i As Integer
'Insertar números a los pulsadores
For i = Chk.LBound To Chk.UBound
Chk(i).Caption = i
Next
End Sub
Private Sub MSComm1_OnComm()
MSComm1.Settings = "9600,N,8,1"
Select Case MSComm1.CommEvent
' Controlar cada evento o error escribiendo
' código en cada instrucción Case
' Errores
Case comBreak ' Se ha recibido una interrupción.
Case comEventFrame ' Error de trama
Case comEventOverrun ' Datos perdidos.
Case comEventRxOver ' Desbordamiento del búfer
' de recepción.
Case comEventRxParity ' Error de paridad.
Case comEventTxFull ' Búfer de transmisión lleno.
Case comEventDCB ' Error inesperado al recuperar DCB.
' Eventos
Case comEvCD ' Cambio en la línea CD.
Case comEvCTS ' Cambio en la línea CTS.
Case comEvDSR ' Cambio en la línea DSR.
Case comEvRing ' Cambio en el indicador de
' llamadas.
Case comEvReceive ' Recibido nº SThreshold de
' caracteres.
Case comEvSend ' Hay un SThreshold
' caracteres en el búfer
' de transmisión.
Case comEvEOF ' Se ha encontrado un carácter
' EOF en la entrada.
End Select
End Sub
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
FIRMWARE DEL PIC
LIST p=16F84A
processor PIC16F84A
#include "P16F84A.INC"
__CONFIG _CP_OFF & _PWRTE_OFF & _WDT_OFF & _XT_OSC
ERRORLEVEL -302
#DEFINE rx 2 ; bit de recepcion de datos en serie
CBLOCK 0x0C
r0d ; registro de proposito general
r0e ; registro de proposito general
conta ; registro de proposito general(contador)
recep ; buffer de entrada
ENDC
org 00h ;vector de reset
goto inicio ;salta al comienzo del programa
org 05h ;saltea el vector de interrupcion
start movlw .124 ;retardo para generar bit de arranque
goto startup
delay movlw .83 ;retardo para generar bit de datos
startup movwf r0e
redo nop ;pierde 12 microsegundos
nop
decfsz r0e,F ;resta 1 al retardo
goto redo ;si falta el tiempo itera
retlw 0 ;si termino retorna limpiando w
recibir nop ;recibe un byte por RS232
clrf recep ;limpia el buffer de recepcion
btfss PORTA,rx ;mira el estado de la linea serie
goto $-1 ;si esta inactiva queda a la espera
call start ;retardo para bit de arranque
rec movlw .8 ;carga cantidad de bits a recibir
movwf conta
rnext bcf STATUS,C ;limpia el carry
btfss PORTA,rx ;mira la linea de recepcion
bsf STATUS,C ;si esta en alto sube el carry
rrf recep,W ;rota el buffer de recepcion
call delay ;retardo entre bits
decfsz conta,F ;resta 1 a la cantid. de bits a recibir
goto rnext ;si faltan bits para recibir itera
retlw 0 ;si termino sale y limpia w
inicio bsf STATUS,RP0 ;selecciona la pagina 1 de memoria
movlw 0ffh ;programa el puerto "a" como entradas
movwf TRISA
movlw 00h ;programa el puerto "b" como salidas
movwf TRISB
bcf STATUS,RP0 ;selecciona la pagina 0 de memoria
clrf recep ;limpia el buffer de recepcion
clrf PORTB ;apaga todas las salidas
ciclo call recibir ;queda a la espera de recibir datos
movf recep,w ;carga en w el dato recibido
movwf PORTB ;manda el dato a las salidas
goto ciclo ;itera indefinidamente
end
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Mi problema radica en que no se como hacer que el caracter que envie en formato ASCII, refleje su representacion binaria en las salidas de los LEDS
y mantenga ese valor hasta una nueva orden. He investigado al respecto y todo me lleva que al comienzo tengo que declarar cada salida que equivale
al caracter en formato ASCII, ES ESTO CIERTO????
Cualquier sugerencia o correccion sera BIENVENIDA¡¡¡¡¡ :) :-)
-
Disculpe si es algo molesto, pero aun no entiendo esto "Chk" que es lo que es? me imagino q es una manera de obterne datos en el Form? pero no se si puedes decirme para poder simular tu trabajo.
Gracias
-
Hola amigo
No he analizado muy a fondo tu programa por lo que te pido disculpas si omito algo en mi comentario.
En las lineas que cito abajo estas viendo si tu linea de recepcion esta en uno logico, si es asi, saltas la instruccion bsf con lo cual no estas seteando el carry cuando recibes un uno.
btfss PORTA,rx ;mira la linea de recepcion
bsf STATUS,C ;si esta en alto sube el carry
rrf recep,W ;rota el buffer de recepcion
por lo tanto, cuando recibes un uno cargas un cero y viceversa. Puede que ahi este el error...
Con respecto al dato enviado, no entiendo Vb pero si el dato que envias lo armas con "unos y ceros" eso es lo que recibiras, si el resultado de alguna operacion o un string debes chequear la conversion para estar seguro de lo que recibe el micro.
De cualquier manera, aunque siempre es interesante detectar errores, yo te recomiendo que trabajes con un 16f628A es 100% compatible con el 16f84A pero trae un puerto de recepcion serie, y creeme que es muy facil de usar, y es mas barato (argentina). suerte