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))
  { 
  }     
}

 

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...

Link para o comentário
Compartilhar em outros sites

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

  • Quem Está Navegando   0 membros estão online

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