Dúvida em rotina

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Dúvida em rotina

Mensagempor fender » 25 Out 2007 08:20

Pessoal, estou com dúvidas com relação a seguinte rotina em assembly


//o resultado de uma multiplicação de 8 x 8 bits(rotina mpy_F com argumentos: mulplr e mulcnd) é armazenado
//em H_byte & L_byte.

MOVF INTENSIDADE_AQUE,W ; CARREGA INTENSIDADE_AQUE NO WORK
MOVWF mulplr ; CARREGA WORK EM mulplr

MOVLW .10
MOVWF mulcnd ; CARREGA 10d EM mulcnd

CALL mpy_F ; CHAMA ROTINA DE MULTIPLICAÇÃO

SWAPF L_byte,W
ANDLW B'00110000'
IORLW B'00001111'
RRF H_byte,F
RRF L_byte,F
RRF H_byte,F
MOVWF CCP1CON
RRF L_byte,W
MOVWF CCPR1L ; ATUALIZA REGISTRADORES DO DUTY CYCLE
; DO MÓDULO CCP1

Se eu fosse traduzi-la para C, como seria?

Abraços

Humberto
fender
Byte
 
Mensagens: 268
Registrado em: 13 Out 2006 19:31

Re: Dúvida em rotina

Mensagempor fabim » 25 Out 2007 08:50

fender escreveu:
SWAPF L_byte,W
ANDLW B'00110000'
IORLW B'00001111'
RRF H_byte,F
RRF L_byte,F
RRF H_byte,F
MOVWF CCP1CON
RRF L_byte,W
MOVWF CCPR1L


func1:
SWAPF L_byte,W // troca nibles.. 1111 0000 apos.. 0000 1111
ANDLW B'00110000' .. força para fica tudo a 0 menos bit´s4,5
IORLW B'00001111' .. força lsb para 1
func2:
RRF H_byte,F // divide var 16 bits por 2
RRF L_byte,F
func3:
RRF H_byte,F // divide byte hi da var 16 bits por 2
MOVWF CCP1CON // move resultado da func1 para CCP1CON
RRF L_byte,W // divide byte lo da var 16 bits por 2 com carrier de hi
MOVWF CCPR1L // move byte lo para ccpr1L

cara num da pra entender bulhufas do que esse fonte faz. Só pegando a logica de funcionamento para entender.!
Mano, ve só.
Sou responsável pelo que escrevo!!! E não pelo que você entende !!!
fabim
Dword
 
Mensagens: 5001
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?

Mensagempor ze » 25 Out 2007 09:04

multiplicar variável 8 bits por variável 8 bits?? resultado em 16??

unsigned int mult(unsigned char a,unsigned char b)
{
return (unsigned int)a * (unsigned int)b;
}

!!!?????? pode ser??????
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Mensagempor ze » 25 Out 2007 09:11

se quiser passar para o seu H_byte e L_byte (variáveis globais)

void mult(unsigned char a,unsigned char b)
{
unsigned int c;
c=(unsigned int)a * (unsigned int)b;
_L_byte=c;
_H_byte=(c>>8;)
}

será que funciona??
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Mensagempor fender » 25 Out 2007 11:52

Quem tiver o livro Conectando o PIC, pode verificar este trecho de código no útlimo exemplo do livro.

Na prática, esta rotina deverá fazer o seguinte:

- atualizar a variável INTENSIDADE_AQUEC, incrementando-a;
- deverá multiplicá-la por 10;
-atualizar os registradors CCP1CON e CCPR1L

Acho que agora ficou mais entendível.
fender
Byte
 
Mensagens: 268
Registrado em: 13 Out 2006 19:31

Mensagempor ze » 25 Out 2007 13:08

- atualizar a variável INTENSIDADE_AQUEC, incrementando-a;
INTENSIDADE_AQUEC++;
- deverá multiplicá-la por 10;
INTENSIDADE_AQUEC*=10;
-atualizar os registradors CCP1CON e CCPR1L
CCPR1L=(char)INTENSIDADE_AQUEC;
INTENSIDADE_AQUEC>>=8;
CCP1CON=(char)INTENSIDADE_AQUEC;
acho que nem precisa do modificador (char)

who knows?
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32


Voltar para PIC

Quem está online

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

x