Autor Tema: No puedo manejar los puertos  (Leído 2117 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado nyquist2

  • PIC10
  • *
  • Mensajes: 19
No puedo manejar los puertos
« 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.

Desconectado Chaly29

  • Moderador Global
  • DsPIC33
  • *****
  • Mensajes: 4315
RE: No puedo manejar los puertos
« Respuesta #1 en: 17 de Enero de 2006, 21:50:00 »
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


La teoría es cuando se sabe todo y nada funciona. La práctica es cuando todo funciona y nadie sabe por qué.

Desconectado miltonmc

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 307
RE: No puedo manejar los puertos
« Respuesta #2 en: 17 de Enero de 2006, 22:17:00 »
    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


Desconectado Chaly29

  • Moderador Global
  • DsPIC33
  • *****
  • Mensajes: 4315
RE: No puedo manejar los puertos
« Respuesta #3 en: 17 de Enero de 2006, 23:20:00 »
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




La teoría es cuando se sabe todo y nada funciona. La práctica es cuando todo funciona y nadie sabe por qué.

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
RE: No puedo manejar los puertos
« Respuesta #4 en: 18 de Enero de 2006, 05:15:00 »
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.
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)


 

anything