TODOPIC
Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: POSIXAND en 22 de Junio de 2014, 02:33:59
-
que tal , tengo una duda ,soy nuevo en micros, como puedo modificar código de un pic a otro f887 a f877A
específicamente con el teclado matricial, me presenta errores con ansel y anselh entre otras , lo demas no es tanto problema
espero haberme explicado bien
tengo lo siguiente:
include <p16f887.inc>
Cblock 0x20
reg1,reg2,reg3,respaldo
endC
org 0x00
bsf STATUS,RP0
clrf TRISA
movlw 0xF0
movwf TRISB ; de b0 al b3 son salidas, del b4 al b7 son entradas
bcf OPTION_REG,7 ; el para que se activen las resistencias de pull-on que estan del b4 al b7 del puerto B
bsf STATUS,RP1
clrf ANSEL
clrf ANSELH
bcf STATUS,RP0
bcf STATUS,RP1
clrf PORTA
main call barre ; no sale de barre si no se oprime nada
goto main
barre
movlw 0xFE ; E seria 1110 de las de salida
call esc_lee ; vemos si en E se apreto algun boton
btfss STATUS,2 ; checamos la bandera z
goto qtecla ; si z=0 se primio una tecla mientras E
movlw 0xFD ; checamos D seria 1101 de la salida
call esc_lee ; vemos si en D se apreto algun boton
btfss STATUS,2 ; z?
goto qtecla ; z=0 vamos a rebisar que boton se oprimio estando en D
movlw 0xFB ; B es 1011
call esc_lee ; revisamos si estando en B se oprimio
btfss STATUS,2 ;z=?
goto qtecla ;Z=0 se oprimio estando en B
goto barre
esc_lee
movwf PORTB ; ponemos el valor en PORTB, recordar que lo que importa mas son los primeros 4 bits
movf PORTB,0 ; lo del PORTB lo ponemos en W, no es lo mismo que el anterior ya que si esta oprimido algo nos lo refleja del b4 al b7
movwf respaldo ; se guarda en respaldo, para salvar direccion si esque sirve
andlw 0xF0 ; con and se enmascara, solo del b4 al b7 , lo demas es 0
xorlw 0xF0 ;si el resultado no es cero, si se oprimio tecla
return ; regresa a su posicion en barre
qtecla call retardo ; para el antirebote
movf respaldo,0 ; si Z=0 pasamos respaldo a W y lo comparamos con el siguiente, y asi nos vamos
xorlw 0x7E ;1
btfsc STATUS,2 ; checamos la bandera z
goto sec1 ; si hay un 1, se apreto el boton 1, y mandamos a llamar a la secuencia correspondiente
movf respaldo,0
xorlw 0x7D ;2
btfsc STATUS,2
goto sec2
movf respaldo,0
xorlw 0x7B ; 3
btfsc STATUS,2
goto sec3
movf respaldo,0
xorlw 0xBE ;4
btfsc STATUS,2
goto sec4
movf respaldo,0
xorlw 0xBD ;5
btfsc STATUS,2
goto sec5
movf respaldo,0
xorlw 0xBB ;6
btfsc STATUS,2
goto sec6
return
sec1 bcf STATUS,2
movlw 0x01 ; cargamos un 1
movwf PORTA ; lo ponemos en la salida para iniciar
call retardo
c1 rlf PORTA,1 ; recorremos el 1 hacia la izquierda y lo guardamos en el mismo PORTA
call retardo
btfss PORTA,7 ; vemos si ya llegamos hasta el bit7 para dejar de moverlo hacia la izquierda
goto c1 ; si no hemos llegado al b7 seguimos moviendo el 1 hacia la izquierda
clrf PORTA
return
sec2 bcf STATUS,2 ; limpiamos la bandera z
bsf PORTA,7 ; cargamos un 1 en el b7
call retardo
der rrf PORTA,1 ; recorremos a la derecha
call retardo
btfss PORTA,0 ; testeamos para ver si seguimos recorriendo
goto der
clrf PORTA
return
sec3 bcf STATUS,2
movlw 0x01 ; cargamos un 1
movwf PORTA ; lo ponemos en la salida para iniciar
call retardo
ciclo1 rlf PORTA,1 ; recorremos el 1 hacia la izquierda y lo guardamos en el mismo PORTA
call retardo
btfss PORTA,7 ; vemos si ya llegamos hasta el bit7 para dejar de moverlo hacia la izquierda
goto ciclo1 ; si no hemos llegado al b7 seguimos moviendo el 1 hacia la izquierda
ciclo2 rrf PORTA,1 ; si el 1 esta en b7 lo dezplazamos hacia la derecha
call retardo
btfss PORTA,0 ; checamos si el 1 llego hasta el b0
goto ciclo2 ; si no ha llegado a b0 seguimos recorriendo a la derecha
clrf PORTA
return
sec4 bcf STATUS,2 ; la misma logica que en la secuencia 3 pero empezamos con recorrido a la derecha
bsf PORTA,7
call retardo
cl14 rrf PORTA,1
call retardo
btfss PORTA,0
goto cl14
cl24 rlf PORTA,1
call retardo
btfss PORTA,7
goto cl24
clrf PORTA
return
sec5 bcf STATUS,2
movlw 0x81
movwf PORTA ; ponemos en la salida 10000001
call retardo
movlw 0x42
movwf PORTA ; ponemos en la salida 01000010
call retardo
movlw 0x24
movwf PORTA ; ponemos en la salida 00100100
call retardo
movlw 0x18
movwf PORTA ; ponemos en la salida 00011000
call retardo
clrf PORTA
return
sec6 bcf STATUS,2
movlw 0x18
movwf PORTA ; ponemos en la salida 00011000
call retardo
movlw 0x24
movwf PORTA ; ponemos en la salida 00100100
call retardo
movlw 0x42
movwf PORTA ; ponemos en la salida 01000010
call retardo
movlw 0x81
movwf PORTA ; ponemos en la salida 10000001
call retardo
clrf PORTA
return
retardo
movlw .30
movwf reg1
a1 movlw .20
movwf reg2
a2 movlw .20
movwf reg3
a3 decfsz reg3,1
goto a3
decfsz reg2,1
goto a2
decfsz reg1,1
goto a1
return
end
-
me presenta errores con ansel y anselh
Prueba asi no estabas configurando ANSEL en su banco de memoria:
bsf STATUS,RP0
clrf TRISA
movlw 0xF0
movwf TRISB ; de b0 al b3 son salidas, del b4 al b7 son entradas
bcf OPTION_REG,7 ; el para que se activen las resistencias de pull-on que estan del b4 al b7 del puerto B
bsf STATUS,RP1
BANSEL ANSEL ;para ir a banco 4, donde estan los ansel
clrf ANSEL
clrf ANSELH
bcf STATUS,RP0
bcf STATUS,RP1
-
Evidentemente aqui es BANKSEL ANSEL, fallo ortografico
bsf STATUS,RP0
clrf TRISA
movlw 0xF0
movwf TRISB ; de b0 al b3 son salidas, del b4 al b7 son entradas
bcf OPTION_REG,7 ; el para que se activen las resistencias de pull-on que estan del b4 al b7 del puerto B
bsf STATUS,RP1
BANKSEL ANSEL ;para ir a banco 4, donde estan los ansel
clrf ANSEL
clrf ANSELH
bcf STATUS,RP0
bcf STATUS,RP1
-
Incluye <pic16f877a.inc>
Mi problema es con el adcon o adcon1, el ansel y anselh ya no pertenecen al pic 16f877a o me equivoco????
-
Yo lo que estoy poniendo es una posible solucion para el PIC 16F887, migrar al 16F877 es un paso atras: ya se dejo de fabricar, es muy caro, necesita clock externo, vamos es un atraso.
Si el problema esta en los registros ANSEL que es donde se configuran los puertos como digitales o analogicos, como te lo puse arriba debe de funcionar.
En el 877 es asi, esta en BANK 1:
MOVLW 0x06 ; Configura todas las patillas como entradas
MOVWF ADCON1 ; digitales.
-
Es el pic que estoy usando para mi semestre, cierto lo que dices, y si de hecho resolví mi problema era el adcon, estudiar más lo que necesito. Gracias por responder.
-
Hola amigos. :-/
Tengo este gran problema por desborde de pila en un pic16f886 familiar del f887.
Cuando trato de grabar en la eeprom con llamadas CALL como en el siguiente ejemplo.
El programa se enloquece por desbordamiento de pila, este código tal cual funciona perfecto en un 16 f876.
La idea es grabar los números del 1 al 60 en la eeprom. Cada ves que oprimo un pulsador, incremento el contador y lo envío a la rutina grabe. Se desborda cuando el contador llega al numero 6.
La rutina EEPROM la extraje de aquí del foro, y ya fue probada.. :(
Gracias por su ayuda
;-------------------------------
;------------------------------------------
;PREPARO PARA GABAR VALOR
GRABE
MOVF UNID_SEG,W
MOVWF CARGA
MOVLW 00H
MOVWF EE_DIR
CALL WRITE
MOVF DECEN_SEG,W
MOVWF CARGA
MOVLW 01H
MOVWF EE_DIR
CALL WRITE
RETURN
;..................................................
;ESCRIVO EL VALOR QUE QUIERO GRABAR
WRITE
bcf STATUS,RP0 ;Seleccionamos Banco 2
bsf STATUS,RP1
MOVF EE_DIR ;Ponemos en W la dirección que vamos a escribir
movwf EEADR ;y la guardamos en EEADR
bcf STATUS,RP1 ;Seleccionamos Banco 0
movf CARGA,w ;Ponemos ahora el dato a escribir en W
bsf STATUS,RP1 ;Seleccionamos Banco 2
movwf EEDATA ;y lo guardamos en EEDATA
bsf STATUS,RP0 ;Seleccionamos Banco 3
bcf EECON1,EEPGD
bsf EECON1,WREN ;Colocamos el permiso de escritura (WREN) en EECON1 a 1
;Aquí da inicio la secuencia de escritura
movlw 0x55 ;Inicio de las intrucciones para EECON2
movwf EECON2
movlw 0xAA
movwf EECON2 ;Fin de las intrucciones para EECON2
bsf EECON1,WR ;Comienza la escritura propiamente dicha.
btfsc EECON1,WR ;esperar a que termine (10 ms)
goto $-1
bcf STATUS,RP0 ;cambiar a Banco 0
bcf STATUS,RP1
RETLW 0X00
Aqui la imágen de advertencia en proteus cuando llego al 6