contador de eventos

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

contador de eventos

Mensagempor Vonnilmam » 25 Jun 2016 12:02

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.
VonNilmam "Assembler" e agora "C"
Avatar do usuário
Vonnilmam
Byte
 
Mensagens: 446
Registrado em: 19 Out 2006 14:25
Localização: espacial

Re: contador de eventos

Mensagempor denis » 25 Jun 2016 12:20

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);
}
denis
Byte
 
Mensagens: 257
Registrado em: 06 Mar 2007 12:29
Localização: Americana - SP

Re: contador de eventos

Mensagempor Vonnilmam » 25 Jun 2016 13:02

Olá Denis.


É isso mesmo, funcionou perfeitamente, muito obrigado.
VonNilmam "Assembler" e agora "C"
Avatar do usuário
Vonnilmam
Byte
 
Mensagens: 446
Registrado em: 19 Out 2006 14:25
Localização: espacial

Re: contador de eventos

Mensagempor xultz » 25 Jun 2016 18:00

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);
}
98% das vezes estou certo, e não estou nem aí pros outros 3%.
Avatar do usuário
xultz
Dword
 
Mensagens: 3001
Registrado em: 13 Out 2006 18:41
Localização: Curitiba

Re: contador de eventos

Mensagempor KrafT » 25 Jun 2016 22:26

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.
"..."Come to the edge," he said. And so they came. And he pushed them. And they flew."― Guillaume Apollinaire
Avatar do usuário
KrafT
Dword
 
Mensagens: 2228
Registrado em: 11 Out 2006 14:15
Localização: Blumenau -SC

Re: contador de eventos

Mensagempor barboza » 25 Jun 2016 23:35

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;
Os homens mentiriam muito menos se as mulheres fizessem menos perguntas.
Avatar do usuário
barboza
Word
 
Mensagens: 948
Registrado em: 17 Out 2006 13:42
Localização: Longe de onde gostaria de estar

Re: contador de eventos

Mensagempor xultz » 26 Jun 2016 11:26

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
}
98% das vezes estou certo, e não estou nem aí pros outros 3%.
Avatar do usuário
xultz
Dword
 
Mensagens: 3001
Registrado em: 13 Out 2006 18:41
Localização: Curitiba

Re: contador de eventos

Mensagempor Vonnilmam » 26 Jun 2016 12:42

Obrigado a todos os exemplos, foram de muita utilidade.

Desse jeito vocês deixam o veinho vonnilmam com vergoinha...rsss

:oops:
VonNilmam "Assembler" e agora "C"
Avatar do usuário
Vonnilmam
Byte
 
Mensagens: 446
Registrado em: 19 Out 2006 14:25
Localização: espacial


Voltar para PIC

Quem está online

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

x