Ir para conteúdo

Preciso de uma explicação de um código, por favor


Gin News

Posts Recomendados

Boa tarde, pessoal. Eu preciso explicar cada detalhe desse código que vai ser usado num arduino para criar um relógio de LEDs mas não estou entendendo, então por isso venho aqui pedir para alguém me esclarecer sobre esse código, por favor.

 

unsigned int i,n,k,d,y;
unsigned long previousTime = 0;

byte hours = 12;    // start time
byte minutes = 15;
byte seconds = 00;

int val;

void setup() 
{
  DDRD = 0xFE;
  DDRB = 0xFF;
  DDRC = 0xFE;
  PORTC = 0x01;  
  PORTD = 0x03;
  PORTB = 0x00;
  
  if(hours == 12)
  hours = 0;
}

void loop() 
{
      while(bit_is_clear(PINC, 0))
      { 
      }
  if (millis() >= (previousTime)) 
  {
     previousTime = previousTime + 1000;
     seconds = seconds +1;
     if (seconds == 60)
     {
        seconds = 0;
        minutes = minutes +1;
     }
     if (minutes == 60)
     {
        minutes = 0;
        hours = hours +1;
     }
     if (hours == 12)
     {
        hours = 0;
     }   
  }  
  k=30;
  n=0;
  while(n < 60)
  {
  PORTC |= (1<<5);
  if ((k==0) || (k==5) || (k==10) || (k==15) || (k==20) || (k==25) || (k==30) || (k==35) || (k==40) || (k==45) || (k==50) || (k==55))
  {
  PORTC |= (1<<4);
  PORTC |= (1<<3);  
  }
  if ((k==0) || (k==15) || (k==30) || (k==45))
  {
  PORTC |= (1<<2);
  PORTC |= (1<<1);     
  }
  if((k == hours*5) || (( k == 0 ) && (hours == 0)))
  {
  PORTD |= (1<<2); 
  PORTD |= (1<<3); 
  PORTD |= (1<<4); 
  PORTD |= (1<<5); 
  PORTD |= (1<<6); 
  PORTD |= (1<<7); 
  PORTB |= (1<<0); 
  }
  if(k == minutes)
  {
  PORTD |= (1<<2); 
  PORTD |= (1<<3); 
  PORTD |= (1<<4); 
  PORTD |= (1<<5); 
  PORTD |= (1<<6); 
  PORTD |= (1<<7); 
  PORTB |= (1<<0); 
  PORTB |= (1<<1);
  PORTB |= (1<<2);     
  }
  if(k == seconds)
{
  PORTD |= (1<<2); 
  PORTD |= (1<<3); 
  PORTD |= (1<<4); 
  PORTD |= (1<<5); 
  PORTD |= (1<<6); 
  PORTD |= (1<<7); 
  PORTB |= (1<<0); 
  PORTB |= (1<<1);
  PORTB |= (1<<2); 
  PORTB |= (1<<3);
  PORTB |= (1<<4);
}
  delayMicroseconds(140);
  PORTD = 0x03;
  PORTB = 0x00;
  PORTC = 0x01; 
  PORTD |= (1<<2); 
  delayMicroseconds(30);
  PORTD &= ~(1<<2);     
  delayMicroseconds(600);
  n++;
  k++;
  if(k == 60)
  k=0;
  }
  while(bit_is_set(PINC, 0))
  { 
  }     
}

 

Editado por Gin News
Link para o comentário
Compartilhar em outros sites

Opa! Seria legal você editar seu post pra formatar seu código como código (é o botão com os símbolos <> aqui no editor) e usar a opção de realce de sintaxe em C. Porque aí fica assim ó:

unsigned int i,n,k,d,y;
unsigned long previousTime = 0;

byte hours = 12;    // start time
byte minutes = 15;
byte seconds = 00;

int val;

void setup() 
{
  DDRD = 0xFE;
  DDRB = 0xFF;
  DDRC = 0xFE;
  PORTC = 0x01;  
  PORTD = 0x03;
  PORTB = 0x00;
  
  if(hours == 12)
  hours = 0;
}

