Autor Tema: PROBLEMAS con activacion de salidas de un PIC16F84A atravez de una PC  (Leído 1708 veces)

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

Desconectado cocibolca

  • PIC10
  • *
  • Mensajes: 15
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¡¡¡¡¡      :)   :-)                               
« Última modificación: 21 de Enero de 2008, 18:12:34 por cocibolca »

Desconectado c0lo

  • PIC10
  • *
  • Mensajes: 1
Re: PROBLEMAS con activacion de salidas de un PIC16F84A atravez de una PC
« Respuesta #1 en: 28 de Junio de 2008, 13:47:15 »
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

Desconectado irukza

  • PIC12
  • **
  • Mensajes: 87
Re: PROBLEMAS con activacion de salidas de un PIC16F84A atravez de una PC
« Respuesta #2 en: 28 de Junio de 2008, 19:29:44 »
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


 

anything