Bonsoir à tous,
je suis entrain d'essayer d'interfacer une carte qui génère des sorties HI et LO continue, en impulsion unique a chaque front montant.
Mon problème c'est que je n'arrive qu'a générer des impulsion en séries jusqu'a la fin du signal HI en entrée...
Voici deux chronogrammes pour faciliter la compréhension du problème.
Je voudrait arriver à ceci:
Mais mon meilleur résultat est ceci:
J'ai eu beau chercher, je ne trouve pas de fonction magique genre "one shot" dans la syntaxes Arduino.. =(
Voici mon sketch actuel:
const int buttonPin = 2; // the number of the pushbutton pin
const int ledPin = 13; // the number of the LED pin
// variables will change:
int buttonState = 0; // variable for reading the pushbutton status
void setup() {
// initialize the LED pin as an output:
pinMode(ledPin, OUTPUT);
// initialize the pushbutton pin as an input:
pinMode(buttonPin, INPUT);
}
void loop(){
// read the state of the pushbutton value:
buttonState = digitalRead(buttonPin);
// check if the pushbutton is pressed.
// if it is, the buttonState is HIGH:
if (buttonState == HIGH) {
// turn LED on:
digitalWrite(ledPin, LOW);
delay(1000);
digitalWrite(ledPin, HIGH);
delay(1000);
}
else {
// turn LED off:
digitalWrite(ledPin, HIGH);
}
}
Je suis parti de l'exemple "button", donc les notes ne sont pas toujours juste.
Ma question est la suivante:
Comment arrêter le déroulement du programme après une seul impulsion?
Je suis un peu perdu pour l'instant, de l'aide serais grandement appréciée.
D'avance un grand merci,
David
eurotronic:
Je le met ou dans mon sketch ton bout de code?
J'ai un peu du mal a comprendre son mode d'action.
Je te fait les commentaires alors
Tu met le code directement dans un sketch vide.
int pin = 13; // la led qui affichera la pulsation est sur la broche 13
void setup() { // fonction setup, appelé une fois au démarrage de l'arduino
pinMode(pin, OUTPUT); // on place la broche de la led en sortie
attachInterrupt(0, pulse, RISING); // on attache un interruptions sur la broche D2 (int0), à chaque front montant sur la broche D2 la fonction pulse() sera appeler
} // fin de la fonction setup
void loop() { // fonction loop, appelé tout le temps pendant l'exécution normal du programme
} // ici pas de chose à faire autre que l'interruption
void pulse() { // la fonction pulse, elle envoie une impulsion de 1sec sur la broche de la led qui va s'allumé
digitalWrite(pin, HIGH); // on allume la led
for(int i=0; i<1000; i++) // on repette 1000 fois l'instruction suivante (1000 x 1ms = 1 seconde)
delayMicroseconds(1000); // on attend 1ms (on ne peut pas utiliser delay() car cela ne marche pas dans une interruption)
digitalWrite(pin, LOW); // on éteint la led
//detachInterrupt(0); // si on veut n'avoir qu'une seul pulse il faut décommenter cette ligne pour stopper les autres interruptions aprés la 1er pulse, il n'y aura alors plus de pulse sur les front suivant sauf si on reset l'arduino
}
On peut aussi le faire sans interruption.
Pour générer une seul impulsion au début d'une transistion, il faut savoir si l'on se trouve au début ou au milieu de la transition. Ceci veut dire qu'il faut savoir quel était l'état du signal la dernière fois qu'on l'a testé. Ensuite on teste si l'état courant est actif et l'état précédent inactif.
const int buttonPin = 2; // the number of the pushbutton pin
const int ledPin = 13; // the number of the LED pin
// variables will change:
int buttonState = 0; // variable for reading the pushbutton status
int oldState=0; // status of the button at the last test
void setup() {
// initialize the LED pin as an output:
pinMode(ledPin, OUTPUT);
// initialize the pushbutton pin as an input:
pinMode(buttonPin, INPUT);
}
void loop(){
// read the state of the pushbutton value:
buttonState = digitalRead(buttonPin);
// check if the pushbutton has been pressed.
// if it is, the buttonState is HIGH and the oldState is LOW
if (buttonState == HIGH && oldState == LOW) {
// turn LED on:
digitalWrite(ledPin, LOW);
delay(1000);
digitalWrite(ledPin, HIGH);
delay(1000);
}
else {
// turn LED off:
digitalWrite(ledPin, HIGH);
}
// save current state for later
oldState = buttonState;
}
Je ne dis pas que c'est la meilleur solution, le fonctionnement sous interruption peut avoir des avantages. C'est juste une autre façon de faire
Merci Messieurs. C'est vraiment cool de me soutenir.
@fdufnews:
J'ai essayé ton sketch, mais j'ai le même problème que décrit dans mon post de départ, càd des impulsions ininterrompue durant toute la durée de l’état HI. Pourtant ton code m' à l'air bon. Penses tu que des petits sauts dans le courant d'entrée pourrait déclencher des impulsions?
@Skywodd:
Ton code a l'air tout a fait adapté, mais ça ne fonctionne pas non plus..
Peut être doit je ajouter la description de la pin2 comme input? je ne voit pas ça dans ton code(c'est peut etre noté autrement).
Penses tu, comme je l'ai écris à fdudnews, que de légère variation du signal d’entrée pourrais faire bloquer le contrôleur?
Pour info:
Le signal d’entrée sort directement d'un 74LS368 Texas Instruments 332263, DS datasheet pdf
Je mesure en sortie:
niveau HI; 3,12v/3,15v
niveau LO; 0,1v/0,13V
Peut être un condensateur, ou autre, entre 74ls368 et Arduino, serait conseillé?
eurotronic: @Skywodd:
Ton code a l'air tout a fait adapté, mais ça ne fonctionne pas non plus..
Peut être doit je ajouter la description de la pin2 comme input? je ne voit pas ça dans ton code(c'est peut etre noté autrement).
Penses tu, comme je l'ai écris à fdudnews, que de légère variation du signal d’entrée pourrais faire bloquer le contrôleur?
Je viens de re-tester avec mon arduino il marche sans probléme, il faut bien que le signal soit à GND puis passe à VCC pour lancer l'impulsion, si il passe de haut-impédance à vcc ça ne marchera pas.
Tente de remplacer RISING par CHANGE ou FALLING pour voir ce qui te convient le mieux.
Bon je vient de bidouiller des sondes pour mon vieil oscillo et..
Apparement, il y a un petit problème.
C'est pas du tout les signaux auquel je m'attendais!
J'ai bien fait de récupérer cet oscilloscope, sinon je serai toujours en train de m'arracher les cheveux.
Les sketchs de skywodd et fdufnews sont donc bon, si il y a une erreur dans ce circuit, c'est bien moi..
Bon reste plus qu'à trouver un circuit qui lissera tout ça.
Si quelqu’un a une idée, je suis toute ouïe.
Yes! Ca marche!
j'ai mis 2 inverters en série et j'ai un LOW a zéro.
Upload du sketch de skywodd, et ca fonctionne nikel! Merci encore camarade!
J'ai juste du inversé les valeur de high et low, la led s’éteignait au lieu de s'allumer(comprend pas..).
-Comment ajouter d'autre pin avec interruption?
Il m'en faut 4 en tout. Il y aura donc 4 entrées vers 4 sorties, in1/out1,in2/out2,in3/out3,in4/out4.
Malgré les explications, je ne comprend pas comment on initialise les pin d’entrée en interruption.
Après relecture de la syntaxe, je me répond a moi même.
Les interruptions sont fixes sur les pin 2 et 3, et il n'y en a pas d'autres sur l'arduino que je possède. Dommage..
Heureusement, j'ai tester le sketch de fdufnews, et ça fonctionne aussi! ouf!
Merci à toi aussi, camarade!
Sinon pour le relais, ben je vais essayer et je posterais le résultat.
eurotronic:
Après relecture de la syntaxe, je me répond a moi même.
Les interruptions sont fixes sur les pin 2 et 3, et il n'y en a pas d'autres sur l'arduino que je possède. Dommage..
Sinon pour le relais, ben je vais essayer et je posterais le résultat.
L'ATmega328 possède des interruptions sur toute les ports mais pour le moment le core arduino ne les prend pas en charges.
Regarde de ce coté -> http://www.arduino.cc/playground/Main/PcInt jusqu'à 19 interruptions c'est déjà pas mal
Pour le relay il fau faire un montage transistor + diode.
Plutôt baleze l'ATmega328!
Ma carte, c'est un vieil Arduino NG avec ATmega168..Elle sera de plus greffée direct a mon montage puisque ,apparemment ,l' ATmega168 n'est plus produit.
Si j'en reprend une nouvel interface, ça sera avec le 328!
Merci pour le lien pour le montage de relais. C'est exactement ce que je recherchais!
J’espère ne plus avoir besoin d'aide, et
remercie encore une fois les intervenants.