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.0Option 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¡¡¡¡¡