Microcontroladores PIC en Linux.
¿Quieres reaccionar a este mensaje? Regístrate en el foro con unos pocos clics o inicia sesión para continuar.

Sobre contador de 16 bit

3 participantes

Ir abajo

Sobre contador de 16 bit Empty Sobre contador de 16 bit

Mensaje por yeestrada Dom 20 Mar 2011 - 15:40

Hola a todos, soy novato en el tema de programación de pics con asm y resulta que en estos momentos me encuentro trabajando con un pic16f877a y necesito crear una variable de 16 bit (aun no se bien como hacerlo) en la cual pondré un valor de 16 bit entrado por tx serie. Una vez realizada esta acción debo ir decrementando esa variable hasta que llegue a 0. Esto debo hacerlo con asm. Por favor si alguien sabe como hacerlo, se los voy a agradecer que me ayuden.

saludos
yordan

yeestrada
Participante
Participante

Mensajes : 10
Fecha de inscripción : 20/03/2011

Volver arriba Ir abajo

Sobre contador de 16 bit Empty Re: Sobre contador de 16 bit

Mensaje por Pikitin Lun 21 Mar 2011 - 0:19

Una variable de 16 bits propiamente dicha no vas a poder, pero puedes arreglártela con dos de 8 bits.

Por ejemplo puedes crear dos variables, una para el byte "bajo" y otra para el alto; para decrementar, restas 1 al byte bajo, si el resultado es menor que 0 restas 1 al byte alto y ya está.

Por ejemplo:
Código:

variable_L  EQU 20      ; byte bajo
variable_H  EQU 21      ; byte alto
...
...

RESTA_1
   movlw   1
   subwf   variable_L,F
   btfss   STATUS,C      ;Si la resta < 0 osea STATUS,C=0 resta 1 al byte alto
   subwf   variable_H,F
   return


Creo que van por ahí los tiros.


Saludos.

Pikitin
veterano
veterano

Mensajes : 623
Fecha de inscripción : 26/11/2008

http://linuxmicros.blogspot.com/

Volver arriba Ir abajo

Sobre contador de 16 bit Empty entiendo ... pero...

Mensaje por yeestrada Lun 21 Mar 2011 - 20:30

Hum... buena solución, pero realmente no me resuelve lo que necesito, quizas esta mal explicado por mi parte...

lo que sucede es que estoy recibiendo valores por tx serie
asumamos que recibí lo siguiente:

31h, 35h, 34h, 32h -> 1542

una vez que les resto 30h ya tengo los numeros en variables diferentes:

millar = 1
centena = 5
decena = 4
unidad = 2

pero como dije las tengo en variables separadas, ahora, como me dijeron el pic16f877a no trabaja con variables de 16 bit, por lo que tengo que lograr poner ese número en 2 variables de 8 bit, pues mi intención es comenzar a decrementar el mil quinientos cuarenta y dos (1542) hasta llegar a 0. Donde radica el problema, en que no se como poner ese número que se forma (1542) en 2 vaiables de 8 bit, pues puede ser cualquier número entre 0 y 2000 el que me llegue por el puerto y no solo 1542 como en este ejemplo.
espero haberme hecho entender, realmente necesito de su ayuda

saludos
yordan

yeestrada
Participante
Participante

Mensajes : 10
Fecha de inscripción : 20/03/2011

Volver arriba Ir abajo

Sobre contador de 16 bit Empty Re: Sobre contador de 16 bit

Mensaje por Pikitin Lun 21 Mar 2011 - 21:50

Ya entiendo... el caso es que pasar a dos variables de 8 bits puede ser algo lioso... pero si solo lo necesitas para el contador, creo que lo mas facil es conservar ese formato de 4 digitos e ir decrementando en "decimal", osea hacer algo así:

unidad = unidad - 1
si unidad < 0 entonces unidad = 9; decenas = decenas - 1
si decena < 0 entonces decena = 9; centena = centena - 1
si centena < 0 entonces centena = 9; millar = millar - 1
si millar = 0 entonces fin

Lo que pasa es que la rutina de decremento es más complicada que con dos bytes, pero pasar esos cuatro valores a dos bytes puede ser un verdadero lío en asm, porque incluiría multiplicaciones y divisiones; si yo lo tuviera que hacer, haría un programita en GcBasic lo compilaría y copiaría el código asm necesario, algo tan facil en Basic como:

dim variable_16bit as word

variable_16bit = unidades + decena*10 + centena*100 + millar * 1000

Pero nosé... yo casi me quedaría con el método de conservar los 4 valores recibidos y hacer el decremento en "decimal"


Saludos.

Pikitin
veterano
veterano

Mensajes : 623
Fecha de inscripción : 26/11/2008

