TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: nyquist2 en 17 de Enero de 2006, 20:02:00
-
Hola,
Tengo un problema con un PIC16F84A: cuando quiero setear un bit el puerto no cambia. Utilice ls configuracion q recomiendan en la hoja de datos, pero aun asi no funciona. Aqui va el fragmento conflictivo:
CLRF PORTA
BSF STATUS, RP0
MOVLW 0X00
MOVWF TRISA ; Puerto A configurado como salida
MOVLW 0Xff
MOVWF PORTA ; Prendo todos los bits
Cuando simulo el programa, el registro TRISA cambia pero PORTA no me da bolilla.
Saludos, Nyquist.
-
Hola nyquist2, tu problema pasa porque no estas configurando correctamente los puerto, esto es lo que tu programas:
CLRF PORTA
BSF STATUS, RP0
MOVLW 0X00
MOVWF TRISA ; Puerto A configurado como salida
MOVLW 0Xff
MOVWF PORTA ; Prendo todos los bits
y esto es lo que deberías de poner:
CLRF PORTA
BSF STATUS, RP0 ; \_____Selecciono el banco 1
BCF STATUS, RP1 ; /
MOVLW 0X00
MOVWF TRISA ; Puerto A configurado como salida
BCF STATUS, RP0 ; \_____Selecciono el banco 0
BCF STATUS, RP1 ; /
MOVLW 0Xff
MOVWF PORTA ; Prendo todos los bits
Como podrás ver te a faltado salir del banco 1 e ir al banco 0 para poder ejecutar la sentencia MOVWF PORTA, ya que el registro porta se encuentra en el banco 0
En el datasheet de microchip para el 16F84A encontraras todo lo necesario para la configuracion de puertos, la organizacion de la memoria segun los bancos, etc.
Suerte.
Atte. CARLOS
-
Hola a todos
El error era que la primera instrucción (SF STATUS, RP0) cambiaba al banco1 y configuraba el puerto A como salida (MOVLW 0X00, MOVWF TRISA ) y después al no cambiar de banco volvía a cambiar el puerto A como entrada (MOVLW 0Xff, MOVWF PORTA).
lo que pasa es que en el 16f84 el registro trisa y porta tienen la misma direccion 0x06
aunque digan que trisa es 0x86.
eso lo puedes ver en el P16f84.inc
-
Hola miltonmc, en eso tienes razón pero se dice que TRISA es 0x86 para poder diferenciarlo de PORTA, eso es a nivel programa, pero realmente TRISA no tiene la misma dirección que PORTA porque si así fuera estarían en el mismo banco y no tendrías que cambiar de banco para configurar una u otra, lo que haces al cambiar de banco es precisamente marcar esa diferencia.
Suerte.
Atte. CARLOS
-
Escrito originalmente por Chaly29
Hola miltonmc, en eso tienes razón pero se dice que TRISA es 0x86 para poder diferenciarlo de PORTA, eso es a nivel programa, pero realmente TRISA no tiene la misma dirección que PORTA porque si así fuera estarían en el mismo banco y no tendrías que cambiar de banco para configurar una u otra, lo que haces al cambiar de banco es precisamente marcar esa diferencia.
Suerte.
Atte. CARLOS
Antes que todo TRISA si mal no recuerdo es 0x85 , no 0x86.
Ahora para ti, nyquist2 TRISA y PORTA no están en el mismo banco. La diferencia radica en que toda la parte "inferior" del address de memoria es idéntica.
Los PIC16 cuentan con instrucciones de 14 bits, dependiendo de la instruccion esto se usa para una u otra cosa, en el caso de direccionar "file register" o posiciones de memoria RAM , solo tienen 7 bits! Es decir que direccionar 0x06 (PORTB) en un PIC es lo mismo que direccionar 0x86 (TRISB) porque el 7mo bit, osea el más significativo será truncado y no tenido en cuenta (acá tomo como que el bit 0 es el menos significativo, para ser coherente con la numeración de Microchip).
Es entonces que entran en juego los bit RP0 y RP1, ubicados en el registro STATUS.
Estos bits nos permiten extender de 7 bits a 9 bits el tamaño de la memoria a direccionar. Es por eso que hay que setear los bits de banco para ubicar la posición de memoria 0x86!
Los pasos son
1) Poner el Bit RP0 en 1 , indicando que el 7mo bit es 1.
2) El registro parámetro en el movwf o clrf o incf (la instrucción que desees) se usará como 0x06 o 0x86 como tu prefieras ya que como dije antes el 7mo bit es truncado.
Espero haber clarificado el tema.