1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91
| // Pilotage de 2 composants 74HC573 composés de 8 verrous type D pour obtenir ainsi 16 sorties numériques.
// Un programme envoie une chaine de caractères de la forme "ppppp\n" (soient 6 caractères) avec ppp
// le code en puissance de 2 (de 1 à 2^16-1=65535). Si une sortie est à 0 elle passera à 1 et inversement.
// Le contenu de la chaine lue est placée dans la variable buf.
// - Attention les pins 0 (RX) et 1 (TX) sont connectés au port USB sur UNO !
// Ne pas les utiliser car les fonctions port série sont implémentées dans le script.
// Rappel, ports :
// B (digital pin 8 to 13)
// C (analog input pins)
// D (digital pins 0 to 7)
// => Dans notre configuration :
// B pins 8 to 13 (6 sorties)
// C voies A0, A1, A2, A3 (4 sorties)
// D pins 2 to 7 (6 sorties)
// => valeurs entre 1 et 65535 (16 bits)
const int OUT_PORT[12] = {2,3,4,5,6,7,8,9,10,11,12,13,A0,A1,A2,A3};
const int LATCH_ENABLE = A4;
char buf[6];
byte n, dataB, dataC, dataD;
String strPort;
long port;
int i;
char *pch;
void setup()
{
pinMode(LATCH_ENABLE, OUTPUT);
digitalWrite(LATCH_ENABLE, LOW); // sorties du 74HC573 désactivées
for (i=0; i<12; i++)
{
pinMode(OUT_PORT[i], OUTPUT);
digitalWrite(OUT_PORT[i], LOW);
}
pinMode(LATCH_ENABLE, OUTPUT);
digitalWrite(LATCH_ENABLE, HIGH); // sorties activées
Serial.begin(9600);
/*while (!Serial)
{
// attente de connexion du port série. Pour Leonardo seulement.
// boucle à supprimer pour UNO
}*/
}
void loop()
{
if (Serial.available() > 0)
{
// Lecture de la donnée reçue
n = Serial.readBytesUntil('\n', buf, 6);
if (n > 0)
{
pch = strtok(buf, "\n");
strPort = pch;
port = strPort.toInt();
port = port << 2; // car les pins 0 et 1 ne sont pas utilisés
if (port >= 4 && port <= 262140) // 65535<<2 = 262140 ;-)
{
digitalWrite(LATCH_ENABLE, LOW); // sorties du 74HC573 désactivées
// application des masques pour récupérer les données pour chaque port
// | xxxx | xxxx xx | xx xxxx00 |
// | portC | portB | port D |
dataD = port & 0xFC;
dataB = (port & 0x3F00) >> 8;
dataC = (port & 0x3C000) >> 14;
// accès directs aux ports
PORTD = PORTD ^ dataD;
PORTB = PORTB ^ dataB;
PORTC = PORTC ^ dataC;
digitalWrite(LATCH_ENABLE, HIGH); // sorties du 74HC573 activées
}
}
}
} |
Partager