Jump to content

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


Gin News
 Share

Recommended Posts

Posted (edited)

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

 

Edited by Gin News
Link to comment
Share on other sites

  • Administrators

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 to comment
Share on other 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 to comment
Share on other sites

  • Administrators
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 to comment
Share on other sites

Posted (edited)

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

Edited by fredericopissarra
  • Curtir 1
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...