Muito melhor de ler. :)

Sobre o programa em si, a sua dúvida é aonde exatamente? Qual parte do código que você não entendeu?

Abraço,

Fernando

Link para o comentário
Compartilhar em outros sites

On 5/22/2021 at 8:37 PM, Fernando Mercês said:

Opa! Seria legal você editar seu post pra formatar seu código como código (é o botão com os símbolos <> aqui no editor) e usar a opção de realce de sintaxe em C. Porque aí fica assim ó:


unsigned int i,n,k,d,y;
unsigned long previousTime = 0;

byte hours = 12;    // start time
byte minutes = 15;
byte seconds = 00;

int val;

void setup() 
{
  DDRD = 0xFE;
  DDRB = 0xFF;
  DDRC = 0xFE;
  PORTC = 0x01;  
  PORTD = 0x03;
  PORTB = 0x00;
  
  if(hours == 12)
  hours = 0;
}

Muito melhor de ler. ?

Sobre o programa em si, a sua dúvida é aonde exatamente? Qual parte do código que você não entendeu?

Abraço,

Fernando

Peço desculpas pelo jeito que eu botei o código no post, sou meio tanso com essas coisas... Então, eu queria saber como esse código funciona por inteiro mesmo, tentei encontrar um código parecido com esse para facilitar mas não encontrei, e também faz um bom tempo que não mexo com linguagem, aí vim aqui pedir para alguém me explicar...

Link para o comentário
Compartilhar em outros sites

17 horas atrás, Gin News disse:

Peço desculpas pelo jeito que eu botei o código no post, sou meio tanso com essas coisas...

Imagina. Foi uma sugestão mesmo, pra ficar melhor pra todos. Tá tudo certo. ;)

17 horas atrás, Gin News disse:

eu queria saber como esse código funciona por inteiro mesmo

Acho que neste caso precisaria ser alguém que conheça de Arduino. Eu não sei o que são essas DDRD, PORTC, etc. Você sabe? Talvez ajude relembrar os operadores em C. Por exemplo, o código abaixo:

PORTD |= (1<<3); 

É o mesmo que:

PORTD = PORTD | 8;

Ou seja, é uma operação OU do valor desta variável/porta com "1 com 3 bits deslocados para a esquerda", que dá no mesmo que "multiplicar por 2 três vezes", que seria 1x2x2x2 que é igual a 8. O resultado é atualizado na própria variável/porta. Os links vão te ajudar a entender. Agora a razão pela qual o código faz isso, não sei te dizer. :(

Vou ver se consigo ajuda de alguém que entenda de Arduino.

Abraço,

Fernando

Link para o comentário
Compartilhar em outros sites

DDR? (Data Direction Register). Um bit 0 significa entrada, bit 1 significa saída.
PORT? (são os bits das portas).

Aliás... se é para implementar um relógio, é melhor usar interrupção gerada pelo timer do microcontrolador do que tentar temporizar isso num loop.

Faltam MUITOS detalhes com relação a esse seu código:

  1. Com qual frequência de clock está trabalhando?
  2. Qual é o significado dos bits nas portas B, C e D, usadas no código? (Qual é o circuito?)
  3. O troço é apenas um relógio? Onde as horas, minutos e segundos estão sendo mostradas?

etc...

Editado por fredericopissarra
  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Participe da conversa

Você pode postar agora e se cadastrar mais tarde. Se você tem uma conta, faça o login para postar com sua conta.

Visitante
Responder

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emojis são permitidos.

×   Seu link foi automaticamente incorporado.   Mostrar como link

×   Seu conteúdo anterior foi restaurado.   Limpar o editor

×   Não é possível colar imagens diretamente. Carregar ou inserir imagens do URL.

  • Quem Está Navegando   0 membros estão online

    • Nenhum usuário registrado visualizando esta página.
×
×
  • Criar Novo...