Acumulador y registros del pic16f84

Hey hola como estan, bueno esta es una duda que tengo, aqui hace poco postie que queria leer las entradas de RA0, RA1, RA2 y RA3, ademas lo que hice fue configurar el pin RA4 como salida, si los quiero leer bastaria con ponerle MOVFW PORTA?, el pin RA4 se veria afectado?
o se veria afectado el resultado?


O hay alguna forma de pasar el resultado de RA0, RA1, RA2 y RA3, a una especie de acumulador o a una variable?

Algo asi como si RA0=1, RA1=0, RA2=1 y RA3=1, que el ACUMULADOR=1011b,
o que VAR1=1011b si me explico?
 
Descubri una forma, por ejemplo echar al acumulador RA0*1+RA1*10+RA2*100+RA3*1000 hay alguna forma de hacer esto?
 
En el 84 cuando lees un puerto de salida lees el estado de la patilla, o sea que si fuerzas la patilla haciendo un puente a masa, aunque tu pongas la salida a nivel alto, lees un 0. Osea siempre lees el estado logico de la patilla.

Que pasa, pues esto te puede dar errores segun el tipo de carga.

La forma de hacer es primero lees el valor y despues aplicas una and borrando todo lo que sobra.


movfw portA
andwl 0b11110111 todo uno lo que quieras conservar y 0 lo que descartes.

independientemente del estado de la patilla a4 siempre sera 0.

Espero que sea esto lo que preguntabas.



ojito llevo un poco descuidado el asembler del pic
 
Con respecto a tu primera pregunta, no creo que si lees el PORTA se vea afectado ninguna salida si es que has configurado el RA4 así, lo que si sucederá es que leerá lo que esté en ese puerto.

- MOVF f,d Mueve el contenido del registro f a W si d=0 (si d=1 lo vuelve a poner en el mismo registro).
- MOVWF f Mueve el valor de W a f. Por ejemplo, si queremos copiar el valor del registro "PORTA" al registro "REG1" escribiremos:

MOVF PORTA,0 ;mueve el valor de "PORTA" a "W".
MOVWF REG1 ;mueve el valor de "W" a "REG1".

Si se puede leer cada bit del puerto he irlo guardando así mismo en un registro, es lento pero resulta.
 
ok gracias, acabo de copiar tu codigo, creo que es andlw, y despues comparo con 0B y con otro pedacito de codigo que me pasaron por aqui, por que me empezo a marcar error por ese?

INICIO movfw PORTA
andlw 0b11110111


XORLW 0B ;1011b (ra3,ra2,ra1,ra0)= 0Bh

BTFSC STATUS,Z ;si Z es cero, salta una instruccion ; aqui me marca error
 
Psyco83 dijo:
Con respecto a tu primera pregunta, no creo que si lees el PORTA se vea afectado ninguna salida si es que has configurado el RA4 así, lo que si sucederá es que leerá lo que esté en ese puerto.

- MOVF f,d Mueve el contenido del registro f a W si d=0 (si d=1 lo vuelve a poner en el mismo registro).
- MOVWF f Mueve el valor de W a f. Por ejemplo, si queremos copiar el valor del registro "PORTA" al registro "REG1" escribiremos:

MOVF PORTA,0 ;mueve el valor de "PORTA" a "W".
MOVWF REG1 ;mueve el valor de "W" a "REG1".

Si se puede leer cada bit del puerto he irlo guardando así mismo en un registro, es lento pero resulta.
ah gracias, pero quisiera que por ejemplo me almacenara un 1, despues un 10 despues un 101 hay forma? pense que era facil que solo lo tenia que incrementar, pero no, por que es otra cifra, no es una suma
 
Disculpa no entiendo bien, corríjeme, quieres que el valor vaya rotando hacia la izquierda? si en el PORTA tienes 10110 no quieres que se transfiera directamente? o quieres que primero guarde 1, luego 10, 101, 1011? explícame mejor.

Saludos.
 
Psyco83 dijo:
Disculpa no entiendo bien, corríjeme, quieres que el valor vaya rotando hacia la izquierda? si en el PORTA tienes 10110 no quieres que se transfiera directamente? o quieres que primero guarde 1, luego 10, 101, 1011? explícame mejor.

Saludos.
jeje como sea, pero que lo haga, suponiendo que tengo en el PORTA 10110 y quiero que guarde 1011 en el registro.

No importa la forma, solo que sea de la manera mas sencilla posible. ops:


Lo que hice es esto:

INICIO RRF PORTA ;Recorre un bit la entrada de porta ej 10111b = 01011b


XORLW 0B ;1011b (ra3,ra2,ra1,ra0)= 0Bh, algo asi como 1011b xor 01011b = 0

;Se xorea los valores, si PORTA = 1011b (0Bh) el resultado logico es 0,
;luego se checa en el bit Z que sea cero.



