TODOPIC
Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: Vangeluz en 13 de Septiembre de 2013, 02:45:51
-
Hola q tal de nuevo. Gracias a todos por brindarme ayuda pude avanzar muchisimo, en mis proyectos y experimentos,
aunque aun me falta muchisimo mas , ahora tengo una inquietud a la hora de comparar 2 datos guardados en la EEPROM
Tengo un contador de 3 digitos de 7 segmentos ( Unidades, decenas y centenas ).
Al mismo le coloque un guardado en la EEPROM de cada valor de display a medida que incrementa en cada pulso.
Osea en la posicion 00h de la EEPROM unidades, en 01h Decenas y en 02h Centenas.
Al iniciar el micro testea las tres posiciones guardadas anteriormente, las visualiza y continua el conteo.
Funciona correctamente, tanto al guardar, como al contar, como al iniciar de la cuenta guardada.
He usado lo siguiente:
PARA GUARDAR
clrf eeadr ;Guarda el conteo de unidades en la eeprom POSICION 0
etc .....
incf eeadr,1 ;Guarda el conteo de decenas en la eeprom POSICION 1
etc....
incf eeadr,1 ;Guarda el conteo de centenas en la eeprom POSICION 2
etc....
Para leer use las mismas.
Ahora quisiera entrar en una rutina de programacion, con un boton y agregar Unidades, Decenas y Centenas a unas nuevas 3 POSICIONES de la EEPROM.
Osea guardar en las POSICIONES 03h, 04h y 05h 3 valores, que al llegar el conteo a esos valores guardados genere otra rutina de corte o algo por el estilo.
Ya tengo la rutina del boton, asi mismo el guardado en las ultimas 3 posiciones, pero no se como comparar los valores.
Para que quede claro seria algo asi:
Valores guardados por conteo en POSICIONES (00h Unidades) (01h Decenas) (02h Centenas)
Valores guardados por programacion en POSICIONES (03h Unidades) (04h Decenas) (05h Centenas)
Comparar valor de Posiciones (00h con 03h), (01h con 04h) (02h con 05h)
O para hacerlo mas sencillo comparar unidad programada con unidad de conteo y asi mismo con las decenas y centenas y como consecuencia saltar a otra rutina, caso contrario seguir contando.
Desde ya muchas gracias por darme una manito !!!!
-
De primera intención yo sugeriría que copiaras a RAM los valores de referencia que son aquellos con los que quieres que la cuenta se compare.
Ciertamente podrías hacerlo contra la EEPROM pero se me hace un esfuerzo excesivo por tanta transferencia de datos además de que los cambios de bancos de memoria eventualmente te harán copiar los datos a RAM aunque sea temporalmente.
Si lo que quieres hacer es un corte a longitud o similar que requiera precisión no te sugiero que lo hagas de esa manera.
La EEPROM está hecha para respaldar información pero dudo que para ser usada directamente en un programa en ejecución por lo complejo de su uso.
Al menos esa es mi opinión.
Un saludo.
-
De primera intención yo sugeriría que copiaras a RAM los valores de referencia que son aquellos con los que quieres que la cuenta se compare.
Ciertamente podrías hacerlo contra la EEPROM pero se me hace un esfuerzo excesivo por tanta transferencia de datos además de que los cambios de bancos de memoria eventualmente te harán copiar los datos a RAM aunque sea temporalmente.
Si lo que quieres hacer es un corte a longitud o similar que requiera precisión no te sugiero que lo hagas de esa manera.
La EEPROM está hecha para respaldar información pero dudo que para ser usada directamente en un programa en ejecución por lo complejo de su uso.
Al menos esa es mi opinión.
Un saludo.
gracias por tu respuesta: lo que intentaba hacer que aun estoy en la prueba seria algo como:
Ejemplo: el numero 111,
yo uso el PORTB como salida y los 8 bits para los 7 segmentos b'00000000'
con lo que lo estoy usando de la siguiente configuracion b'00000000' = b'0gfedcba'
Para el numero 111 deberia poner el PORTB con b'00000110' = ByC, formando el numero 1
Repitiendolo con la multiplexacion en los tres display daria el numero 111
Ahora, cada ( 1 ) esta guardado en su respectiva memoria, 00h, 01h y 02h
Luego lo mismo con los digitos que yo les llamo de programacion en 03h, 04h y 05h.
Ahora lo que yo pensaba hacer es lo siguiente:
En cada incremento pongo lectura a la unidad, poniendo un condicional y si es b'00000110' ( NUMERO 1 ) en la posicion 00h salte a leer la posicion de unidad 03h,
si es igual, pase a la decena 01h, comparar nuevamente el numero 1 con el de la posicion 04h, si es asi saltar a las centenas, y si da igual todo prender un led por ej.
En caso de no dar con un numero de un digito, que quede saltando hasta que llegue...
Espero que se entienda lo que quiero encarar, ya lo tengo casi todo se programa y me da lectura de programacion, guarda los 6 estados, solo falta la comparacion.
Voy a probar con esta secuencia a ver que pasa
-
Por lo que entendí la comparación la estás realizando contra los dígitos del display.
¿No sería más fácil contra los dígitos del contador?
Suerte.
-
¿No sería más fácil contra los dígitos del contador?
Si Vangeluz, creo que tiene razon BBMNet, no creo que sea buena idea guardar la codificacion de los segmentos, ya que si sabes el numero el codigo para enviar al segmento lo tienes en tablas, las tablas entan en memoria de programa que no se te van a borrar ¿No?
-
¿No sería más fácil contra los dígitos del contador?
Si Vangeluz, creo que tiene razon BBMNet, no creo que sea buena idea guardar la codificacion de los segmentos, ya que si sabes el numero el codigo para enviar al segmento lo tienes en tablas, las tablas entan en memoria de programa que no se te van a borrar ¿No?
Si me suena sensillo, pero me hice una bola de posibilidades y me hice una laguna en la cabeza.
Como cabeza dura sigo pensando en comparar por ejemplo las unidades guardadas tanto la que contea, como la programada.
Osea la programada se programa y queda fija esperando que la de conteo llegue a su igualdad.
Pensaba algo asi:
A1 equ 0x0C ; UNIDAD DE CONTEO CADA 1 SEGUNDO
A2 equ 0x0d ; UNIDAD DE PROGRAMACION
movf A2,w ; UNIDAD DE PROGRAMACION
subwf A1,W ;Resta/compara con dato A2
btfsc STATUS,Z ;Son iguales
goto IGUALES ;Si
btfsc STATUS,C ;No. es mayor
goto MAYOR
MENOR
SEGUIR CON LA RUTINA DE CONTEO NORMAL
IGUALES
GOTO LOQUESEA
MAYOR
NO SIRVE, TIRAR EL PIC A LA $%&/ Y DEDICARME A OTRA COSA
Espero me sirva esto ya que no se como seguir .... gracias a todos estoy aprendiendo .... a quemarme la cabeza !!!!
-
Pues creo que si que te servira asi como lo tienes, ponlo en el MPLAB y simulalo, ahi veras si de verdad hace lo que quieres o tienes que cambiar algo, todos tenemos que hacerlo asi, tengamos experiencia o seamos novatos, no queda otra, el MPLAB es el que dicta sentencia :lol: :lol:
-
Muchachos, gracias a todos por su ayuda, al final fui tan cabeza dura que lo pude hacer como queria.
Mis limitados conocimientos me llevaron a hacer esa estupides que dige y quedo perfecto.
Al principio me saltaba siempre, porque tanto la programacion como el conteo arrancaban a 000, cosa que me llevo muchisimas horas ( para no decir dias ) en averiguarlo.
Pero asi se aprende !!!!!, aca dejo como estupidamente lo solucione
A1 = UNIDAD DE CONTEO CONSTANTE
A2 = UNIDAD QUE PROGRAMO PARA QUE CORTE
movlw d'3' ; SELECCIONA LA 4 POSICION DE LA EEPROM
call leer ; LEE EL NUMERO GUARDADO
movwf A2 ; LO PASA AL REGISTRO A2
movf A2,W ;Carga el dato A2
movlw d'0' ; SELECCIONA LA 0 POSICION DE LA EEPROM
call leer ; LEE EL NUMERO GUARDADO
movwf A1 ; LO PASA AL REGISTRO A1
movf A1,W
subwf A2,W ;Resta/compara con dato A1
btfsc STATUS,Z ;Son iguales (Z=1)??
goto igual ; ES IGUAL
btfsc STATUS,C ;No. A mayor que B (C=0)??
goto mayor ;Si ; ES MAYOR
menor ; POR AHORA NO HACE NADA
mayor ; POR AHORA SOLO ESTA DE VAGO
goto seguir
igual
;clrf uni ;Pone a 0 el resultado
bsf ptob,7 ; ENCIENDE UN ESTUPIDO LED
btfss ptoa,3 ;LEE UN ESTUPIDO BOTON QUE LO SACA DE LA RUTINA ESTANCADA
goto $-1 ; QUEDA PAVEANDO !!!
btfsc ptoa,3 ;SE SOLTO EL ESTUPIDO BOTON ?
goto $-1 NOP, ENTONCES QUEDA HUEVEANDO HASTA QUE SAQUE EL DEDO DE EL
goto lectura SI, VUELVE A LA RUTINA INICIAL O A OTRA RUTINA COMPARANDO LAS DECENAS ( ESA ES LA IDEA )
seguir
Y bueno asi culmino mi duda, despues de perder cabello y las pestañas de tantas madrugadas, ahora a seguir con las decenas y centenas.
Muchas gracias a todos !!!!