TODOPIC
Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: electronicos en 09 de Enero de 2013, 11:59:53
-
Hola a todos, como buén principiante estoy enredado en la lógica del planteamiento (eso creo) mi problema es el siguiente: debo realizar un simple contador en el cual cuando apreto un boton, (portA,4) por el port B comience a contar (en binario) desde 0000 0000 hasta llenar sus 8 bits, es decir, cuando el port b llegue a 1111 1111 este vuelva a cero y por el port A comience a contar desde el 1, o sea, a la salida del pic con sus dos ports quedaría 0000 0000 1000, cuando se llene el port b, entonces el port A incrementa en 1 y quedaría 0000 000 0100, bueno y así hasta completar 12 bits.
Lo que tengo hecho es lo siguiente:
list p=16f84a
#include <P16F84A.INC>
;----------------------------------------
reg1 equ 0x0c
reg2 equ 0x0d
cont equ 0x0e
Dato_L equ 0x0f
cont2 equ 0x10
org 0x00
goto inicio
inicio bsf STATUS,5
clrf TRISB
movlw b'11111000'
movwf TRISA
bcf STATUS,RP0
; clrf PORTA
;-----------------Lee en la EEprom----------------
movlw 0x01
movwf EEADR
bsf STATUS,5
bsf EECON1,RD
nuevo
btfsc EECON1,0
goto nuevo
bcf STATUS,5
movf EEDATA,W
movwf cont
;-----------------------------------------------------
movf cont,W
movwf PORTB
;----------------------------------------------------
otra
btfsc PORTA,3
goto otra
clrf reg1
clrf reg2
bucle
decfsz reg1,F
goto bucle
decfsz reg2,F
goto bucle
incf cont,F ;desde esta línea
movlw 0xFF ;
sublw cont
btfss STATUS,Z ;el resultado fué uno??
incf cont2,F
movwf PORTB
movf cont2,W;
movwf PORTA ;hasta esta, creo que tengo el error
;--------------------------Escribe en la EEprom---------------------------------------
bcf STATUS,5
movlw 0x01
movwf EEADR
movf cont,W
movwf EEDATA
bsf STATUS,5
bsf EECON1,2
movlw 0x55
movwf EECON2
movlw 0xaa
movwf EECON2
bsf EECON1,1
nuevo2
btfsc EECON1,1
goto nuevo2
bcf STATUS,5
goto otra
;--------------------------------------------------------------
end
El programa no esta completo, también tengo que decrementar, y grabar y leer en la eeprom, pero primero debo sacar el incremento.
Espero que un buen experto de los excelentes que hay en este foro, me pueda dar una manito para solucionar el problema.
Muchas gracias
-
Hola, creo que podrias emplear la instruccion INCFSZ
es decir, incrementas el registro, y salta si llega a cero... y esto justamente ocurre cuando superas el valor decimal 255 (1111 1111)
entonces, si esto ocurre, al saltar, incrementas al PORTA :mrgreen:
ademas, puedes emplear directamente a los puertos como registro de cuentas, y evitas de mover los resultados.. se entiende?
incfsz PORTB,F
GOTO A DONDE SEA QUE SIGUE EL PROGRAMA
INCF PORTA,F ; SI supero la cuenta del porb, incremento la salida del porta...
-
Hola, muchas gracias por tu respuesta, después de mucho buscar por la web, siempre llegaba aquí, a todopic.
Bueno hice los cambios a mi programa como me indicastes y funciona de maravillas, lo acorté para realizar los cambios y funciona, gracias de nuevo. Ahora sólo me queda agregar un boton para ir atrás, y grabar el dato en la eeprom.
Bueno, en realidad, será usado con un 16F877A, el 16F84A lo usé sólo para probar en el Proteus.
javascript:void(0);
Dejo el código para quien le pueda servir.
list p=16f84a
#include <P16F84A.INC>
;----------------------------------------
reg1 equ 0x0c
reg2 equ 0x0d
cont1 equ 0x0e
cont2 equ 0x0f
org 0x00
goto inicio
inicio bsf STATUS,5
clrf TRISB
movlw b'11111000'
movwf TRISA
bcf STATUS,RP0
clrf PORTA
clrf PORTB
;---------------------------------------------------
otra
btfsc PORTA,3 ;pregunto si tecla es oprimida
goto otra ;nop, entonces sigo esperando tecla oprimida
clrf reg1 ;si, hay tecla oprimida y limpio reg1
clrf reg2 ;y reg2 para iniciar un delay
bucle
decfsz reg1,F ;comienza delay
goto bucle ;y sigue
decfsz reg2,F ;.........
goto bucle ;..........
;----------------------------------------------------------------------------------------------------------------------------------------
incfsz PORTB,F
GOTO label1
INCF PORTA,F ; SI supero la cuenta del porb, incremento la salida del porta...
label1
goto otra
;--------------------------------------------------------------
end
-
puedes hacer el goto label1, y label1 goto otra... directamente colocando GOTO OTRA ;-)
incfsz PORTB,F
GOTO OTRA
INCF PORTA,F ; SI supero la cuenta del porb, incremento la salida del porta...
-
Gracias de nuevo, bueno, viendo el programa, es clara la redundancia, pero sabes que?
me queda un problema, como estoy trabajando directamente con las puertas, como hago para almacenar
su valor en la eeprom? se pueden cargar en el cont1 y cont2 así nada más?
es decir:
------------------
movf portb.w
movwf cont1
movf porta,w
mowf cont2
-----------------
lo estoy probando, pero no funciona
Saludos cordiales
-
Si, eso tiene que andar perfectamente.. creo que no te funciona porque PORTA y B estan en minuscula...
luego, para restar, podrias hacer similar... con la instruccion DECFSZ
DECFSZ PORTB
goto .....
decf PORTA,f :mrgreen:
-
Hola todopic, gracias por responder, todo lo que me has indicado me ha funcionado, pero antes te cuento, esta es la segunda vez que escribo este mensaje, ya que en el anterior adjunté el archivo de proteus pero el sistema no lo permitio y parece que perdí lo escrito, no supe como volver, así que todo de nuevo. Bueno, trataré de explicar de nuevo, con el botón de incrementar el sistema cuenta graba y recupera el valor sin problemas, al agregar el segundo botón para decrementar, el sistema definitivamente se pega, si hago un bypass al boton de incrementar y dejo sólo al decrementar ( como está comentado en el código), el sistema decrementa la cuenta, graba en eeprom y muestra el valor guardado. He pasado muchas horas tratando de entender y revisar el código, pero no funciona con los dos botones, me imagino que no doy con la lógica para que funcione. Quisiera abusar de tu buena voluntad y si me pudieras indicar alguna posible solución al tema, te quedaría muy agradecido.
Saludos cordiales.
código:
list p=16f84a
#include <P16F84A.INC>
;----------------------------------------
reg1 equ 0x0c
reg2 equ 0x0d
cont1 equ 0x0e
cont2 equ 0x0f
org 0x00
goto inicio
inicio bsf STATUS,5
clrf TRISB
movlw b'11111100'
movwf TRISA
bcf STATUS,RP0
clrf PORTA
clrf PORTB
clrf cont1
clrf cont2
;-----------------Lee en la EEprom 1er dato----------------
movlw 0x01
movwf EEADR
bsf STATUS,5
bsf EECON1,RD
nuevo
btfsc EECON1,0
goto nuevo
bcf STATUS,5
movf EEDATA,W
movwf cont1
;-----------------------------------------------------
movf cont1,W
movwf PORTB
;----------------------------------------------------
;-----------------Lee en la EEprom 2o dato----------------
movlw 0x02
movwf EEADR
bsf STATUS,5
bsf EECON1,RD
nuevo1
btfsc EECON1,0
goto nuevo1
bcf STATUS,5
movf EEDATA,W
movwf cont2
;-----------------------------------------------------
movf cont2,W
movwf PORTA
goto otra2 ; aquí bypass el código para bajar cuenta
;----------------------------------------------------tecla para subir cuenta----------------------
otra1
btfss PORTA,3 ;pregunto si tecla es oprimida
goto otra1 ;nop, entonces sigo esperando tecla oprimida
clrf reg1 ;si, hay tecla oprimida y limpio reg1
clrf reg2 ;y reg2 para iniciar un delay
bucle1
; decfsz reg1,F ;comienza delay bypass el delay para efecto de simul en proteus
; goto bucle ;y sigue
; decfsz reg2,F ;.........
; goto bucle ;..........
incfsz PORTB,F
goto label1
INCF PORTA,F ; SI supero la cuenta del porb, incremento la salida del porta...
movf PORTA,W
label1
movf PORTB,W
movwf cont1
movf PORTA,W
movwf cont2
;----------------------------------------------------------------------------------------------------------------------------
;--------------------------------------------------------tecla para bajar cuenta----------------------------------------------
otra2
btfsc PORTA,2 ;pregunto si tecla es oprimida
goto otra2 ;nop, entonces sigo esperando tecla oprimida
clrf reg1 ;si, hay tecla oprimida y limpio reg1
clrf reg2 ;y reg2 para iniciar un delay
bucle2
; decfsz reg1,F ;comienza delay bypass el delay para efecto de simul en proteus
; goto bucle ;y sigue
; decfsz reg2,F ;.........
; goto bucle ;..........
decfsz PORTB,F ;disminuyo portB
goto label2 ;si no es cero, voy al label2
DECF PORTA,F ; SI la cuenta del porb llega a cero , decremento la salida del porta...
movf PORTA,W ;y lo saco por portA
label2
movf PORTB,W ;recupero el valor4 en portB
movwf cont1 ;y lo guardo en cont1
movf PORTA,W ;recupero valor en portA
movwf cont2 ;y lo guardo en cont2
;--------------------------Escribe en la EEprom 1er dato---------------------------------------
bcf STATUS,5
movlw 0x01
movwf EEADR
movf cont1,W
movwf EEDATA
bsf STATUS,5
bsf EECON1,2
movlw 0x55
movwf EECON2
movlw 0xaa
movwf EECON2
bsf EECON1,1
nuevo3
btfsc EECON1,1
goto nuevo3
bcf STATUS,5
;--------------------------Escribe en la EEprom 2 dato---------------------------------------
bcf STATUS,5
movlw 0x02
movwf EEADR
movf cont2,W
movwf EEDATA
bsf STATUS,5
bsf EECON1,2
movlw 0x55
movwf EECON2
movlw 0xaa
movwf EECON2
bsf EECON1,1
nuevo4
btfsc EECON1,1
goto nuevo4
bcf STATUS,5
;--------------------------------------------------------------
label goto otra2
;--------------------------------------------------------------
end
-
Estimado todopic: finalmente encontré las solución a mi problema, y el programa funciona perfectamente como yo lo necesito,
nuevamente gracias por tu colaboración, me ayudó no sólo a realizar mi programa, si no que, y lo más valioso, aprendí mucho más y me siento más seguro al escribir código. Gracias y bendiciones, realizan un estupendo trabajo.
Saludos cordiales
-
Hola Electronicos, gracias por tus agradecimientos! ;-)
me alegro que ya te funciona bien tu programa...
algunas mejoras, para que el programa sea mas legible y estrcturado..
define los pulsadores... debajo de los EQU de la siguiente forma
#DEFINE PULSADOR_SUMA PORTA,3
#DEFINE PULSADOR_RESTA PORTA,2
Entonces, en tu programa, en lugar de escribir
btfss PORTA,3 ;pregunto si tecla es oprimida
lo reemplazas por
BTFSS PULSADOR_SUMA
¿se entiende?
Luego, yo colocaria los programitas de grabación y lectura de la eeprom, como subrutinas... las llamas con CALL (y el nombre que le des a la subrutina.. y esta, debe terminar con RETURN) :mrgreen:
Suerte!
Norberto