BTFSC STATUS,2 ;si Z es cero, salta una instruccion, por lo que deberia saltar a la etiquieta de prender o apagar leds, y no salta :(


;Use el numero 2 en lugar de Z por que me decia que Z no estaba definido, aun asi saben en donde lo guarda? o que hay que comparar?

GOTO LED1_VERDE ;Y pues ya aqui me hiba a la etiqueta, cosa que no quiere hacer
 
Esto es lo que llevo del programa:

; /\/\/\/\/\/\/\/\/\/\/\/\/\
;< DEFINICION DE VARIABLES >
; \/\/\/\/\/\/\/\/\/\/\/\/\/


LIST P=PIC16F84A


STATUS EQU 03H

TRISA EQU 05H
PORTA EQU 05H

TRISB EQU 06H
PORTB EQU 06H

#DEFINE BANCO0 BCF STATUS,5
#DEFINE BANCO1 BSF STATUS,5

; /\/\/\/\/\/\/\/\/\/\/\
;< INICIO DEL PROGRAMA >
; \/\/\/\/\/\/\/\/\/\/\/


ORG 00H ;El programa empieza en el principio de la memoria

BANCO1 ;Pasamos al banco 1 para configuraciones

BSF TRISA,0 ;RA0 como entrada
BSF TRISA,1 ;RA1 como entrada
BSF TRISA,2 ;RA2 como entrada
BSF TRISA,3 ;RA3 como entrada


BCF TRISA,4 ;RB4 como salida
BCF TRISB,0 ;RB0 como salida
BCF TRISB,1 ;RB1 como salida
BCF TRISB,2 ;RB2 como salida
BCF TRISB,3 ;RB3 como salida
BCF TRISB,4 ;RB4 como salida
BCF TRISB,5 ;RB5 como salida
BCF TRISB,6 ;RB6 como salida
BCF TRISB,7 ;RB7 como salida

BANCO0 ;Volvemos al banco 0 para que empiece el programa


;\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\MANIAKADA/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\


INICIO RRF PORTA ;Recorre un bit la entrada de porta ej 10111b = 01011b

XORLW 0B ;1011b (ra3,ra2,ra1,ra0)= 0Bh ;Se xorea los valores, si PORTA = 1011b (0Bh)
;el resultado logico es 0,
;luego se checa en el bit Z que sea cero.



BTFSC STATUS,2 ;si Z es cero, salta una instruccion
;BTFSC STATUS,Z ;si Z es cero, salta una instruccion


;\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\END OF MANIAKADA/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\


GOTO APAGAR ;si PORTA es 1011b va a APAGAR, si no prende los focos
BSF PORTA,4 ;RB4 prendido
BSF PORTB,0 ;RB0 prendido
BSF PORTB,1 ;RB1 prendido
BSF PORTB,2 ;RB2 prendido
BSF PORTB,3 ;RB3 prendido
BSF PORTB,4 ;RB4 prendido
BSF PORTB,5 ;RB5 prendido
BSF PORTB,6 ;RB6 prendido
BSF PORTB,7 ;RB7 prendido



GOTO INICIO ;Vuelve otra vez a comprobar el puertoa


APAGAR BCF PORTA,4 ;RB4 apagado
BCF PORTB,0 ;RB0 apagado
BCF PORTB,1 ;RB1 apagado
BCF PORTB,2 ;RB2 apagado
BCF PORTB,3 ;RB3 apagado
BCF PORTB,4 ;RB4 apagado
BCF PORTB,5 ;RB5 apagado
BCF PORTB,6 ;RB6 apagado
BCF PORTB,7 ;RB7 apagado


GOTO INICIO ;Vuelve otra vez a comprobar la entrada del puerto
END ;Fin del programa




;Y pues lo simulo en proteus, y resulta que el led del pin RA4 no enciende, y cuando le meto el 1011 los leds no se apagan, les adjunto la imagen del circuito.
 

Adjuntos

  • circuitkk_592.jpg
    circuitkk_592.jpg
    80.2 KB · Visitas: 334
Tu circuito está muy bien, pero tienes una falla en el programa, primero tienes que adquirir los datos del PORTA, es decir, guardarlos a un registro y de ahi operarlos.

MOVF PORTA,0 ;mueve el registro del puerto A al registro W
MOVWF REG1 ;mueve el registro W al REG1, ahora si puedes operarlos

Corrígeme si me equivoco, rotas el registro a la derecha para descartar el RA4? me parece que estás equivocado pues como tu dices: RA4,RA3,RA2,RA1 y RA0 tendrías que rotarlo hacia la izquierda (corríjanme si me equivoco por favor) claro si el registro PORTA fuera de 5 bits pero como es de 1 byte sería preferible que después de adquirir el dato limpiaras el 4to Bit (BCF REG1,4) es mi humilde opinión ya no me acuerdo muy bien de programar pero te ayudaré en lo que pueda.

Saludos.
 
Psyco83 dijo:
Tu circuito está muy bien, pero tienes una falla en el programa, primero tienes que adquirir los datos del PORTA, es decir, guardarlos a un registro y de ahi operarlos.

MOVF PORTA,0 ;mueve el registro del puerto A al registro W
MOVWF REG1 ;mueve el registro W al REG1, ahora si puedes operarlos

Corrígeme si me equivoco, rotas el registro a la derecha para descartar el RA4? me parece que estás equivocado pues como tu dices: RA4,RA3,RA2,RA1 y RA0 tendrías que rotarlo hacia la izquierda (corríjanme si me equivoco por favor) claro si el registro PORTA fuera de 5 bits pero como es de 1 byte sería preferible que después de adquirir el dato limpiaras el 4to Bit (BCF REG1,4) es mi humilde opinión ya no me acuerdo muy bien de programar pero te ayudaré en lo que pueda.

Saludos.

Ok muchas gracias, esque la verdad no se el orden de como van los RA, por ejemplo ya que copie al REG1 entonces se copia RA4,RA3,RA2,RA1,RA0 entonces me dices que el PORTA tiene 8 bits, entonces seria algo asi como X,X,X,RA4,RA3,RA2,RA1,RA0, y los bits que ocupo entonces serian los de la derecha no los de la izquierda, ok vere que hago muchas gracias.
 
Ya salio!!! :D
A la bestia, eres mi idolo jaja muchas gracias!
Algo asi deje el programa final.

INICIO MOVF PORTA,0 ;mueve el registro del puerto A al registro W
MOVWF REG1 ;mueve el registro W al REG1, ahora si puedes operarlos
BCF REG1,4 ;pone a 0 el bit 4 del REG1 pa q no interfiera
BCF REG1,5 ;de una vez todos
BCF REG1,6
BCF REG1,7

XORLW 0B ;1011b (ra3,ra2,ra1,ra0)= 0Bh
;Se xorea los valores, si PORTA = 1011b (0Bh)
;el resultado logico es 0,
;luego se checa en el bit Z que sea cero.


Solo una ultima duda, el que no quiera prender el led de RA4, es problema del simulador?
 
Hola, sabes estuve revisando el datasheet del PIC16F84A y encontré que el RA4 es una salida de colector abierto y según tu circuito nunca va a encender ese led! Pues bien creeme que los detalles se le pasan a cualquiera y de este recién me entero, ahora entiendo por que no me salieron varios proyectos y pensé que quizá había venido una remesa de PICs con el RA4 dañado como salida pues como entrada funcionaban muy bien (bendito internet en esa época no lo tenía).
Lo que tienes que hacer es conectar así:

RA4-------|<|led-------resistencia----VDD

Creo que así funcionará todo muy bien, de todas maneras pon el programa completo para poder ver si existe otro problema, y me puedes contar qué hace ese circuito? cuál es el uso?

Saludos y de nada.
 
Ah ok, esto se trata de una pulsera que puede dar los estatus de varias cosas, por ejemplo la presion en varios puntos de una tuberia, la pulsera contendra 4 leds, que son de 3 colores, verde, ambar y rojo, osea que funcione inalambricamente, estaba viendo unos integrados que lanzaban radiopaquetes de 8 bits, con 4 de direccion y 4 de datos, pero ahorita no me he metido mucho en ese rollo, quiero que el micro funcione bien primero, ademas pensaba hacerlo de 5 leds, pero como el RA4 es problematico como dices pues, pensaba dejarlo por la paz, pero me acorde que tambien tenia que ser con vibrador, y pues ahora con tu idea, usare el a 4, para que vibre.

Ademas otra duda, tu sabes por que los leds se vuelven locos? Asi en el simulador, como que empiezan asi intermitentes, y luego se quedan prendidos todos.

Aqui te adjunto lo que tengo, el programa en ensamblador y el simulador en un rar.
 

Adjuntos

  • pulsera_bubus_188.rar
    25.5 KB · Visitas: 19
Hola Bubus, te recomendaría que mejor lo construyas en un protoboard ya que tu circuito no es muy complicado (aun) y así lo pruebes. En lo personal no confío en esos simuladores aunque nunca he usado el que comentas, prefiero ir corriendo el asm en el MPLAB ciclo por ciclo y ver que sucede. Bueno te comento que mi pc se averío y perdí mi sistema operativo y mis datos asi que en estos momentos estoy descargando el Mplab para correr tu programa. Estamos en contacto amigo. Me tomará algo de tiempo ya que hace mucho que no cojo este programa, pero por lo poco que vi hay algunas cosas demás en tu asm.

Saludos.
 
Ok gracias, de echo vi que se podian hacer funciones, jaja, pero estoy algo verde creo, y si, lo empezare a probar en el proto jaja.
Saludos.
 
Buenas, queria saber como aplicar acumuladores y contadores en lenguaje ensamblador. Tengo una rutina que se debe repetir 5 veces , luego de esto poner un retardo de 76hs aproximandamente y que vuelva al principio de la rutina. El programa tiene que tocar recreos en determinados horarios de lunes a jueves, despues de esto se debe apagar viernes, sabado y domingo y volver a encenderse el lunes. Mi problema es que mi programa ocupa demasiada memoria y queria aplicar acumuladores para no volver a repetir 5 veces lo mismo. Seria que si la rutina cumple la 5° pasada que haga tal cosa sino que vuelva al principio y repita la rutina hasta llegar a las 5 pasadas. Saludos !
 
Atrás
Arriba