http://linuxmicros.blogspot.com/

Volver arriba Ir abajo

Sobre contador de 16 bit Empty Re: Sobre contador de 16 bit

Mensaje por WaRaW Mar 22 Mar 2011 - 1:22

pues si ya te llegan las 4 numeros(unidades, decenas, centellas, unidad de millar) y si puedes identificar a cada uno como tal y asignarlos en las variables que propongo en el codigo, tal vez puedas usar este codigo para decrementarlo a cero, aunque finalmente la logica es como la ha descrito pikitin....por cierto no tengo instalado mplab ni nada para revisar el codigo y con las prisas lo he escrito directo, asi que puede tener error de sintaxis u otros, igualmente si alguien tiene una solucion mas simple seria interesante para comparar...

Código:
unidad  EQU 20
decena  EQU 21
centena EQU 22
u_millar EQU 23

...
...

Resta
   decfsz   unidad, f
   return
   decfsz   decena, f
   goto Rdecena
   decfsz   centena, f
   goto Rcentena
        decfsz  u_millar, f
   goto Rmillar
   goto XXXXX; en este punto u de millar es cero

Rdecena
   movlw .9
   movwf unidad
   goto XXXXX; ir al inicio o a la rutina de espera de evento
Rcentena
   movlw .9
   movwf decena
   goto XXXXX;ir a la inicio o a la rutina de espera de evento
Rmillar
   movlw .9
   movwf centena
   goto XXXXX; ir al inicio o a la rutina de espera de evento

WaRaW
Participante
Participante

Mensajes : 27
Fecha de inscripción : 18/04/2010

Volver arriba Ir abajo

Sobre contador de 16 bit Empty logre hacerlo

Mensaje por yeestrada Mar 22 Mar 2011 - 4:41

Miren, logré hacer una rutina que me trabaja bastante bien, lo unico malo es que me cuenta siempre 1 vez de más, miren a ver si pueden perfeccionar mi rutina. trabaja tomando los dos valores superiores en una var de 8 bit y los 2 inferiores en otra, decremento la inferior hasta cero y luego decremento la superior y pongo la inferior en 99 para volver a descontar hasta cero. Una vez que acaba de descontar ambas variables da a la variable fin_cont el valor de 0x11111111

ej: 1543
contH =15
contL =43

gracias
yordan

;-------------------------subrutina----------------------------
variable contH =.20
variable contL =.21
variable fin_cont = .22

decrementa
movlw .1
subwf contL
btfsc STATUS,C
goto fin
subwf contH
btfss STATUS,C
goto end_decrementa
movlw .99
movwf contL
goto fin
end_decrementa
movlw 0x11111111
movwf fin_cont
fin
return

yeestrada
Participante
Participante

Mensajes : 10
Fecha de inscripción : 20/03/2011

Volver arriba Ir abajo

Sobre contador de 16 bit Empty Re: Sobre contador de 16 bit

Mensaje por Pikitin Mar 22 Mar 2011 - 20:10

Creo que la condicion para llegar al final de la cuenta debería ser: contH=0, quizás algo así:


ej: 1543
contH =15
contL =43

gracias
yordan

;-------------------------subrutina----------------------------
variable contH =.20
variable contL =.21
variable fin_cont = .22

decrementa
movlw .1
subwf contL
btfsc STATUS,C
goto fin
subwf contH
btfsc STATUS,Z ;................ comprobar si bit Z es cero
goto end_decrementa ;........ si Z = 1 el resultado fue cero: fin de la cuenta
movlw .99
movwf contL
goto fin
end_decrementa
movlw 0x11111111
movwf fin_cont
fin
return



Saludos.

Pikitin
veterano
veterano

Mensajes : 623
Fecha de inscripción : 26/11/2008

http://linuxmicros.blogspot.com/

Volver arriba Ir abajo

Sobre contador de 16 bit Empty si pero...

Mensaje por yeestrada Mar 22 Mar 2011 - 20:49

si, pero entonces no te funciona si el valor decimal es 0
por ejemplo:

ej: 1500
contH =15
contL =00

nunca entra en la condición si lo pones a preguntar por el bit Z en ves del bit C.

la solución esta en antes de entrar en el ciclo de decrementar, decrementas una vez, es decir antes de entrar en el ciclo llamas a la rutina una vez, y resuelto el problema


yeestrada
Participante
Participante

Mensajes : 10
Fecha de inscripción : 20/03/2011

Volver arriba Ir abajo

Sobre contador de 16 bit Empty Re: Sobre contador de 16 bit

Mensaje por Contenido patrocinado


Contenido patrocinado


Volver arriba Ir abajo

Volver arriba

- Temas similares

 
Permisos de este foro:
No puedes responder a temas en este foro.