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
| // code arduino slave sur COM6 port USB droit
// communication avec Raspberry en USB
#define SIGNAL1 12 // ici on definit les sorties qui generent les signaux carres
#define SIGNAL2 10 // ici on definit les sorties qui generent les signaux carres
#define SIGNAL3 8 // ici on definit les sorties qui generent les signaux carres
#define SIGNAL4 6 // ici on definit les sorties qui generent les signaux carres
unsigned char prescaler = 0b00001101; // variable d'ajustement du prescaler en fonction de la valeur de frequence
int valeur = 2420; // frequenceInt
void setup () {
Serial.begin(115200);
pinMode (SIGNAL1, OUTPUT);
pinMode (SIGNAL2, OUTPUT);
pinMode (SIGNAL3, OUTPUT);
pinMode (SIGNAL4, OUTPUT);
// ============================================================================
// Paramétrage du timer1, pour qu'il déclenche une interruption, à chaque fois que sa valeur sera égale à celle qu'on aura indiqué dans OCR1A
// ============================================================================
noInterrupts(); // On désactive les interruptions, pour commencer
TCCR1A = 0b00000000;
//TCCR1B = 0b00001001; // TCCR1B = 0b00001001 pour desactiver prescaler et TCCR1B = 0b00001101 pour prescaler = 1024
TIMSK1 = 0b00000010;
bitSet(TIMSK1, OCIE1A); // On met le bit OCIE1A à 1 (contenu dans le registre TIMSK1)
// Enfin, on met le compteur à zéro, on entre la valeur déclenchant l'interruptionet on réactive les interruptions
TCNT1 = 0; // Mise du timer1 à zéro
interrupts(); // Et, on ré-active les interruptions
}
// ======================
// Routine d'interruption
// ======================
ISR(TIMER1_COMPA_vect) {
digitalWrite (SIGNAL1, !digitalRead(SIGNAL1));
digitalWrite (SIGNAL2, !digitalRead(SIGNAL2));
digitalWrite (SIGNAL3, !digitalRead(SIGNAL3));
digitalWrite (SIGNAL4, !digitalRead(SIGNAL4));
TCCR1B = prescaler;
OCR1A = valeur; // mise à jour de la valeur OCR1A en fonction de la valeur envoyée par arduino
}
// =================
// Boucle principale
// =================
void loop ()
{
//while (!Serial.available()); // ici on regarde si qqechose vient de l USB
valeur = Serial.readStringUntil('\n').toInt();
if (valeur<2430) {
prescaler = 0b00001101;
}
else {
prescaler = 0b00001001;
}
} |
Partager