Moderadores: andre_luis, 51, guest2003, Renie
fabim escreveu:aff. mesmo ?
divide por 100 e multiplica por 33,33333333 ?? Daria certo também né ?
BEGIN
{
SOMA=0;
for(j=0;j!=16;j++)
{
i=2**j;
if((SOMA+1/i)<=(1/3))
{
SOMA+=(1/i);
print SOMA,"1/2^"j
}
}
}
void interrupt(void){
if (INTCON.INTF){ // foi int GP0 em borda de descida ? se sim !!
// tempo de demora para acionar mosfet = 10 ciclos em CK 5mhz
_asm BSF GPIO, 0; // liga mosfet do bico
_asm BSF T1CON,0; //T1CON.TMR1ON = 1; liga timer 1
while (!GPIO.GP2){ // enquanto 0 coça o saco..
_asm NOP; }
_asm BCF T1CON,0; //T1CON.INTF = 0; desliga timer 1
_asm MOVF TMR1H, W;
_asm MOVWF _Temp+1; // temp_MSB = TMR1H
_asm MOVF TMR1L, W;
_asm MOVWF _temp+0; //TEMP_LSB = TMR1L
(* agora é a parte fodastica.
Suponha que o tempo do pulso na contagem em LOW é de 17000
não enteressa a quantidade de pulsos o que interessa é 30% ou 1/3 deles acrescidos.
houve que. Quando aconteceu o acionamento da centralina, eu acionei o mosfet no bico, contei quantos pulsos duraram. 18000 EX.
Eu pego 1/3 de 18K = 6K.
menos ciclos que eu demorei para os calculos. 500 ciclos por exemplo.
6K - 500 = 5500. Mantenho o mosfet acionado por mais 5500 ciclos.
Desligo mosfet.!!
Tempo total que o mosfet deixou o bico aberto é de.
18000 + 500 ciclos de calculo + 5500 = 24000 ciclos.
Passando para tempo vem que.
CK=5mhz = 20MHZ/4 .........
1 / 5000 000 = 0,000 000 200. = 200nS
24000 ciclos * 200nS = 4,8mS
Tempo horiginal da centralina é de.
18000 * 200nS = 3,6mS
ou seja eu adicionei 30% a mais de combustivel...
*)
}
INTCON.INTF = 0;
}
Ai eu tive uma ideóta da seguinte forma.
Quando eu acabar de pegar o valor de TIMER1 e jogar no TEMP, que foi o tempo de pulso LOW que a centralina enviou
Zera timer 1H
Zera timer 1L
Liga timer
pega 30% da contagem anterior
desliga timer.
18000 - tempo do calculo que esta no timer + 30% de 18000.
Só que este segundo calculo ja vai ferrar a logica.
por isso que queria uma forma de pegar 1/3 de 16 bits em pucos ciclos.
Fabim
main()
{
unsigned int valor=16000,resultado;
for (;;){
resultado=valor/3;
asm("nop"); //pus break point aqui, 340 ciclos
}
}
lellis escreveu:intendi paul newman.
skece. nestas horas que perdeu tentando fazer em asm, seu concorrente já fez tudo em C num pic de 40+MHz ou dspic e já te comeu.
Fiz pra brincar no mplab uma div16 por 3 e levou ~340uS - 4MHz - pic18F252 - hitech C. Prat o mesmo tempo dos shifts. Pode ser muito msm.
cogite uC + veloz.
- Código: Selecionar todos
main()
{
unsigned int valor=16000,resultado;
for (;;){
resultado=valor/3;
asm("nop"); //pus break point aqui, 340 ciclos
}
}
abs
Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante