Autor Tema: Problemillas con la programación de PIC16F84A  (Leído 2132 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado NITITA

  • PIC10
  • *
  • Mensajes: 21
Problemillas con la programación de PIC16F84A
« en: 21 de Marzo de 2012, 06:44:06 »
Hola a todos!
Os cuento mi problema, a ver si me podéis echar una mano.

Tengo que implementar un programa con pic16f84a, y el pseudocódigo es el siguiente:

Inicio:
Esperar flanco de subida en RBO, en modo sleep
Leer código de inicialización de 8 bits:
n= nº canales, f= frecuencia de salida, m= nº muestras (bytes por canal)

( es un trozo de uno más extenso)

Mi problema viene porque para leer el código de inicialización que son 8 bits, he de cogerlos de:
RA0, RB1, RB2, RB3,RB4, RB%, RB6, RB7

Estoy acostumbrada a leer todos de un puerto y es más sencillo por ejemplo movf portb,w y ya lo tengo en w, pero aquí como tengo que coger RA0 de PORTB, no sabría como hacerlo.

Y después mi segundo problema es de esos 8 bits,¿ como puedo ir cogiendo los dos bits primeros guardarlos en un registros, despues los dos segundos en otros y por último los tres últimos?

Muchas gracias
un saludo
-La PiKiÑa PriCeSa-

Desconectado tannke

  • PIC16
  • ***
  • Mensajes: 176
Re: Problemillas con la programación de PIC16F84A
« Respuesta #1 en: 21 de Marzo de 2012, 07:47:43 »
vamos a ver que recuerdo de asm... hay diferentes maneras de hacerlo, te pongo dos ejemplos que ahora me vienen a la cabeza que seguramente sean mejorables.

-con mascaras

MOVLW        0x01                   ;mascara
ANDWF        PORTA, var          ;cogemos solo el bit 0 de portA i lo mandamos a var (var es una variable)
MOVLW        0xFE                   ; 2ª mascara
ANDWF        PORTB, w            ; paso los bits 1-7 y los dejo en w
ADDWF        var, w                 ; sumo w y var y lo dejo en w

-preguntando

MOVF          PORTB, w             ; paso puerto b a w
BCF            w, 0                     ; borro el bit 0 de w
BTFSC        PORTA, 0              ; Salta si el bit 0 del PortA es 0
BSF            w, 0                     ; Si no ha saltado es 1, pues ponemos a 1 el bit0 de w


Para tu segunda pregunta podría ser algo asi:

;partimos teniendo el dato en VarB

MOVLW      b'0000011'            ; mascara para coger los 2 primeros bits
ANDWF      VarB, Var1            ; hacemos "AND" con la mascara y mandamos a la 1ªvariable

RRF           VarB, VarB            ;
RRF           VarB, VarB            ; rotamos 2 veces hacia la derecha el dato de varB
MOVLW      b'0000011'            ;
ANDWF      VarB, Var2            ; repetimos los 2 primeros pasos pero lo mandamos a la 2ªvariable

RRF           VarB, VarB            ; rotamos otras 2 veces
RRF           VarB, VarB            ;
MOVLW      b'0000111'            ; cambiamos la mascara para tomar 3 bits
ANDWF      VarB, Var3            ; y lo mandamos a la 3ª variable

Piensa que de los 8 bits se te queda el mas significativo sin usar 2 + 2 + 3 = 7

Espero te sirva, hace bastante que no uso asm y seguramente se pueda hacer mejor y mas eficiente



Desconectado NITITA

  • PIC10
  • *
  • Mensajes: 21
Re: Problemillas con la programación de PIC16F84A
« Respuesta #2 en: 21 de Marzo de 2012, 08:48:09 »
Hola, gracias por responder.
Tengo una duda en una de las cosas que me has dicho:
-preguntando

MOVF          PORTB, w             ; paso puerto b a w
BCF            w, 0                     ; borro el bit 0 de w
BTFSC        PORTA, 0              ; Salta si el bit 0 del PortA es 0
BSF            w, 0                     ; Si no ha saltado es 1, pues ponemos a 1 el bit0 de w

Aquí exactamente en w lo único que me está metiendo son unos? ya que portb está determinado como entradas, por lo tanto será todo unos y el bit 0 de porta una vez que sea uno va a ponerse a uno en w, entonces ¿Qué consigo haciendo eso? Tener un registro acumulador con todo unos?  o estoy confundida y ¿  realmente los datos que quiero que me entran por la entrada ya los tendría almacenados en ese w?
Si me pudieras aclarar esto, por favor.
Un saludo
-La PiKiÑa PriCeSa-

Desconectado tannke

  • PIC16
  • ***
  • Mensajes: 176
Re: Problemillas con la programación de PIC16F84A
« Respuesta #3 en: 21 de Marzo de 2012, 10:08:48 »
Citar
Aquí exactamente en w lo único que me está metiendo son unos? ya que portb está determinado como entradas
No solo unos, te estará metiendo lo que leas desde el puerto B, (recuerda que tienes que estar en el banco 0 para leer el puerto, si estás en el banco 1 y pones "MOVF PORTB, w " lo que estás leyendo es el TRISB y en este caso sí tendrás solo unos.

Citar
¿  realmente los datos que quiero que me entran por la entrada ya los tendría almacenados en ese w?
Si no he metido yo la pata, despues de esas cuatro líneas en w tienes que tener RA0, RB1, RB2, RB3,RB4, RB5, RB6, RB7

Un saludo
« Última modificación: 21 de Marzo de 2012, 10:15:09 por tannke »

Desconectado NITITA

  • PIC10
  • *
  • Mensajes: 21
Re: Problemillas con la programación de PIC16F84A
« Respuesta #4 en: 22 de Marzo de 2012, 11:27:42 »
Ok perfecto! Sólo una cosa más


BTFSC        PORTA, 0              ; Salta si el bit 0 del PortA es 0
BSF            w, 0                     ; Si no ha saltado es 1, pues ponemos a 1 el bit0 de w

Saltas si el bit 0 de portA es cero, que significa que es salida en ese caso, de lo contrario significa que tienes un uno por lo tanto entrada.. pero..?
¿en la segunda línea estás poniendo directamente un uno en el bit cero? Entonces aquí como tienes el valor de RA0

Un saludo,!!
-La PiKiÑa PriCeSa-

Desconectado tannke

  • PIC16
  • ***
  • Mensajes: 176
Re: Problemillas con la programación de PIC16F84A
« Respuesta #5 en: 23 de Marzo de 2012, 06:38:36 »
Saltas si el bit 0 de portA es cero, que significa que es salida en ese caso, de lo contrario significa que tienes un uno por lo tanto entrada.. pero..?

Estás confundiendo port con tris. Si tienes el TRISA0 en uno será efectivamente una entrada, y ahora lo que estamos leyendo es el estado de esa entrada:
Código: [Seleccionar]
BTFSC        PORTA, 0              ; Salta si el bit 0 del PortA es 0
Con esta instrucción lo que hacemos es saltar la siguiente instruccion si en la entrada fisica (patita del pic) esta a 0 (0 voltios o masa) y si esa entrada está a 1 (vcc/ 5v) ejecutará la siguiente instrucción.

Recuerda que en asm puedes usar la "etiqueta" PORTA/B tanto para acceder al PORT como al TRIS lo importante es estar en el banco correcto.
En el 0 están los PORT y en el 1 los TRIS.

Espero te aclare, sino vuelve a preguntar (soy un poco malo explicando)

Un saludo