Módulo blue y pic 16f28a con android

Amigos. ¿Alguien me puede ayudar en este pequeño problema?
Quiero prender y apagar leds utilizando un pic con un módulo blue y el control sería el cel con android.

Pero la verdad no puedo prender el led.
Hice un código, es el siguiente.
Código:
CMCON = 7                     
TRISA = %00000000
TRISB = %0001010

DEFINE OSC 4
DEFINE HSER_BAUD 2400
DEFINE HSER_RCSTA 90h
DEFINE HSER_TXSTA 24h
DEFINE HSER_SPBRG 25
DEFINE HSER_Clear On               

LED var byte

PORTA = %00000000
PORTB = %00000000
 
inicio:
    
Hserin 100,continuo,[led]

continuo:
if led = "a" then
PORTB.0 = 1
pause 500
endif

if led = "b" then
PORTB.0 = 0
pause 500
endif

goto inicio
END
Pero no me da resultados.
Agradezco su ayuda y gracias por ayudar soy nueva en esto.
 
Última edición por un moderador:
Te recomiendo que cambies la etiqueta que usas en la instrucción HSerIn para que se produzca un bucle en espera de datos.
Puedes por ejemplo hacer dos cosas...

Programa:
HSerIn 1000,Programa,[led] ; Espera un segundo y si no hay datos regresa a la etiqueta Programa.
; Código
GoTo Programa ; Bucle infinito.

Ó puedes hacer un método de comprobación de existencia de datos...

Programa:
HSerIn 1000,No_Datos,[led] ; Espera un segundo y si no hay datos va a la etiqueta No_Datos.
; Código
GoTo Programa ; Bucle infinito.

; Hacer destellar 5 veces un LED para avisar que no se han recibido datos.
No_Datos:
For x = 1 To 5
High PORTX.X
Pause 100
Low PORTX.X
Pause 100
Next x
GoTo Programa ; Regresar al programa principal.

Con esta segunda opción puedes comprobar si estás recibiendo los datos.

Realiza una prueba con el Hyperterminal o con otro programa para que compruebes el funcionamiento.
También quita los retardos que tienes después de prender y apagar el LED, pues eso desincroniza la recepción.

Suerte.
 
Última edición:
Haré las modificaciones que mencionaste y te comento los resultados..:)



El código sería así?
Código:
' DEFINICIÓN DE FUSES Y OSILADOR
@ DEVICE pic16F628A, INTRC_OSC_NOCLKOUT 'Reloj interno solo    
@ DEVICE pic16F628A, WDT_OFF     ' Watchdog Timer desconectado 
@ DEVICE pic16F628A, PWRT_ON ' Power-On Timer conectado 
@ DEVICE pic16F628A, BOD_ON ' Brown-Out Detect conectado 
@ DEVICE pic16F628A, MCLR_OFF ' Master Clear Externo desconectado 
@ DEVICE pic16F628A, LVP_OFF ' Low-Voltage Programming desconectado 
@ DEVICE pic16F628A, CPD_OFF ' Data Memory Code Protect desconectado 
@ DEVICE pic16F628A, PROTECT_off ' Program Code Protection conectado

DEFINE OSC 4
'*******************************************************************************
CMCON = 7                     
TRISA = %00000000
TRISB = %00000010
'*******************************************************************************
' INICIALIZANDO USART
DEFINE HSER_BAUD 9600
DEFINE HSER_RCSTA 90h
DEFINE HSER_TXSTA 20h
DEFINE HSER_Clear On 
DEFINE OSC 4

led var byte

INCLUDE  "modedefs.bas"


'*******************************************************************************
PORTA = %00000000
PORTB = %00000000
'******************************************************************************
Programa:
HSerIn 1000,No_Datos,[led] ; Espera un segundo y si no hay datos va a la etiqueta No_Datos.

continuar:
if led = "A" then
PORTA.0 = 1
endif

if led = "B" then
PORTA.0 = 0
endif
 GoTo Programa ; Bucle infinito.
END


; Hacer destellar 5 veces un LED para avisar que no se han recibido datos.
No_Datos:
For x = 1 To 5
High PORTA.1
Pause 100
Low PORTA.1
Pause 100
Next x
GoTo Programa ; Regresar al programa principal.
 
Última edición por un moderador:
El código sería así?
Algo así, sin embargo la configuración del módulo USART para trabajar a 9600 bps. @ 4MHz. No es correcta.
Como usas transmisión y recepción por hardware, puedes omitir el uso de la librería modedefs.bas
Si necesitas alguno de los parámetros de esa librería en tu programa, puedes abrirla y ver los valores que se usan.
También olvidaste declarar la variable x usada en el bucle For, tienes doblemente declarado Define OSC 4 y es redundante escribir 8 ceros si todo el puerto será usado como salida.
No es muy importante en este caso, pero como recomendación, trata que End quede al final del programa.

Resumiendo y corrigiendo esos detalles, el código funcional quedaría de esta forma...
Código:
@ Device PIC16F628A    ; Microcontrolador utilizado
; Palabra de configuración:
@ Device INTRC_OSC_NOCLKOUT,WDT_OFF,MCLR_OFF,PWRT_ON,BOD_OFF,LVP_OFF

Define  OSC 4
'*******************************************************************************
CMCON = 7                     
TRISA = 0
TRISB = %11111011
'*******************************************************************************
' Configuración del módulo USART a 9600bps @ 4MHz.
Define HSER_SPBRG    19h
Define HSER_BAUD    9600
Define HSER_TXSTA    24h
Define HSER_RCSTA    90h

led Var Byte
x   Var Byte

'*******************************************************************************
PORTA = 0
PORTB = 0
'*******************************************************************************
Programa:
    HSerIn 1000,No_Datos,[led] ; Espera un segundo y si no hay datos va a la etiqueta No_Datos.

    If led = "A" Then
    PORTA.0 = 1
    EndIf

    If led = "B" Then
    PORTA.0 = 0
    EndIf
    GoTo Programa ; Bucle infinito.

; Hacer destellar 5 veces un LED para avisar que no se han recibido datos.
No_Datos:
    For x = 1 To 5
        High PORTA.1
        Pause 100
        Low PORTA.1
        Pause 100
    Next x
    
    GoTo Programa ; Regresar al programa principal.
    
    End
Así como está el programa debe funcionar si se recibe correctamente una A o una B
El LED testigo de ausencia de datos permanecerá apagado mientras se reciban datos correctos antes de que transcurra un segundo, caso contrario, destellará 5 veces y se retomará el programa principal nuevamente.

Como nota, cabe aclarar que con datos correctos me refiero a cualquier otro dato que no sea A y B

Suerte.
 
Holas amigos esta vez tengo un duda.
Tengo que hacer prender 5 leds y apagarlos por módulo blue.

Anteriormente pregunte hacer de como hacerlo pero en basicpro y pues ya salió, gracias por su ayuda.
Pero ahora estoy en este problema, pues ahora lo necesito en ensamblador. :unsure:

Hay un código donde puedo prender 4 leds, pero ya le di vueltas y no puedo hacer que prenda un 5 además estos se apagan todos al mismo tiempo, y necesito que sea uno por uno. :confused:

Les agradecería sus consejos. Les mando el programa, si funciona pero solo como les expliqué al principio, prenden 4 y se apagan los 4.
Perdón por las molestias :oops:

código:

Código:
;DECLARACION DE LIBRERIA
    INCLUDE <P16F627a.INC>
    __CONFIG     _BODEN_OFF & _CP_ON & _INTRC_OSC_NOCLKOUT & _LVP_OFF & _MCLRE_OFF & _PWRTE_OFF &  _WDT_OFF



;DECLARACION DE LOS REGISTROS DE PROPOSITO GENERAL QUE SE USARAN EN EL PROGRAMA
        CBLOCK    0X20    
        NUM1,NUM2, NUM3
        W_TEMP
        STATUS_TEMP
        BSR_TEMP
        DATO
        ENDC

;DECLARACION DEL ORIGEN DEL PROGRAMA
        ORG    0X00
        GOTO    INICIO

    org 0x04                    ;Interrupcion de alta prioridad
    goto    INTERR



;SUBRUTINA DE INTERRUPCION
INTERR    
                MOVF    RCREG,W
                MOVWF    DATO
                MOVF    DATO,W
                MOVWF    TXREG
                BCF        PIR1,RCIE
                RETFIE            

