Go Down

Topic: Résolu Boitier E85 avec un Arduino nano (Read 9974 times) previous topic - next topic

68tjs

Si c'est pour gérer les interruptions sur un port tu peux lire mon tuto : http://forum.arduino.cc/index.php?topic=100906.0

Pas de fonctions arduino attachInterrupXXXXt().
C'est de la gestion directement par les registres,  cela reste très simple car en programation je ne sais pas faire des choses compliquées.

marcus_95

Merci je vais le lire a tête reposée.

marcus_95

Voilà je mets les images pour mieux comprendre mon problème.

dfgh

ok, là on comprend tout de suite le problème

par contre, tu veux compter sur deux timers, mais qu'en est il de la pompe?
n'est elle pas perturbée de devoir fournir sur deux injecteurs en même temps?

en supposant que non, le temps de recouvrement sur 2 injecteurs doit fausser le débit et devrait, je suppose, demander un allongement supplémentaire du temps d'injection ?

marcus_95

Non là c'est en mode réel constructeur sortie du calulo. Oui en effet je veux compter sur 2 timers en me servant si possible des interruptions pour gagner du temps dans le programme

marcus_95

Le hic je ne sais pas comment mi prendre, mon idée: détecter un changement d'état et lancer un compteur si une autre broche change on lance un deuxième compteur si l'un ou l'autre change on intervient et on rajoute ce qui a été mémorisé et on continue.

dfgh

#21
Sep 02, 2015, 07:57 pm Last Edit: Sep 02, 2015, 08:56 pm by dfgh
à 6000 tr, tu as une injection toutes les 3ms  on vois sur ton analyseur que l'injection dure pratiquement 6ms.

utiliser les interruptions ne te donnera rien, les injections durent 6 ms et elles se recouvrent.

la seule façon de t'en sortir est d'utiliser 2 timers en alternance.

bien sur, je te dis ça sans y avoir réfléchi sérieusement.

marcus_95

Très bon TUTO 68tjs je vais faire des essai avec tes codes voir si je peux les modifier pour mon usage.

marcus_95

par contre on peux avoir des variables volatile du temps avec les timers

Super_Cinci

#24
Sep 02, 2015, 11:03 pm Last Edit: Sep 02, 2015, 11:04 pm by Super_Cinci
effectivement, si on veut faire du temps-réel, il faut oublier toutes les fonctions arduino, ainsi que toutes les libs d'internet et travailler en mode µC, c-a-d en accès direct avec les registres.

le datasheet de l'ATMEL sera ton unique et seule amie sur ce coup-là, mais il faut quand même savoir la lire, et donc avoir un minimum de notions. (RTFD)

Sur un tel programme, la void loop() devrait être vide, tout se traitant en interruptions. Toutes les communications doivent se faire en direct, et surtout pas de truc genre one wire qui mettent un temps pas possible à réagir et ralentissent ton programme. Une bonne vieille sonde analogique fera des merveilles, à condition de gérer toi-même le CAN, et pas de analogRead().

En résumé, un tel programme pour débuter, c'est pas une bonne idée...

En optimisant le code, tu peux multiplier par 20 la vitesse d'exécution.

par exemple, quand tu appelles une fonction, tu perds d'entrée de jeu 500ns. 6 fonctions, et pouf, 3ms de perdues...

marcus_95

Bonjour, merci pour votre aide je vais essayer de la faire uniquement avec les interruptions avec les traitements en assembleur, oui je vais monter une sonde analogique, pas très compliqué pour mon utilisation. Après mon autre idée est de le faire avec 3 ARDUINO en repérant les cylindres. Je revient vers vous une fois fini.
Marcus.

B@tto

Perso voici comment je gèrerai les choses :


Code: [Select]
boucle {

calculLambda() // mise à jour de delai

// scan des entrée
for(i=0;i<6;i++) {

bit = 1<<i

//si commande injecteur
si (!(PINB&bit) && actif[i]==0) alors  {

actif[i]=1
PORTD |= ~(bit)
timing[i]=micros()

}

//si command en cours
si (actif[i]==1) alors {

//si temps écoulé
si (micros()>=timing[i]+delai) {
PORTD &= ~(bit)
actif[i]=0;
}

}


}


}


Globalement y'aura assez peu de perte mais si on est à la µs près c'est sûr que chaque cycle coûte cher ...
Blog électronique : battomicro.wordpress.com
Photographie : www.interactive-celebration.fr
Fablab de Montpellier : www.labsud.org

marcus_95

Merci pour le bout de code je vais essayer de l'exploité.

marcus_95

Bonsoir, j'essaie de faire un bout de programme en utilisant les interruptions de port sans la boucle Loop rien à faire si je ne mets pas Loop j'ai un message d'erreur a la compilation et si je mets la boucle Loop vide il reste bloqué. Comment faire?
Code: [Select]
/// ARDUINO UNO - IT Externe 0
// Fonction de IT externe 0 (broche PD2)
ISR(INT0_vect){
PORTB ^= (1<<PORTB5);
}
void setup(){
  Serial.begin (9600);
//Configuration PORTB.5
DDRB |= B1000000; // PB5 en sortie
PORTB &= ~(1<<PORTB6); // PORTB.5 <-0
// Configuration PORTD.2/INT0
DDRD &= B11111011; // PD2 en entrée
PORTD |= (1<<PORTD2); // PORTD.2=1
// active pull-up
EIMSK |= 1; //IT INT0 prise en compte
EICRA = B10; // IT = front négatif sur PD2
sei(); // activation des IT (SREG.7=1)
}
void loop()
{Serial.println("boucle loop"); }
/*
Configuration
PORTB.5 en sortie = gestion de le LED
PORTD.2 en entrée avec pull-up interne activée = gestion du bouton poussoir
soit DDRD.2=0 ET PORTD.2=1 (cf 4.2 DIGITAL I/O)
Autorisation de la source d'IT INT0 : EIMSK= (0000 0001)b
Interruption sur front négatif sur INT0 : EICRA= (0000 0010)b soit ISC01=1 ISC00=0
 */

dfgh

#29
Sep 03, 2015, 07:44 pm Last Edit: Sep 03, 2015, 07:50 pm by dfgh
lorsque tu déclenches ton interruption, le prg doit faire un saut à une routine d'interruption vector N°2 ( pour INTO)

il te manque un truc comme ça:

#include <avr/interrupt.h>
ISR(PCINT0_vect)  attention, il semble qu'il y a eu chang de nom:INT0_vect
{
...
// Code to handle the event.
}

attention, il semble qu'il y a eu chang de nom: PCINT0_vect  devient INT0_vect
regardes là
http://www.nongnu.org/avr-libc/user-manual/group__avr__interrupts.html

Go Up