Dúvida compara maior, menor e igual em 16 bits em ASM

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Dúvida compara maior, menor e igual em 16 bits em ASM

Mensagempor Andre_Cruz » 05 Ago 2009 11:37

Pessoal estou com dificuldade em compara maior, menor e igual em 16 bits, em 8 bits comparo sem problemas mas em 16 bits não estou conseguindo.
Alguém sabe como eu devo fazer ?

Desde ja agradeço a atenção e ajuda.

Abraço
Andre_Cruz
Word
 
Mensagens: 559
Registrado em: 03 Jan 2009 14:06

Mensagempor Djalma Toledo Rodrigues » 05 Ago 2009 12:49

Se for PIC de 8 bits ( Word)

Subtrai os Bytes mais significativos ---> Instrução Subwf fd
Se iguais (Flag Z = 1) o maior é o que possui o Byte menos significativo, maior.
.
Avatar do usuário
Djalma Toledo Rodrigues
Dword
 
Mensagens: 2334
Registrado em: 03 Ago 2008 13:22

Mensagempor Andre_Cruz » 05 Ago 2009 14:04

Djalma não consegui entender o que você disse.

Vou tentar expor meu problema, de maneira mais clara.

Estou programando em assembler, tenho duas variaveis teste_hi e teste_lo a hi parte alta e lo parte baixa do byte, eu preciso comparar se estas duas variaveis são maior, menor ou igual a um valor também em 16 bits.

Para comparar se são iguais, tentei fazer da seguinte forma:

MOVF COMPARA_HI,W
XORWF TESTE_HI,W
BTFSS STATUS,Z ; IGUAIS ?
GOTO MAIN ; NÃO
; SIM
MOVF COMPARA_LO2,W
XORWF TESTE_LO,W
BTFSS STATUS,Z ; IGUAIS ?
GOTO MAIN ; NÃO
; SIM

Aqui eu faço o que devo fazer quando os valores forem iguais.

Alguém pode me ajudar ?

Agradeço a ajuda e a visita de todos.

Abraço
Andre_Cruz
Word
 
Mensagens: 559
Registrado em: 03 Jan 2009 14:06

Mensagempor Djalma Toledo Rodrigues » 05 Ago 2009 15:32

O PIC não tem a Instrução Compare
mas, tem a Instrução Subtria Subwf fd subtrai o Acumulador do Registro F

ou seja F - W e aciona três Flags do Status C DC e Z

(logo um dos Bytes deverá ser préviamente movido para o Acumulador
---> W ) *

Se Flag Z for Setado , igual a 1, W e F são iguais. 5 - 5 = 0

Se C, o Carry, for igual a Zero indica que o resultado da subtração é positivo F > W 9 - 3 = +6

Se C for Setado indica que o resultado da subtração é Negativo,
que F < W ---> 5 - 8 = - 3 em Hex: 05 - 08 = FF...FFFD

Resumindo: Os Flags C e Z indicam: Maior, Menor ou Igual.

Então para 16 bits:
Subtrai os Bytes mais significativos
Se iguais (Flag Z = 1) passa para os Bytes menos significativos já que neste caso
o maior é o que possui o Byte menos significativo, maior.

DC é para notação BCD

Abraço e boa comparação. rs

(*) Adcionado para maior clareza
.
Editado pela última vez por Djalma Toledo Rodrigues em 05 Ago 2009 20:26, em um total de 3 vezes.
Avatar do usuário
Djalma Toledo Rodrigues
Dword
 
Mensagens: 2334
Registrado em: 03 Ago 2008 13:22

Mensagempor Sergio38br » 05 Ago 2009 16:39

qual pic tu ta usando???

[ ]'s
Sergio
Avatar do usuário
Sergio38br
Word
 
Mensagens: 759
Registrado em: 22 Nov 2007 13:39
Localização: São Paulo - SP

Mensagempor Alesandro F Zagui » 05 Ago 2009 17:36

Andre. Poderia explicar com mais detalhes o que voce precisa?

Pelo que eu entendi, voce tem 2 variaveis de 2 bytes e precisa comparar qual é a maior, a menor ou se sao iguais.

Variavel 1:
VAR_1_H e VAR_1_L

Variavel 2:
VAR_2_H e VAR_2_L

Faça os seguintes Passos:

1 - Verifique se VAR_1_H e VAR_2_H são iguais:
Se sim: Passo 2
Se nao: Compare VAR_1_H e VAR_2_H qual é a maior. Nessa comparaçao voce decobre qual variavel é a maior. Pronto.

