Bom, acabaram-se as provas. Agora teremos novos posts mais rapidamente.

Desta vez, postarei um pseudocódigo para o Genius. Antes, porém, vou tentar explicar o que são microcontroladores.

-Microcontroladores:

Um microcontrolador basicamente é uma caixa preta que têm pinos de entrada e de saída. A beleza do microcontrolador esta em podermos mudar o programa que controla as saídas à partir das entradas.

Cada saída e entrada do microcontrolador deve estar em 0V ou 5V. No nosso projeto, usaremos os 5V das saídas para acender pequenos LEDs que , por sua vez, serão as luzes do Genius. Na entrada, utilizaremos botões que mandarão 0V ou 5V para os pinos de entrada.

Então, resumindo, um microcontrolador recebe os 0s e 1s na entrada, os interpreta e gera dados na saída.


-Por que um pseudo-código?

Como eu disse, o intuito deste projeto é que ele possa ser feito com qualquer tipo de microcontrolador. Se eu disponibilizasse o código completo, quem usa microcontroladores PIC ao invés dos Atmel pode ter dificuldades. No post de montagem disponibilizo o código "em AVR" pronto.

Também vou mostrar apenas um pseudo-código pois o objetivo desse post é analisar o diagrama de blocos do arquivo C e gerar um código à partir deste. Creio que um pseudo-código seria melhor para este fim.


-Chega de enrolação, vamos ao código:


Antes da análise do diagrama devemos fazer as inicializações e declarações de variáveis necessárias:



#include "stdlib.h"
//Inclua outras bibliotecas necessárias para cada tipo de microcontrolador.
#define LEVELMAX 30


int main()
{

int level,i,j,perdeu=0;
int Vetor_de_cores[LEVELMAX];


return 0;
}
Genius. Versão 0.1

Bom, já temos o começo do programa. Agora vamos colocar os devidos loopings e funções de acordo com o diagrama de blocos:



#include "stdlib.h"
//Inclua outras bibliotecas necessárias para cada tipo de microcontrolador.
#define LEVELMAX 30

int main()
{

int level,i,j,k=0;
int Vetor_de_cores[LEVELMAX];
while(1)
{
i=0;
j=0;
k=0;
Inicializa_Vetor(Vetor_de_cores);

while(!perdeu) /*Enquanto o usuário não perdeu o jogo*/
{

for(i=0;i menor do que level; i++)
{
Acende_Luz(Vetor_de_cores[i]);
Aguarda(50);
}

for(j=0;j menor do que level; j++)
{
if(Entrada()!=pow(2,Vetor_de_cores[i])) /*Lógica com binários*/
{
perdeu=1;
break;
}
}

level++;

}

return 0;
}
Genius. Versão 0.2

Como vocês viram não há nada de muito complexo no código. Agora analisemos função por função:



void Inicializa_Vetor(int *vetor[LEVELMAX])
{

for(int i=0; i menor do que LEVELMAX; i++)
{
vetor[i]=rand()%4;
}

}


void Acende_Luz(int luz)
{

Porta_Saida=pow(2,luz); /*Esta potencia deve-se novamente à lógica binária que estamos fazendo, qualquer dúvida comentem!*/

}


void Aguarda(int ms)
{
int tempo=StartTimer();

/*StartTimer seria uma função temporizadora do microcontrolador usado*/

while(tempo

Bom, é isso aí. Qualquer dúvida comentem que o próximo post será sobre dúvidas de vocês. Acho que não há nada de muito complicado aí em cima.

A única explicação que eu queria fazer é sobre a lógica binária:

(Espero que vocês conheçam a numeração binária pois será necessário para entender a lógica.)

O microcontrolador tem N portas de M bits. Cada bit é fisicamente representado por uma perninha do microcontrolador.

Como queremos acender apenas um led, se simplesmente igualássemos a porta de saída ao número do vetor de luzes, teríamos problemas se o número fosse 3, já que:

3 na base 10 = 0011 em binário.

Portanto , quando queremos deixar em 5V apenas o quarto terminal da porta de saída (Os números aleatórios são gerados de 0 a 3, portanto quando sorteamos 3 , desejamos ligar o 4 perninha) devemos igualar a porta de saída à 8 .

8 na base 10 = 1000 na base 2

Então teremos as seguintes saídas para cada número possível sorteado:


Em ordem, temos: Número sorteado, número que vai para saída, número em decimal e número em binário.

Tabela 1.



Conseguiram entender o que o microcontrolador faz?
É como se ele recebesse um número na entrada, trabalhasse com ele dentro do microcontrolador é devolvesse um número na saída. Porém, quando igualamos a saída à um número decimal, ela sairá na forma de binário.

Qualquer dúvida comentem. Aliás, comentem de qualquer forma, acho que não estou recebendo visitas =[.



[]'s Pitt.