TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: NITITA 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
-
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
-
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
-
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.
¿ 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
-
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,!!
-
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:
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