Página 1 de 1

Calcular média em assembly no pic16f877a

MensagemEnviado: 29 Out 2010 22:16
por Francys Reymer
Olá pessoal, eu preciso urgente implementar uma função para calcular a média em assembly, porque tipo eu estou com problema na conversão, no proteus aonde o ambiente é perfeito tudo bem não precisaria, mas na prática quando converto um sinal ele apresenta algumas discrepâncias, então, para resolver meu problema pensei no seguinte: converter o sinal umas 4 vezes, somá-los e depois dividir por 4 para obter a média q neste caso ai sim seria mais confiável, portanto quem puder me ajudar agradeço desde já.

MensagemEnviado: 29 Out 2010 22:52
por Sergio38br
Some os sinais e o resultado se for dividir por 4 rotacione 2 vezes pela direita..(para facilitar sempre trabalhe com multiplos de 2)

[ ]`s
Sergio

MensagemEnviado: 29 Out 2010 22:59
por Francys Reymer
Sergio38br escreveu:Some os sinais e o resultado se for dividir por 4 rotacione 2 vezes pela direita..(para facilitar sempre trabalhe com multiplos de 2)

[ ]`s
Sergio


somar eu sei mas como eu faria pra dividir? e pra q rotacionar pra direita?

MensagemEnviado: 29 Out 2010 23:04
por Sergio38br
cada ratocionada pela direita divide por 2, tem um AN da microchip com este calculos matematicos. Veja diversos AN a respeito.

http://www.microchip.com/search/searcha ... e=10&id=26


[ ]`s
Sergio

MensagemEnviado: 29 Out 2010 23:13
por EvandrPic
Francys Reymer escreveu:
Sergio38br escreveu:Some os sinais e o resultado se for dividir por 4 rotacione 2 vezes pela direita..(para facilitar sempre trabalhe com multiplos de 2)

[ ]`s
Sergio


somar eu sei mas como eu faria pra dividir? e pra q rotacionar pra direita?


Rotacionar para direita ou para esquerda significa dividir ou multiplica por 2 tantas vezes forem a rotações feitas.

EXEMPLO:

00001001 = 9
para multiplicar por 2, rotacione para a esquerda e terá:
00010010 = 18

00010011 = 19
para multiplicar por 2, rotacione para a esquerda e terá:
00100110 = 38

Para multiplicar por 4, rotacione 2 vezes para a esquerda.
Para multiplicar por 8, rotacione 3 vezes para a esquerda.
E assim sucessivamente.

Isso é a mesma coisa que você faz na base 10 quando multiplica ou divide por 10. Voce apenas rotaciona os os algarismos, da mesma forma, na base 2 a rotação para a esquerda ou para a direita significa multiplicar ou dividir por 2.

Para dividir é só rotacionar para a direita....

MensagemEnviado: 29 Out 2010 23:43
por Djalma Toledo Rodrigues
As Instruções são :

RLF ----> Rotate Left f through Carry

RRF ----> Rotate Righ f through Carry

Como não há Instrução Rotate sem Carry, se faz necessario antes limpar o Carry

DJ

MensagemEnviado: 04 Nov 2010 11:24
por Jozias del Rios
Quando somando dois números de 8 bits pretendendo dividir por dois o resultado, a forma correta deve levar em consideração os bits que seriam perdidos, para que seja feito o arredondamento

Por exemplo: somar 0x01 com 0x01 e dividir o resultado por 2 teria que dar 0x01. Mas se começarmos essa conta de média aritmética primeiro dividindo 0x01 por 2, então a resposta final será 0x00 por truncamento das parcelas.

Deve-se aproveitar o carry-out da operação de adição para a futura operação de divisão por 2...

Código: Selecionar todos
; assumindo que cada valor tem 8 bits significativos

; calculando value2' = (value1+value2)/2
movfw value1
addwf value2, f
rrf value2, f

; calculando value4' = (value3+value4)/2
movfw value3
addwf value4, f
rrf value4, f

; calculando value4'' = (value2'+value4')/2
movfw value2
addwf value4, f
rrf value4, f

; neste momento, value4'' = (value1+value2+value3+value4)/4