contador de eventos

Enviado:
25 Jun 2016 12:02
por Vonnilmam
Bom dia aos amigos.
Rapaziada, olha eu aqui denovo.
Me ajudem a resolver um probleminha, por favor:
Eu tenho dois porte no pic18f4520,
PORT B e PORTD, como eu faço para criar uma rotina que consta de um contador, que vai contar de 0 até 15, eu quero que enquanto a contagem estive entre 0 e 7, joga-se no PORTB nivel 1 em todos os pinos e quando passar de 8 até 15, joga-se nivel 1 em todos os pinos do PORTD...
Já rachei minha cuca e não consegui desenvolver o raciocínio.
O jeito de interpretar Assembler é completamente diferente de C...tô perdidinho...
Peço a paciência de vocês, e muito obrigado.
Re: contador de eventos

Enviado:
25 Jun 2016 12:20
por denis
Imagino que seja isso.
Troque os PORT's pelo seu equivalente.
Acho que dá pra otimizar.
- Código: Selecionar todos
if ((contador >= 0) && (contador <= 7))
{
PORTB(0xFF);
PORTD(0x00);
}
else if ((contador >= 8) && (contador <= 15))
{
PORTB(0x00);
PORTD(0xFF);
}
Re: contador de eventos

Enviado:
25 Jun 2016 13:02
por Vonnilmam
Olá Denis.
É isso mesmo, funcionou perfeitamente, muito obrigado.
Re: contador de eventos

Enviado:
25 Jun 2016 18:00
por xultz
Eu não sei como o compilador otimiza a comparação
if ((contador >= 0) && (contador <= 7))
mas uma maneira bem a lá assembly é fazer uma operação lógica. Sabendo que o bit 3 da variável tem valor 0 entre 0 e 7 e tem valor 1 entre 8 e 15 (e contando que ele nunca passa de 15), poderia fazer
- Código: Selecionar todos
if( contador & 0x08 ) // O if é executado toda vez que o resultado dentro do () é diferente de zero
{
PORTB(0x00);
PORTD(0xFF);
}
else
{
PORTB(0xFF);
PORTD(0x00);
}
Re: contador de eventos

Enviado:
25 Jun 2016 22:26
por KrafT
Só para complicar a vida do Vonnilmam: Sempre dá para fazer diferente...
- Código: Selecionar todos
switch(Contador){
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
PORTD=0x00;
PORTB=0xFF;
break;
case 8:
case 9:
case 10:
case 11:
case 12:
case 13:
case 14:
case 15:
PORTB=0x00;
PORTD=0xFF;
break; //Tem compilador que reclama se não tiver esse break.
}
Ou:
- Código: Selecionar todos
const uint8_t Zueira[]={0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255};
PORTD=Zueira[Contador];
PORTB=!PORTD;
Ou:
- Código: Selecionar todos
if(Contador&0x0F)PORTD=0;
else PORTD=255;
PORTB=!PORTD;
Tem o operador ternário, e por aí vai...
Não testei nada das bobagens que escrevi acima, podem haver erros e coisas dependentes da arquitetura e compilador que provavelmente não funcionariam de primeira na tua aplicação. Mas como é só para descontrair, já que o tópico já está respondido, tá valendo.
Re: contador de eventos

Enviado:
26 Jun 2016 11:26
por xultz
Se tiver certeza absoluta que contador vai sempre de 0 a 15 e nunca passa de 15
- Código: Selecionar todos
if(contador >> 3)
{
PORTD = 0xFF;
PORTB = 0x00;
}
else
{
PORTD = 0x00;
PORTB = 0xFF
}
Porém, se não tiver esta certeza:
- Código: Selecionar todos
if( (contador >> 3) & 1)
{
PORTD = 0xFF;
PORTB = 0x00;
}
else
{
PORTD = 0x00;
PORTB = 0xFF
}
Re: contador de eventos

Enviado:
26 Jun 2016 12:42
por Vonnilmam
Obrigado a todos os exemplos, foram de muita utilidade.
Desse jeito vocês deixam o veinho vonnilmam com vergoinha...rsss