;CONFIGURACIONES
INICIO:             MOVLW    0X07
                MOVWF    CMCON


        CLRF    PORTA    ;ELIMINO POSIBLES LATCH
        CLRF    PORTB

        CALL    USART_INI
        CALL    PORTS_INI



START:        MOVF    DATO,W
            SUBLW    "1"
            BTFSS    STATUS,Z
            GOTO    NEXT
            bsf        PORTA,0
            CLRF    DATO
            GOTO    START

NEXT:        MOVF    DATO,W
            SUBLW    "2"
            BTFSS    STATUS,Z
            GOTO    NEXT1
            BSF        PORTA,1
            CLRF    DATO
            GOTO    START

NEXT1:        MOVF    DATO,W    
            SUBLW    "3"
            BTFSS    STATUS,Z
            GOTO    NEXT2
            BsF        PORTA,2

            CLRF    DATO
            GOTO    START


NEXT2:        MOVF    DATO,W
            SUBLW    "4"
            BTFSS    STATUS,Z
            GOTO    NEXT3

            BsF        PORTA,3

            CLRF    DATO
            GOTO    START

NEXT3:        MOVF    DATO,W
            SUBLW    "5"
            BTFSS    STATUS,Z
            GOTO    NEXT4

            BsF        PORTA,4

            CLRF    DATO
            GOTO    START


NEXT4:        MOVF    DATO,W
            SUBLW    "8"
            BTFSS    STATUS,Z
            GOTO    START

                clrf PORTA

            CLRF    DATO
            GOTO    START


USART_INI:
            BANKSEL    TRISB
            BSF        TRISB,1
            BSF        TRISB,2
            MOVLW 0X24  
            MOVWF TXSTA
            MOVLW D'25'
            MOVWF SPBRG
            BSF PIE1,RCIE
            MOVLW 0XC0
            MOVWF INTCON
            BANKSEL    PORTB

            MOVLW 0X90
            MOVWF RCSTA
            RETURN

PORTS_INI                
            BANKSEL    TRISB
            BCF        TRISA,0
            BCF        TRISA,1
            BCF        TRISA,2
            BCF        TRISA,3
            BANKSEL    PORTB
            RETURN


RETARDO        MOVLW    .1
            MOVWF    NUM3

OTRA3        MOVLW    .100
            MOVWF    NUM2

OTRA2        MOVLW    .166
            MOVWF    NUM1

OTRA:        DECFSZ    NUM1,F
            GOTO    OTRA

            DECFSZ    NUM2,F
            GOTO    OTRA2
    
            DECFSZ    NUM3
            GOTO    OTRA3
            RETURN
END
Es lo más seguro, necesitas ver que es lo que está mandando el módulo y saber sus parámetros de comunicación.
Puedes usar el programa 232Analyzer o el programa Serial RS232 & RS485 Analizer.
También puedes usar uno que yo escribí: Serial Port Control

Con alguno de esos programas puedes saber que es lo que está enviando el módulo y a que velocidad en bps.

Suerte.

gracias amigo ya quedo..era un error de sintaxis jejejejje
 
Última edición por un moderador:
Hola, María.

¿Has tenido en cuenta que la salida 4 del puerto A es de colector abierto?

Dices que se te apagan todos los ledes al mismo tiempo. Claro, así es como lo tienes programado al recibir el código "y". Cuando haces CLRF PORTA estás borrando todos los bits del puerto A. Si lo que quieres es borrarlos uno a uno, se me ocurren estas opciones:

1- Que con las teclas qwert en vez de poner las salidas a 1, las niegues (si estaba a 0 la pones a 1 y viceversa. Hay una instrucción para eso)
2- Otra opción es que asignes otras 5 teclas para poner las salidas a 0. Sería repetir el código para las 5 teclas qwert, pero quizás con las teclas asdfg por ejemplo, y en vez de poner el bit a 1 lo pones a 0.

Suerte.
 
Hay un código donde puedo prender 4 leds, pero ya le di vueltas y no puedo hacer que prenda un 5 además estos se apagan todos al mismo tiempo, y necesito que sea uno por uno.
Adjunto un ejemplo de cómo hacer esto de forma sencilla y sin usar RA4.
También se puede usar RA4 pero invirtiendo la lógica de control.

Suerte.
 

Adjuntos

  • 16F628A RS-232 y LEDS PORTA.rar
    18.3 KB · Visitas: 12
Atrás
Arriba