Calcular média em assembly no pic16f877a

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Calcular média em assembly no pic16f877a

Mensagempor Francys Reymer » 29 Out 2010 22:16

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á.
Avatar do usuário
Francys Reymer
Byte
 
Mensagens: 102
Registrado em: 10 Dez 2009 15:21

Mensagempor Sergio38br » 29 Out 2010 22:52

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
Avatar do usuário
Sergio38br
Word
 
Mensagens: 759
Registrado em: 22 Nov 2007 13:39
Localização: São Paulo - SP

Mensagempor Francys Reymer » 29 Out 2010 22:59

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?
Avatar do usuário
Francys Reymer
Byte
 
Mensagens: 102
Registrado em: 10 Dez 2009 15:21

Mensagempor Sergio38br » 29 Out 2010 23:04

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
Avatar do usuário
Sergio38br
Word
 
Mensagens: 759
Registrado em: 22 Nov 2007 13:39
Localização: São Paulo - SP

Mensagempor EvandrPic » 29 Out 2010 23:13

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....
EvandrPic
Dword
 
Mensagens: 2116
Registrado em: 31 Mar 2010 15:05

Mensagempor Djalma Toledo Rodrigues » 29 Out 2010 23:43

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
Avatar do usuário
Djalma Toledo Rodrigues
Dword
 
Mensagens: 2334
Registrado em: 03 Ago 2008 13:22

Mensagempor Jozias del Rios » 04 Nov 2010 11:24

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
Os vencedores são aqueles que sabem o que fazer se perderem.
Os perdedores são aqueles que não sabem o que fazer se ganharem.
Avatar do usuário
Jozias del Rios
Byte
 
Mensagens: 279
Registrado em: 31 Out 2009 03:36
Localização: SJCampos-SP


Voltar para PIC

Quem está online

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

x