Página 1 de 1

contador de eventos

MensagemEnviado: 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

MensagemEnviado: 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

MensagemEnviado: 25 Jun 2016 13:02
por Vonnilmam
Olá Denis.


É isso mesmo, funcionou perfeitamente, muito obrigado.

Re: contador de eventos

MensagemEnviado: 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

MensagemEnviado: 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

MensagemEnviado: 25 Jun 2016 23:35
por barboza
Mais um exemplo:

Vonnilmam escreveu:
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...



Código: Selecionar todos
    contador++;
    contador &= 0x0F;
   
    PORTB = ((contador & (1<<3)) ? 0x00 : 0xFF);
    PORTD = ~PORTB;

Re: contador de eventos

MensagemEnviado: 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

MensagemEnviado: 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

:oops: