[AGRADECIMENTOS E DIVULGAÇÃO] *** Desafio Blink minimo ***

Olá Galera,

   Propus dois desafios, diminuir o codigo blink ao mínimo, só que uma versão com delay e outra sem.
    Os resultados estão abaixo, e gostaria de agradecer a todos que participaram do desafio, e me desculpar com aqueles que possa ter esquecido de dar os devidos creditos.

    Tão ai os resultados, isso pode ser bastante útil pra quem desenvolve codigos onde precise colocar leds de indicação de funcionamento, mas precisam diminuir o codigo.



-------------------------------------------------------------------------------

// Blink com delay - codigo minimo ( 5 linhas)
// Sugestão: Weider Duarte - Desenvolvimento: Eduardo Silva

void setup() {
pinMode(13, OUTPUT);}

void loop() {
digitalWrite(13, !digitalRead(13));
delay(1000);}

------------------------------------------------------------------------------

// Blink sem delay - codigo minimo ( 5 linhas)
// Desenvolvimento conjunto:  Jose Augusto Cintra,  odilon Cenamo, Weider Duarte

void setup() {
pinMode(13, OUTPUT);}

void loop() {
if( (unsigned int)(millis() / 1000) / 2 %2 == digitalRead(13)){   
digitalWrite(13,!digitalRead(13));}}

------------------------------------------------------------------------------
obs: obs dá pra tirar a classificação int do blink sem delay, mas a longo prazo o codigo pode ficar instável, porem,  como esta fica tudo ok.

Muito obrigado a todos que participaram do desafio, é isso que torna a comunidade arduino tão incrivel.

valeu, 

Exibições: 606

Responder esta

Respostas a este tópico

E ai ninguem se habilita a bater o desafio ?

Oi WD, bom dia,

pesquisando uma solução para um outro caso, chequei à este código.

É um blink, mas usa delay. (4 linhas)

    void setup()
    {
    }


    void loop()
    {
        PORTB = DDRB = PORTB ^ 0x20;        // Define D13 como ENTRADA/SAÍDA e HIGH/LOW
        delay(500);                                           // Tempo de 500mSeg
    }

Apesar de não gostar de postar código na área de texto, pois a mesma fica muito extensa,

hoje abri uma exceção a mim mesmo porque o code é bem pequeno. kkkk  

Rui

Rui, isso é assembly ?   você esta acessando diretamente os registradores né?   dá pra explicar pra gente cada ponto do seu codigo ?

Oi WD, 

Usando a IDE do arduino.

É o C do arduino, mas acessando diretamente o registrador.

DDB  Controla todos Ports de D8 até D13

DDB 5  = 1  Port13 = Saida   

DDB 5  = 0  Port13 = Entrada  

PORTB  =  Ports Digitais de 8 até 13

PORTB  5  = HIGH ou LOW

                                                D  D  D  D  D  D  D  D

                DIGITAL PORT                 1  1    1  1   

                                                -   -   3  2    1  0  9   8

                            PORTB  Bit   7  6  5  4    3  2  1  0 

PORTB = 0x20  =                      0  0  1  0    0  0  0  0

Sequencia de execução:

PORTB =  DDRB = PORTB ^ 0x20  

          DDRB  =  PORTB = 0000 0000   ExclusieOR  com 0010 0000   --->   = 0010 0000

              então o bit 5 de DDB = 1 = Saída e PORTB 5 = 1  =  HIGH  então  PortD13 Saída e HIGH

  próxima passada

          DDRB  =  PORTB = 0010 0000   ExclusieOR  com 0010 0000   --->   = 0000 0000

              então o bit 5 de DDB = 0 = entrada e PORTB 5 = 0  =  HIGH  então  PortD13 entrada e LOW

Ok

Rui

Desculpe-me, mas não resisti e gostaria de responder a questão do Weider.

O Rui me corrija, se estiver errado.

PORTB É um registrador que controla os pinos 8 a 13 do Arduino, se estão HIGH ou LOW

DDRB é o registrador que controla os pinos 8 a 13 do Arduino se estão configurados como entrada ou saida

O valor 0x20 hexadecimal é igual 00100000 em binário, ou seja ele coloca o o pino 13 como high  e saída. Observe que os dois primeiros bits não são usados.

O operador ^ é o XOR (ou exclusivo). Quando você aplica esse operador com 0x20, ele alterna o pino 13 para 0 e 1, ou seja high e low. Na prática, vai ligar e desligar o led a cada 500 milisegundos.

Mas como, nesse caso não é necessário setar a porta como entrada e saída, poderíamos simplificar a expressão para PORTB =  PORTB ^ 0x20;

Oi JAC< boa tarde,

você está 99% correto.

Mas se não usar DDRB, então terá que ter uma linha para então definir 

o port D13 como saída.

Assim,  PORTB = DDRB = PORTB ^ 0x20; ,  economizei uma linha.

KKKKK

Rui

Boa Rui!

Raciocínio rápido!

2 dúvidas:

1) Na prática esse comando

PORTB =  PORTB ^ 0x20;

É equivalente a:

digitalWrite(13, !digitalRead(13));

Mas o primeiro é mais rápido, pois acessa diretamente o registrador, certo?

2) Se eu não setar o pino 13 como output, vai funcionar ou vai dar erro? Você já testou isso?

Pergunto isso, pois no comando

digitalWrite(13, !digitalRead(13));

o Arduino faz um write e um read no pino 13 que está setado como OUTPUT o tempo todo!!

Oi JAC, boa noite,

1)  Sim é equivalente e muito mais rápido.

2) Se você não definir o pino como saída  ele fica como entrada.

   Eu não li ainda a parte da documentação do Atmega  que fale sobre 

   como ficam os ports no após o Power ON.

   Testei sem não definir, e o LED do pino 13 fica com uma luz fraquinha.

Rui

Rui, obrigado pelas explicações.

O comando digitalWrite(13, !digitalRead(13))

Não deveria então ser usado em uma única linha, pois contraria as boas práticas.

Antes de efetuar um read, deve-se setar o pino como INPUT e antes de um write, como OUTPUT. Dessa forma, esse comando deveria ser dividido em mais linhas.

Oi JAC, verdade.

Rui

Engraçado, já havia mostrado esse código antes e quase fui "esculachado".

Oi  FH, bom dia.

Foi perseguição politica kkkkk

Rui

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço