Sobre contador de 16 bit
3 participantes
Página 1 de 1.
Sobre contador de 16 bit
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
saludos
yordan
yeestrada- Participante
- Mensajes : 10
Fecha de inscripción : 20/03/2011
Re: Sobre contador de 16 bit
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:
Creo que van por ahí los tiros.
Saludos.
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.
entiendo ... pero...
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
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
- Mensajes : 10
Fecha de inscripción : 20/03/2011
Re: Sobre contador de 16 bit
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.
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.
Re: Sobre contador de 16 bit
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
- Mensajes : 27
Fecha de inscripción : 18/04/2010
logre hacerlo
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
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
- Mensajes : 10
Fecha de inscripción : 20/03/2011
Re: Sobre contador de 16 bit
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.
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.
si pero...
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
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
- Mensajes : 10
Fecha de inscripción : 20/03/2011
Temas similares
» Encuesta sobre videos de instalación y programación de microcontrolador ATmega32U4 sobre una caja Linux
» Tiny Pic Bootloader
» PIC-GCC y GNU autotools
» Redireccionamiento del printf
» como compilar piklab, pikloops y pk2cmd para programar con pickit 2
» Tiny Pic Bootloader
» PIC-GCC y GNU autotools
» Redireccionamiento del printf
» como compilar piklab, pikloops y pk2cmd para programar con pickit 2
Página 1 de 1.
Permisos de este foro:
No puedes responder a temas en este foro.