desktop

control remoto con PIC 16f877a

Hola, que tal?
Los consulto porque quiero realizar un control remoto modulado a 40 khz, usando un teclado matricial conectado al puerto B y utilizando la interrupcion de tecla presionada con la que éste cuenta, ahora, ya tengo mi código en lenguaje ensamblador, ya programé el pic e intenté ver las salidas en un osciloscopio y no logré ver nada.

Lo que pretendo hacer es usar el módulo de transmisión asíncrona para mandar los datos dependiendo de la tecla que haya sido apretada y colocar ésta salida en una compuerta AND con el módulo CCP1 en modo de PWM y que genera una señal a 40khz y 50% de ciclo de trabajo.

Puede ser que los errores sean de inexperiencia ya que nunca había trabajado con pics antes.

Tengo varias dudas
1.-¿En el datasheet del pic 16f877a dice "Polling of PORTB is not recommended while
using the interrupt-on-change feature", desgraciadamente creo que precisamente eso es lo que estoy haciendo con el teclado matricial... es recomendable que use otros puertos? que use otra interrupcion? lo que quiero es que el control remoto esté dormido hasta que se apriete una tecla, transmita, y luego regrese a dormir.

2.- Esta bien configurada mi interrupcion? ¿Tengo que habilitar las interrupciones globales con el GIE (INTCON<7>)?? o con solo habilitar la interrupcion del puerto B es suficiente?

Muchas gracias de antemano, espero me puedan ayudar por favor y ahi les dejo el codigo para que lo revisen



LIST p=16f877a ;list directive to define processor
#include <p16f877a.inc> ;processor specific definitions

;Observa que los parámetros de configuración son los que te sirven a tu proyecto
__config _CP_OFF & _XT_OSC & _WDT_OFF & _PWRTE_ON & _LVP_OFF & _BODEN_OFF

;Parámetros para eliminar los mensajes de warning cuando lo ensamblas
ERRORLEVEL -302 ;suppress "not in bank 0" message
ERRORLEVEL -203 ;suppress message
ERRORLEVEL -305 ;suppress message
ERRORLEVEL -205 ;suppress message

#define PWM PORTC,2 ; pin salida RC2/CCP1, pin 13 del micro
#define dato

periodo equ .48
duty equ .25
on equ b'00000000'
volup equ b'00000001'
voldown equ b'00000010'
bassup equ b'00000100'
bassdown equ b'00001000'
balup equ b'00010000'
baldown equ b'00100000'
trebleup equ b'01000000'
trebledown equ b'10000000'
N equ 0x1A
M equ 0x0
cont1 equ 0x20
cont2 equ 0x21

ORG 0x00
goto inicio ;ir al inicio del programa
ORG 0x04
goto detec
ORG 0x05


;Inicializar Puerto B

inicio CLRF STATUS ;BANCO 0
CLRF PORTB ;Inicializa latches de datos de PORTB
BSF INTCON,RBIE ;habilitamos interrupciones
BSF STATUS,RP0 ;BANCO 1
MOVLW 0xF0 ;configura RB7,...,RB4 como entradas
MOVWF TRISB ;y RB3,RB2,RB1 como salidas
BCF OPTION_REG,7 ;Conecta todas las resistencias Pull-Up
movlw b'00000000' ;Configura puerto C como salidas porque por ahi sale TX y PWM
movwf TRISC

;Configuracion del PWM
movlw periodo ;cargamos el valor del período en PR2
movwf PR2
bcf STATUS,RP0 ;BANCO 0
movlw duty ;cargamos valor del duty en CCPR1L
movwf CCPR1L
;configuracion UART
BSF STATUS, RP0 ;BANCO 1
BCF TXSTA, BRGH ;BRGH = 0, velocidad baja
MOVLW 0X51 ;1.2 kbaud rate, Fosc=4Mhz
MOVWF SPBRG
BCF TXSTA, SYNC ;Modo asincrono

inicio2 SLEEP
; nop
nop
GOTO inicio2

