TODOPIC
Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: Desert en 19 de Febrero de 2007, 16:11:55
-
Hola amigos, tengo un programa que simulado con el proteus va perfectamente ke se trata de un teclado 4x4 en el puerto B y un Display en el puerto D de tal manera ke si pulsas la tecla en el puerto B sale el digito por el puerto D. Cuando lo pongo en la realidad el PortB todo el rato esta dando unos y ceros las patillas 4 a 7(ke no son las ke escanean tenian ke kedarse kietas como en el proteus) no entiendo el porque, el pic no esta roto xq pasa con otros ke e probao, y claro se salta el btfsc y manda los datos ke le da la gana al display, si alguien prodria decirme el xq se lo agradeceria, x cierto al pasar el dedo por el portb se vuelve mas loco el display todavia
list p=16f877 ;Comando que indica el Pic usado
include "p16f877.inc" ;Etiquetas genéricas para el Pic16F877
org 0x00 ;Inicio del programa en la posición cero de memoria
goto INICIO
org 0x05
Tecla equ 0x40
CONTA equ 0x50
Tecla2 equ 0x49
;Tecla3 equ 0x99
INICIO
CLRF PORTD ;Borra los latch.
CLRF PORTB ;Borra los latch.
BSF STATUS,RP0 ;Selecciona el banco 1
CLRF TRISD ;Selecciona PORTB como salida
MOVLW 0F0H ;PB4-7 como entradas;
MOVWF TRISB ;y PB0-3 como salidas
movlw b'10000011'
MOVWF OPTION_REG
BCF STATUS,RP0 ;selecciona banco 0
BUCLE
call KB_Scan
GOTO BUCLE ;Vuelve a la subrutina BUCLE
KB_Scan ;Escanea el teclado
CLRF Tecla ;Borra Tecla y
INCF Tecla,f ;prepara Tecla para primer c¢digo.
MOVLW b'1000' ;Saca 0 a la primera fila
MOVWF PORTB ;de la Puerta B
NOP ;Nada para estabilizaci¢n de señal.
Cheq_Col BTFSC PORTB,4 ;Primera columna = 0
GOTO antirebotes ;Sale si se ha pulsado tecla.
INCF Tecla,f ;Si no tecla pulsada, incrementa tecla.
BTFSC PORTB,5 ;Segunda columna = 0
GOTO antirebotes ;Sale si se ha pulsado tecla.
INCF Tecla,f ;Si no tecla pulsada, incrementa tecla.
BTFSC PORTB,6 ;Tercera columna = 0
GOTO antirebotes ;Sale si se ha pulsado tecla.
INCF Tecla,f ;Si no tecla pulsada, incrementa tecla.
BTFSC PORTB,7 ;Cuarta columna = 0
GOTO antirebotes ;Sale si se ha pulsado tecla.
INCF Tecla,f ;Si no tecla pulsada,incrementa Tecla.
Ultima_Tecla MOVLW d'17' ;Carga W con el n£mero de Teclas + 1.
SUBWF Tecla,w ;y lo compara con el valor actual de Tecla.
BTFSC STATUS,Z ;Si Tecla + 1 = valor actual.
GOTO NTeclas ;No ha sido pulsada ninguna tecla.
BSF STATUS,C ;Pone a 1 Bit C.
RRF PORTB,f ;as¡ la Fila 1 pasa a 1 con la rotaci¢n a izqda.
GOTO Cheq_Col
NTeclas CLRF Tecla ;Coloca variable Tecla a 0
RETURN ;y regresa.
antirebotes
Espera1
BTFSC PORTB,4 ;Si no se suelta la tecla FILA 1
GOTO Espera1 ;vuelve a esperar.
Espera2
BTFSC PORTB,5 ;Si no se suelta la tecla FILA 2
GOTO Espera2 ;vuelve a esperar.
Espera3
BTFSC PORTB,6 ;Si no se suelta la tecla FILA 3
GOTO Espera3 ;vuelve a esperar.
Espera4
BTFSC PORTB,7 ;Si no se suelta la tecla FILA 4
GOTO Espera4 ;vuelve a esperar.
MOVF Tecla,w ;pone en w el numero contenido en la variable
CALL T_Conv ;llama a la tabla de conversion y retorna
MOVWF Tecla ;con el valor en hexadecimal y lo pone en la variable.
movwf Tecla2
movwf PORTD ;Hace que salga ese valor por PORTB
RETURN ;vuelve al programa principal que hizo la llamada.
T_Conv
ADDWF PCL,1
RETLW b'01010101' ;
RETLW b'11110001' ;
RETLW b'01111110' ;
RETLW b'10101010' ;
RETLW b'00111101' ;
RETLW b'00110000' ;
RETLW b'01111001' ;
RETLW b'01001110' ;
RETLW b'00110011' ;
RETLW b'01011011' ;
RETLW b'01011111' ;
RETLW b'00011111' ;
RETLW b'01110000' ;
RETLW b'11111111' ;
RETLW b'01110011' ;
RETLW b'01110111' ;
return
retardo
movlw d'50'
movwf CONTA
espera
clrf INTCON
movlw d'178'
movwf TMR0
espera_1
btfss INTCON,T0IF
goto espera_1
decfsz CONTA,F
goto espera
return
END
-
Desert, antes que nada fíjate de leer las reglas del foro así tu post sale más claro, al menos en el código. Reglas del Foro (http://www.todopic.com.ar/foros/index.php?action=globalAnnouncements;id=1)
Respecto a cómo lees el teclado, te vales del uso de los weak pullup? o cómo es tu hardware?
Eso que comentas de que pasas el dedo y hace locuras me da a pensar en que sí los tienes activados y tal vez la lógica de tu hardware no prevea su uso.
Saludos
-
si les tengo activaos si, pero es ke si los desactivo no funciona nose porque, le e probao en el puerto D y lo mismo
-
si les tengo activaos si, pero es ke si los desactivo no funciona nose porque, le e probao en el puerto D y lo mismo
Podes subir tu código en .zip?
Saludos
-
te pongo todo, hasta el del proteus, este esta puesto en el portD el teclado y el 7 segmentos en el puerto B
-
Hola. Te mando un ejemplo de escaneo de un teclado 4x4. Lo probe y funciona muy bien. No recuerdo de donde lo saque. Suerte.
-
Hola.
Entre estas lineas:
MOVF Tecla,w ;pone en w el numero contenido en la variable
CALL T_Conv ;llama a la tabla de conversion y retornaPone:
Pone:
andlw 0x0F
Te tiene que quedar:
MOVF Tecla,w ;pone en w el numero contenido en la variable
andlw 0x0F
CALL T_Conv ;llama a la tabla de conversion y retorna
Eso no deberia hacer diferencia excepto si por algun motivo tecla adopta un valor superior a 0x0F(cosa que no deberia suceder) pero por las dudas, ponelo.
Y lo mas importante:
Pone una resistencia de 10k a GND en cada pin: D4,D5,D6 y D7 para impedir que ingrese ruido a estos pines generando problemas(probablemente lo que te este sucendiendo es esto).
Por lo que veo, tu programa envia un alto(5v) a una entrada del teclado cuando presionas una tecla.Generalmente se usa al reves(se usa en el puertob para provechar las pull ups internas en RB4-RB7), pero tambien es valido como lo estas haciendo.
Te paso los archivos modificados.
Saludos.
-
LIST P=16F84A
#INCLUDE<P16F84A.INC>
;DECLARACION DE VARIABLES
MEMORIA EQU 10
REG1 EQU 11
REG2 EQU 12
REG3 EQU 13
PORTA EQU 05
PORTB EQU 06
STATUS EQU 03
ORG 00
GOTO INICIO
RETARDO MOVLW .9
MOVWF REG1
DEC3 MOVLW .9
MOVWF REG2
DEC2 MOVLW .5
MOVWF REG3
DEC1 DECFSZ REG3,1
GOTO DEC1
DECFSZ REG2,1
GOTO DEC2
DECFSZ REG1,1
GOTO DEC3
RETURN
CONFIGURACION DE PUERTOS
INICIO
BSF STATUS,5
MOVLW 0F
MOVWF PORTA
CLRF PORTB
BCF STATUS,5
CLRF PORTA
CLRF PORTB
COLUMNA
CLRF PORTB
MOVLW B'0001'
MOVWF PORTB
BTFSC PORTA,0
GOTO UNO
BTFSC PORTA,1
GOTO DOS
BTFSC PORTA,2
GOTO TRES
RLF PORTB,1
BTFSC PORTA,0
GOTO CUATRO
BTFSC PORTA,1
GOTO CINCO
BTFSC PORTA,2
GOTO SEIS
RLF PORTB,1
BTFSC PORTA,0
GOTO SIETE
BTFSC PORTA,1
GOTO OCHO
BTFSC PORTA,2
GOTO NUEVE
RLF PORTB,1
BTFSC PORTA,1
GOTO CERO
MOVF MEMORIA,0
MOVWF PORTB
CALL RETARDO
GOTO COLUMNA
UNO MOVLW 01
GOTO MOSTRAR
CUATRO MOVLW 04
GOTO MOSTRAR
SIETE MOVLW 07
GOTO MOSTRAR
DOS MOVLW 02
GOTO MOSTRAR
CINCO MOVLW 05
GOTO MOSTRAR
OCHO MOVLW 08
GOTO MOSTRAR
CERO MOVLW 0
GOTO MOSTRAR
TRES MOVLW 03
GOTO MOSTRAR
SEIS MOVLW 06
GOTO MOSTRAR
NUEVE MOVLW 09
GOTO MOSTRAR
MOSTRAR MOVWF PORTB
MOVWF MEMORIA
CALL RETARDO
GOTO COLUMNA
END
AQUI ESTA UN CODIGO QUE TE PUEDE SERVIR
-
al final me hice otro programa como dices tu, al reves, ke aprovecha las resistencias internas y e conectao lo ke es un lcd de 4x20 y el teclao al mismo puerto y va perfectamente, este foro es mu bueno gracias, en cuanto pueda probare eso ke mas dicho y la modificacion aver si funciona y te digo