Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
ontimer
24-02-2015, 03:05 PM,
#1
ontimer
Bonjour,

est-il possible de mettre une variable en delay, à la place dune valeur définit dans le ontimer0 ????

Voici dans quel exemple

#include <interrupt.c>

#define LED0 0
#define LED1 1
#define LED2 2
#define LED3 3

void blink0() { Toggle(LED0); }
void blink1() { Toggle(LED1); }
void blink2() { Toggle(LED2); }
void blink3() { Toggle(LED3); }

void setup()
{

OnTimer0(blink0, INT_MILLISEC, 500); // Use Timer0 to toggle pin 0 every 500 ms
OnTimer1(blink1, INT_MILLISEC, 500); // Use Timer1 to toggle pin 0 every 500 ms
OnTimer2(blink2, INT_MILLISEC, 500); // Use Timer2 to toggle pin 0 every 500 ms
OnTimer3(blink3, INT_MILLISEC, 500); // Use Timer3 to toggle pin 0 every 500 ms
}

void loop()
{
}

merci d'avance

Kenavo
Reply
24-02-2015, 03:50 PM, (This post was last modified: 24-02-2015, 03:52 PM by gtcbreizh.)
#2
RE: ontimer
(24-02-2015, 03:05 PM)naindejardin Wrote: Bonjour,

est-il possible de mettre une variable en delay, à la place dune valeur définit  dans le ontimer0 ????

Voici dans quel exemple

#include <interrupt.c>

#define LED0    0
#define LED1    1
#define LED2    2
#define LED3    3

void blink0() { Toggle(LED0); }
void blink1() { Toggle(LED1); }
void blink2() { Toggle(LED2); }
void blink3() { Toggle(LED3); }

void setup()
{

       OnTimer0(blink0, INT_MILLISEC, 500);    // Use Timer0 to toggle pin 0 every 500 ms
       OnTimer1(blink1, INT_MILLISEC, 500);    // Use Timer1 to toggle pin 0 every 500 ms
       OnTimer2(blink2, INT_MILLISEC, 500);    // Use Timer2 to toggle pin 0 every 500 ms
       OnTimer3(blink3, INT_MILLISEC, 500);    // Use Timer3 to toggle pin 0 every 500 ms
}

void loop()
{
}

merci d'avance

Kenavo

Bonjour Fred,
Je ne vois pas pourquoi tu ne pourrais pas mettre une variable à la place de 500.
Cette variable doit être de type u16 ou int.
Reply
01-03-2015, 11:05 PM,
#3
RE: ontimer
OK Gtcbreizh,

En fait j'essaye de créer un générateur de 2 régimes à partir de deux valeurs analogiques

val1=analogread (A0);
freq1=map (val1,0, 1023, 50,500);

Et ensuite utiliser freq1 à la place du 500.

je pense qu'il faut que je fasse une fonction interruption avec les commandes ontimer et une autre genre frequence1 avec in test pour savoir si val1 a changé.

J'ai essayé plusieurs choses mais ça ne marche pas, il me sort une valeur fixe même si je tourne mais potentiomètre ou n'importe quoi....

Une idée. ...
Reply
05-03-2015, 02:23 PM,
#4
RE: ontimer
Voilà le Prog:

#define OUT1 6
#define OUT2 7
u16 freq1;
u16 freq2;
u16 val1;
u16 val2;

void blink1() {
   toggle(OUT1);
    }
void blink2() {
   toggle(OUT2);
    }

void frequ1()
{
val1=analogRead(A0);
freq1=map(val1,0,1023,1,500);

}

void frequ2()
{
val2=analogRead(A1);
freq2=map(val2,0,1023,50,100);

}

void setup()
{
   pinMode(6, OUTPUT);
   pinMode(7, OUTPUT);

}

void loop()
{
frequ1();
frequ2();
OnTimer0(blink1, INT_MILLISEC, freq1);
OnTimer1(blink2, INT_MILLISEC, freq2);
}


Je n'ai rien en sortie  Sad , quelqu'un aurait une idée   Huh

Merci d'avance.

Wink
Reply
05-03-2015, 07:01 PM, (This post was last modified: 05-03-2015, 07:04 PM by regis.)
#5
RE: ontimer
Tu ne peux pas reconfigurer une interruption à la volée comme ça, il faudrait au moins d'abord utiliser :
Int.detach(INT_TIMER0) et Int.detach(INT_TIMER1).
Je ne comprends pas bien ce que tu veux faire plus tard avec ton programme. Tu peux expliquer ? Je me demande s'il n'y aurait pas plus simple ...
It is easier to complain than it is to do, but it is better to do than it is to complain.
Reply
06-03-2015, 12:29 AM,
#6
RE: ontimer
Salut Régis,

J'essaye de créer 2 signaux périodiques de 0-5v à partir de 2 valeurs de potentiomètre comme un gbf. Mes fréquences seraient entre 1Hz et 1Hz. Donc à chaque fois que je tourne le potentiomètre, j'agis sur le delay et comme ça je change ma fréquence.

J'avais déjà essayé avec la fonction millis mais pas trop concluant et je me demandais si avec la fonction ontimerX on pouvait le faire..


J'espère que mes explications sont à peu près claires...

En attendant

Kenavo
Reply
06-03-2015, 10:16 AM, (This post was last modified: 06-03-2015, 10:17 AM by regis.)
#7
RE: ontimer
As-tu pensé a utiliser le PWM ? Il y en a au moins 2 sur les Pinguino 8-bit (saut le 47J53 qui en a 6) et 5 sur les 32-bit.
Tu peux sortir la fréquence de ton choix avec l'instruction : PWM.setFrequency(pin, freq).
Attention les fréquences de sortie sont en rapport avec la fréquence de l'horloge interne (Fosc/4 sur les 8-bit).
Théoriquement, tu ne peux donc allez au-delà de 12MHz si ton Pinguino marche à 48MHz et pas en dessous de 2929 Hz.
Si tu veux allez plus bas il faut baisser la fréquence du processeur : System.setCpuFrequency(fosc);
Tu trouveras la formule de calcul et des explications dans les datasheets mais en gros tu as :

PWM Period     = (Timer2 period + 1) * 4 *  Osc. period * Timer2 prescaler

Si je devais faire un petit GBF et donc sortir différentes formes du signal (triangle, carré, sinusoïde), alors j'utiliserais une fréquence porteuse (égale au double de la fréquence max. du GBF) et modulerais le duty cycle de PWM pour sortir la forme et la fréquence souhaitées.

Dans ce cas, je m'inspirerais du fichier audio.c. Tu pourrais en faire une copie, le modifier et en faire une petite lib. Waveform avec des instructions du genre Waveform(pin, freq, form) ...
As-tu un oscilloscope ?
It is easier to complain than it is to do, but it is better to do than it is to complain.
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)