detec CLRF PORTB ;activa las cuatro columnas
BTFSS PORTB,7 ;lee renglón 1,2,3
GOTO rebo ;si tecla presionada limpia rebote
BTFSS PORTB,6 ;lee renglón 4,5,6
GOTO rebo ;si tecla presionada limpia rebote
BTFSS PORTB,5 ;lee renglón 7,8,9
GOTO rebo ;si tecla presionada limpia rebote
BTFSS PORTB,4 ;lee renglón *,0,#
GOTO rebo ;si tecla presionada limpia rebote
goto detec

rebo CALL d20ms ;pausa de 20 milisegundos

codif MOVLW 0xF7 ;desactiva todas las columnas
MOVWF PORTB ;y activa la columna on,vup,vdown,bassup
BTFSS PORTB,7 ;Es la tecla on?
goto onb ;retorna código del ‘on’
BTFSS PORTB,6 ;Es la tecla vup?
goto vupb ;retorna código del ‘vup’
BTFSS PORTB,5 ;Es la tecla vdown?
goto vdownb ;retorna código del ‘vdown’
BTFSS PORTB,4 ;Es la tecla vdown?
goto bassupb ;retorna código del ‘bassup’
MOVLW 0xFB ;desactiva todas las columnas
MOVWF PORTB ;y activa la columna bassdown,balup,baldown,trebup
BTFSS PORTB,7 ;Es la tecla bassdown?
goto bassdownb ;retorna código del ‘bassdown’
BTFSS PORTB,6 ;Es la tecla balup?
goto balupb ;retorna código del ‘balup’
BTFSS PORTB,5 ;Es la tecla baldown?
goto baldownb ;retorna código del ‘baldown’
BTFSS PORTB,4 ;Es la tecla trebup?
goto trebupb ;retorna código del ‘trebup’
MOVLW 0xFD ;desactiva todas las columnas
MOVWF PORTB ;y activa la columna 3,6,9,#
BTFSS PORTB,7 ;Es la tecla trebdown?
goto trebdownb ;retorna código del ‘trebdownb’
goto codif

onb movf on, dato
goto trans
vupb movf volup, dato
goto trans
vdownb movf voldown, dato
goto trans
bassupb movf bassup, dato
goto trans
bassdownb movf bassdown, dato
goto trans
balupb movf balup, dato
goto trans
baldownb movf baldown, dato
goto trans
trebupb movf trebleup, dato
goto trans
trebdownb movf trebledown, dato
goto trans


;Activar la salida del PWM

trans bsf T2CON,2 ;TMR2 activado
movlw 0x0c ;cargamos setup módulo
movwf CCP1CON ;PWM
goto bucle

;******RUTINA PARA QUITAR EL REBOTE*******
d20ms MOVLW N
MOVWF cont1
rep1 movlw M
movwf cont2
rep2 decfsz cont2, 1
goto rep2
decfsz cont1, 1
goto rep1
return

;Para habilitar la transmisión síncrona

bucle BSF TXSTA, TXEN ;Habilita transmision
BTFSS TXSTA, TRMT ;Checa si el buffer de transmision esta ocupado
goto bucle ;Si esta ocupado espera
BCF STATUS, RP0 ;BANCO 0
MOVF dato, w ;manda dato a enviar a W
MOVWF TXREG
BCF TXSTA, TXEN
nop
nop
nop
nop
goto pwmoff

; Estas lineas para desactivar la salida
pwmoff clrf CCP1CON
bcf T2CON,2 ;Desactivamos TMR2
bcf PWM ;esta línea en caso que al finalizar la emisión el pin quede a 1.

BCF INTCON,RBIF ;reseteamos la bandera de la interrupcion
retfie
end
 
Algo he de haber hecho muy mal en su foro o porque nadie me contesta?
ya habilite las interrupciones globales y creo que ya jala esa parte... pero en la simulacion en Proteus no funciona. AYUDA POR FAVOR!!
 
Atrás
Arriba