Skip to content

Instantly share code, notes, and snippets.

@matael
Created December 14, 2011 15:56
Show Gist options
  • Save matael/1477142 to your computer and use it in GitHub Desktop.
Save matael/1477142 to your computer and use it in GitHub Desktop.
Exemples systèmes embarqués CR
// Compteur 8 bits sur un arduino
int tabl[8] = {0};
void convertBin(int nb) // convertit l'argument en binaire
{
// recherche des plus grandes puissances de deux retranchables
// à l'argument sans le rendre négatif (on commence par les plus grands)
for(int i = 7; i >= 0; i--)
{
if((nb - pow(2,i)) >= 0) // si la puissance de 2 correspond, on retranche, et on allume le bit équivalent dans tabl
{
tabl[i] = 1; // bit allumé
nb -= pow(2,i); // on retranche la puissance au nombre, pour les calculs suivants
}
else // la différence est négative
tabl[i] = 0; // bit éteint
}
}
void afficherBin() // affiche le tableau (en binaire) avec des leds
{// les pins utilisées vont de 0 à 7 sur l'arduino
for(int i = 0; i < 8; i++) // on parcours les LEDs
{
if(tabl[i]) // si le bit équivalent est allumé, on allume la LED
digitalWrite(i, HIGH);
else // sinon, on éteint la LED
digitalWrite(i, LOW);
}
}
int pow(int a, int b) // retourne a^b
{
while(b)
{
a *= a;
b--;
}
return a;
}
bool verifTabl() // retourne vrai si la table à été réinitialisée
{
bool attLimite = true; // reste vrai tant que le programme ne rencontre pas de zéro dans tabl
for(int i = 0; i < 8; i++)
{
if(tabl[i] == 0) // si tabl[i] est faux, id est est égal à zéro
attLimite = false;
}
if(attLimite) // si tabl est remplis de 1, id est a atteint sa valeur maxi
{
for(int i = 0; i < 8; i++) tabl[i] = 0; // tabl est entièrement réinitialisé à zéro
return true; // on retourne vrai, car tabl est réinitialisé
}
return false; // on retourne faux, car tabl n'a pas été réinitialisé
}
void setup()
{
for(int i = 0; i < 8; i++)
{
pinMode(i, OUTPUT);
digitalWrite(i, LOW);
}
}
void loop()
{
static int varDec = -1;
varDec++;// incrémentation du compteur toutes les secondes
delay(980); // temps : on attend une seconde (1000 millisecondes, moins quelques millisecondes pour le temps de calcul)
// vériftabl renvoi vrai si tabl a atteint le maximum : on réinitialise alors tabl et on remet varDec à zéro
if(verifTabl()) // si la table est au max ...
varDec = 0; // varDec est réinitialisé
convertBin(varDec); // varDec convertit en binaire dans tabl
afficherBin(); // affichage en fonction de tabl sur les pins 0 à 7.
}
entity COUNTER is
port(S : out bit_vector(7 downto 0));
end COUNTER;
architecture ARCH1 of COUNTER is
begin
process
variable N : integer;
variable P : integer;
begin
N := 0;
while (true) loop
while (N<256) loop
for P IN 0 to 7 loop
if (N - 2**P >= 0) then
S(P) <= '1';
else
S(P) <= '0';
end if;
end loop;
wait for 100 ms;
N := N + 1;
end loop;
N := 0;
end loop;
end process;
end ARCH1;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment