Pages: [1]   Go Down
Author Topic: Vitesse d'éxécution arduino uno r3  (Read 543 times)
0 Members and 1 Guest are viewing this topic.
BELGIUM - Liège
Offline Offline
Newbie
*
Karma: 0
Posts: 9
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Salut à tous, j'utilise une carte arduino uno avec un écran lcd de chez 4D systems, et pour tester la vitesse d’exécution, j'ai réalisé un petit programme tout simple, on pousse sur un bouton et on incrémente la valeur d'un compteur, mais même en bougeant tous les delay ce n'est toujours pas très rapide, serait-ce à cause de la communication série avec mon écran? Ou comment faire pour augmenter la vitesse?
Logged

france
Offline Offline
God Member
*****
Karma: 15
Posts: 850
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

delay() est une fonction bloquante, arduino ne fait rien pendant ce temps.
Utilise millis() à la place pour aller plus vite.
Exemple ici http://arduino.cc/en/Tutorial/BlinkWithoutDelay
Logged

Christian

France
Offline Offline
Faraday Member
**
Karma: 55
Posts: 5347
Arduino Hacker
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour,

Nous parler d'une vitesse d'exécution sans le code c'est contre productif ...

Rapidement :
- delay() est une fonction bloquante (logique c'est son but).
- Serial.print() est une fonction non bloquante mais qui peut ce bloquer si tu tente d'envoyer plus de 32 octets d'un coup (taille du buffer).
Logged

Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

BELGIUM - Liège
Offline Offline
Newbie
*
Karma: 0
Posts: 9
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Désolé j'ai été un peu trop bref dans mon explication, en fait je fais un programme qui gère un écran LCD et un contrôleur de moteur brushless pour un kit d'assistance électrique de vélo, et une des fonctions du µContrôleur est d'afficher la vitesse, donc je désire compter un certain nombre de pulse pendant 3 secondes dans un premier temps, j'accélèrerais ensuite si ça fonctionne bien.
Et pour la vitesse d'éxécution j'ai essayé mon programme sur le moniteur série arduino, et je me suis rendu compte que c'était bien la communication série avec l'écran 4D Systems qui ralenti mon système, sans ça l'arduino capte environ toute les 6 ms.

Voici le système de communication de chez 4D, vous pensez qu'il y a moyen de faire aller plus vite, en plus il y a autre chose que je ne comprend pas, la trame de communication ne se trouve pas dans la boucle, alors elle est exécutée quand? en permanence ou une fois a chaque cycle de la boucle?

//------------------4D Systems-----------------------------//
               
#define READ_OBJ 0x00
#define WRITE_OBJ 0x01
#define REPORT_OBJ 0x05
#define REPORT_EVENT 0x07

const uint16_t digit = 0x0F00;
const uint16_t led = 0x1300;

uint8_t on;
uint8_t off;
uint8_t command;
uint16_t object, value;
boolean flag;

uint8_t nacAck() {
delay(10);
while (!Serial.available());
return Serial.read(); // 0xc6 or 0xd5
}

//------------------------------------------------------------------------------------//

bool readMessage(uint8_t &command0, uint16_t &object0, uint16_t &value0) {
bool flag0 = false;
uint8_t buffer[6];
uint8_t checksum = 0x00;
uint8_t i=0;
              if (Serial.available()>0) {
              buffer = Serial.read();
              command0 = buffer[0];
              i++;
              checksum = command0;
              if (command0==REPORT_EVENT) {
              if (Serial.available()>3) {
              buffer = Serial.read();
              checksum ^= buffer;
              i++;
              buffer = Serial.read();
              checksum ^= buffer;
              i++;
              object0 = buffer[1]<<8 | buffer[2];
              buffer = Serial.read();
              checksum ^= buffer;
              i++;
              object0 = buffer[1]<<8 | buffer[2];
              buffer = Serial.read();
              checksum ^= buffer;
              i++;
              value0 = buffer[3]<<8 | buffer[4];
              }
           }
      flag0 = (checksum==Serial.read());
    }
return flag0;
}


bool sendMessage(uint8_t command0, uint16_t object0, uint16_t value0) {
bool flag0 = false;
            uint8_t buffer[6];
            uint8_t checksum = 0x00;
            uint8_t i=0;
            buffer = command0;
            checksum = command0;
            i++;
            buffer = object0 >>8;
            checksum ^= buffer;
            i++;
            buffer = object0 & 0xff;
            checksum ^= buffer;
            i++;
            buffer = value0 >>8;
            checksum ^= buffer;
            i++;
            buffer = value0 & 0xff;
            checksum ^= buffer;
            i++;
            buffer = checksum;
            i++;
Serial.write(buffer, i);
delay (1);
return (nacAck()==0x06);
}

//---------------------------------------------------------------------------//
Logged

Pages: [1]   Go Up
Jump to: