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,
Tags:
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
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por