Página 1 de 1

Dúvida em rotina

MensagemEnviado: 25 Out 2007 08:20
por fender
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

Re: Dúvida em rotina

MensagemEnviado: 25 Out 2007 08:50
por fabim
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.!

MensagemEnviado: 25 Out 2007 09:04
por ze
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??????

MensagemEnviado: 25 Out 2007 09:11
por ze
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??

MensagemEnviado: 25 Out 2007 11:52
por fender
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.

MensagemEnviado: 25 Out 2007 13:08
por ze
- 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?