j'ai un problème de temps dans mon code.
les impulsions doit être dans un intervalle de [0 100] microseconde et chaque impulsion doit prendre 2 microseconde.
Voila mon code :
Est ce que tu te rends compte que la moindre opération flottante prend plus de 10 µs, et une fonction comme exp() doit prendre plusieurs dizaines de µs.
C'est totalement incompatible avec les timing que tu souhaites.
Bonjour les Arduinautes,
Cher SEEEM2, visiblement pour ce qui concerne la courtoisie, tu n’a pas du t’égarer souvent sur des sites te permettant d’avoir les bases …
Pourtant BrUnO14200 t’a tendu la perche.
Pourtant, commencer par Bonjour n’est pas très long à frapper au clavier.
Tu peux aussi utiliser du Copier/Coller. Par exemple :
Bonjour Bonjour Bonjour Bonjour Bonjour Bonjour Bonjour Bonjour
Ne prend que huit clics de souris.
Revenons à ton problème. Si j’ai bien compris, tu désires générer un signal constitué d’impulsions de 2µS séparées de 100µS.
Pour 2µS il faut obligatoirement utiliser deux instructions du genre :
digitalWrite(Ma_Sortie, HIGH); digitalWrite(Ma_Sortie, LOW);
qui se suivent, puis avec un moyen de mesure précis mesurer la durée.
Entre ces deux instructions tu place une instruction « bidon » pour consommer un peu de temps et affiner ta temporisation.
Une dernière suggestion : Pour ton sujet, le titre n’est pas parlant. Du coup, certains qui seraient tentés de te répondre passent « au suivant ». Je crois important de choisir un titre qui synthétise ton problème. Par exemple « Problème de temporisation. » serait plus pertinent. Un spécialiste dans ce domaine serait attiré et t’apporterait alors des solutions élégantes et variées.
Amicalement : Nulentout.
nulentout:
Pour 2µS il faut obligatoirement utiliser deux instructions du genre :
digitalWrite(Ma_Sortie, HIGH); digitalWrite(Ma_Sortie, LOW);
qui se suivent, puis avec un moyen de mesure précis mesurer la durée.
Je pense que des digitalWriteFast seraient plus adaptés ou une écriture directe dans les registres du processeur.
Mais avant une description claire du besoin serait la bienvenue.
On est en train de pinailler sur quelques cycles d'horloge alors que dans son programme il fait bien un accès direct au port, mais entre chaque impulsion il calcule 5000 exp().
void loop() {
for ( float j = x ; j > 0 ; j = j - 0.001){
y = exp (j);
PORTD = float (y) ;
}
nulentout:
digitalWriteFast() ... je ne connais pas.
Tu peux développer un chtipeu s'il te plait ?
[ Information sans rapport avec le sujet, quoique ?]
Les fonctions "officielles" Arduino utilisent des macros et PROGMEN pour relier les dénominations Wiring/Arduino (de 1 à N) avec les dénominations Atmel (Référence au port (A,B,C,...) et au rang dans le port (de 0 à 7).
En supplément les fonctions officielles font toute une série de contrôle pour vérifier que l'utilisateur ne fait de bétises comme vouloir écrire dans une E/S déjà utilisée pour de la PWM.
Nota : Les temps de lecture et d'écriture sont plus long si l'E/S peut être manipulée par timer (PWM par exemple mais pas que), ce qui n'est pas le cas avec la manipulation des registres.
Les fonctions dérivées digitalWrite(Read)Fast ne font pas de contôle d'où le gain en cycles horloges.
(*) Les nouvelles fonctions Wiring pinWrite() et pinRead() ne font plus appel à PROGMEN