2 - Verifique se VAR_1_L e VAR_2_L são iguais:
Se sim: As Variaveis sao iguais. Pronto
Se nao: Compare VAR_1_L e VAR_2_L qual é a maior. Nessa comparaçao voce decobre qual variavel é a maior. Pronto
Alesandro Freire Zagui
Alesandro F Zagui
Byte
 
Mensagens: 154
Registrado em: 12 Mai 2009 11:03
Localização: Campo Mourao, Pr

Mensagempor Vonnilmam » 05 Ago 2009 19:09

Vou emitir uma opnião de "leigo"...me perdôem se estiver falando abobrinha...

Eu faria o seguinte: Primeiro faria os testes "enxergando" HI e LO como individualmente registros de 8 bits (testaria a igualdade de um por vez) e colocaria o resultado na variavel correspondente "destino". O mesmo faria para saber se é diferente, ou seja eu faria uma rotina para cada teste, ROTINA: MAIOR_MENOR_QUE, e outra rotina, SE_IGUAL, acionava flags de indicação e sairia da rotina para checar esses flags e tomar as decisões necessarias....

Não sei se consegui me expresar corretamente, ok....mas eu faria assim, além de ficar uma rotina mais clara ela ficaria facil de dar manutenção futura...

Eu fiz um trem deste para saber se um valor era igual, menor ou maior que?...no caso eu pegava o resultado da leitura de um potenciometro e fazia essa checagem (no caso isso serviu como um filtro para o pot, porque em determinadas posições do potenciometro o numero lido fica variando, tipo: 100 e 101 ou 99 e 100, no meu caso eu precisava estabilizar essa leitura)....

Boa sorte,
VonNilmam "Assembler" e agora "C"
Avatar do usuário
Vonnilmam
Byte
 
Mensagens: 446
Registrado em: 19 Out 2006 14:25
Localização: espacial

Mensagempor proex » 05 Ago 2009 20:12

COMPARACAO ENTRE 2 REGISTRADORES DE 16 BITS: RA_HI:RA_LOW, RB_HI:RB_LOW

Compara se RA é maior, igual ou menor que RB

Código: Selecionar todos
compara a parte alta primeiro   
       MOVF     RB_HI,W
       SUBWF    RA_HI,W
       BTFSC    STATUS,Z
       GOTO     BX
       BTFSS    STATUS,C
       GOTO     MENOR
       GOTO     MAIOR

compara a parte baixa
   
BX   MOVLW    RB_LOW,W
     SUBWF    RA_LOW,W
     BTFSC    STATUS,Z
     GOTO     IGUAL
     BTFSS    STATUS,C
     GOTO     MENOR
     GOTO     MAIOR

MENOR  NOP ; pula pra cá se RA for menor que RB
IGUAL  NOP ;; pula pra cá se RA for igual que RB
MAIOR  NOP ;; pula pra cá se RA for maior que RB


.
Editado pela última vez por proex em 05 Ago 2009 20:20, em um total de 1 vez.
proex
Dword
 
Mensagens: 2101
Registrado em: 11 Out 2006 14:05
Localização: São Paulo

Mensagempor Andre_Cruz » 05 Ago 2009 20:12

Sergio38br, estou usando o 12F675.

Alesandro F Zagui, eu preciso comparar 2 bytes se é maior, menor ou igual a um determinado valor.

Este seu algoritmo de comparar a parte alta com a parte alta e a parte baixa com a parte baixa, interessante.

Vou implementar ela, para ver mas acredito que vai resolver o meu problema.

Vonnilmam, sua idéia também é muito boa e organizada, mas no meu caso eu preciso de um programa com execução rápida.

Agradeço a todos a ajuda !

Abraço
Andre_Cruz
Word
 
Mensagens: 559
Registrado em: 03 Jan 2009 14:06

Mensagempor Andre_Cruz » 05 Ago 2009 20:16

proex, quando eu estava respondendo o meu ultimo post, você enviou o codigo que eu precisava, eu estava com dúvida na identificação de bit C e Z do registrador STATUS.

Muito obrigado mesmo, em me ajudar, sou apenas um iniciante (e quem nunca foi) mas precisando de alguma coisa que eu puder ajudar, estarei a disposição.

Muito obrigado pessoal.
Valeww mesmo

Abraço
Andre_Cruz
Word
 
Mensagens: 559
Registrado em: 03 Jan 2009 14:06


Voltar para PIC

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

cron

x