ARDUINO UNO 16MHz

Bonjour,

Je travail actuellement avec une carte ARDUINO UNO mais je suis un peu limité niveau performance, je voulais donc savoir comment pourrais-je accélérer l'horloge interne pour avoir de meilleur résultats.

Merci

Tu peux monter jusqu'à 20MHz .. avec un crystal à 20MHz.

Sinon si tu as besoin de plus de performances, peut-être qu'il te faut autre chose qu'un ATmega.

Mais en fait je pense que mon microcontrôleur est assez puissant mais qu'il n'est pas programmé pour fonctionner au maximum de ses capacités.

Actuellement mes sorties tournent à 125KHz soit FOSC/128 et j'aimerais les configurer afin qu'elle tournent a FOSC/4 mais je ne trouve pas les commandes.

Bonjour,

iutGeii:
Actuellement mes sorties tournent à 125KHz soit FOSC/128 et j'aimerais les configurer afin qu'elle tournent a FOSC/4 mais je ne trouve pas les commandes.

Oublie arduino, prend le datasheet constructeur, regarde quels registres modifier et code directement en AVR C/C++.
Regarde aussi du coté du registre CLKPR (Clock Prescale Register) qui permet de choisir la fréquence interne du cpu et des périphériques.

ok merci, je vais regarder ça.

J'ai trouvé le bon registre mais quand je l'insère dans mon code il me met une erreur : "error: lvalue required as left operand of assignment", une idée ?

iutGeii:
J'ai trouvé le bon registre mais quand je l'insère dans mon code il me met une erreur : "error: lvalue required as left operand of assignment", une idée ?

C'est plus facile de t'aider avec le code...
T'aurais pas utilisé "=" à la place de "==" par hasard?

voila la partie initilisation du code, celle qui concerne l'horloge interne

void setup()
{
pinMode(Slave, OUTPUT);
pinMode(CLK, OUTPUT);
pinMode(MISO, OUTPUT);
digitalWrite(Slave, HIGH);

CLKPS0 = 0;
CLKPS1 = 0;
CLKPS2 = 0;
CLKPS3 = 0;
}

et les erreurs :

test_SPI_uno.cpp: In function 'void setup()':
test_SPI_uno:110: error: lvalue required as left operand of assignment
test_SPI_uno:111: error: lvalue required as left operand of assignment
test_SPI_uno:112: error: lvalue required as left operand of assignment
test_SPI_uno:113: error: lvalue required as left operand of assignment

Je pense qu'il manque un header ou quelque chose comme ça.
J'ai récement programmer une interruption sur une carte uno32 et il fallais inséré " extern "C" " avant d'utiliser les registres du pic, il faut peu être quelque chose comme ça...

iutGeii:
J'ai trouvé le bon registre mais quand je l'insère dans mon code il me met une erreur : "error: lvalue required as left operand of assignment", une idée ?

Tu peux nous recopier ici la ligne qui pose problème ?

Ce qui pose problème c'est :

CLKPS0 = 0;
CLKPS1 = 0;
CLKPS2 = 0;
CLKPS3 = 0;

Tout le reste du programme fonctionne correctement, en fichier d'entête j'ai juste #include <SPI.h>

Salut,

tu n'as pas introduit le type de variable : int, float, double etc.. Je pense :cold_sweat:
Du type :

int CLKPS0 = 0; // ou float etc..
    int CLKPS1 = 0;
    int CLKPS2 = 0;
    int CLKPS3 = 0;

Non ça ne viens pas de sa, se sont des variable qui doivetn déja être définit en interne, mais justement il doit me manquer un quelque chose qui lui permetrait d'aller chercher dans les librairies du microcontrôleur ou je ne sais où.

Yep!

Premièrement, la manipulation du registre requiert l'utilisation du c. Actuellement, tu ne fais que déclarer des variables qui ne modifieront en rien le registre, de plus comme ces valeurs sont reconnues par le système, un message d'erreur apparait.

Il te faudra utiliser la manipulation de bits pour ceci :

REGISTRE GENERAL |= (1 << OPTION_REGISTRE) // bit à 1 du bit OPTION_REGISTRE dans le REGISTRE_GENERAL
REGISTRE_GENERAL &= ~(1 << OPTION_REGISTRE) // bit à 0 du bit OPTION_REGISTRE dans le REGISTRE_GENERAL

Secondo, en mattant vite fait le datasheet de la famille des 328, il y a une procédure spécifique décrite page 36.

@+

Zoroastre.

Ton probléme est trés simple, CLKPS0, CLKPS1, ... sont des options de registre.
Tu doit donc assigner ces options au registre liée !
Le registre en question s'apelle CLKPR (voir mon 1er post).

Tu dois donc faire :

CLKPR &= ~((1 << CLKPS0) | (1 << CLKPS1) | (1 << CLKPS2) | (1 << CLKPS3));

Pour avoir CLKPS0 ~ CLKPS3 mis à 0.

Mais attention tu doit aussi suivre une procédure bien précise pour que les modif soit prise en compte !
Tu doit donc faire :

CLKPR &= ~((1 << CLKPS0) | (1 << CLKPS1) | (1 << CLKPS2) | (1 << CLKPS3));
CLKPR |= (1 << CLKPCE);

(Ps: un petit delai de stabilisation aprés ces deux lignes serait le bienvenu)

Je n'avais pas vu qu'il y avait une précédure spéciale pour modifier les registres, j'ai testé ce que vous me proposiez et le programme se compile, je testerais ça lundi.

Merci beaucoup pour vos conseils sa va bien m'aider et je ne pense pas que j'aurais trouver tout seul.

Salut,

J'avais publié il y a quelques mois des relevés mettant en évidence les gros défauts de la programmation arduino. Surtout au niveau des digitalWrite() et digitalRead(). Cet fonctions sont bien pour allumer ou éteindre des leds, mais quand il faut être rapide, alors il vaut mieux passer par PORTD |= 0x08 par exemple, pour mettre à 1 la pin 3 d'un arduino UNO (PORTD &= 0xF7 pour la mettre à 0). Le code est 7 à 8 fois plus léger et 20 fois plus rapide (un gain extraordinaire en quelque sorte).

J'ai retrouvé les relevés :

digitalWrite(3, !digitalRead(3));


T = 30 à 40µs (F = 25KHz à 33KHz), c'est même pas stable...

PORTD = PORTD ^ 0x08;


T = 1.9µs (F = 525KHz), et c'est super stable...
on doit pouvoir atteindre le MHz avec

PORTD |= 0x08;
PORTD &= 0xF7;

A toi de voir, je trouve mon exemple relativement parlant...

J'ai également déja lu des choses à ce propos, je testerais ça lundi matin, je vous tiens au courant. Et merci

Super_Cinci:
T = 1.9µs (F = 525KHz), et c'est super stable...
on doit pouvoir atteindre le MHz avec

PORTD != 0x08;

PORTD &= 0xF7;

Humm PORTD |= 0x08 plutôt, pourquoi != ? (Erreur de frappe ?)

skywodd:
Humm PORTD |= 0x08 plutôt, pourquoi != ? (Erreur de frappe ?)

Oui oui, erreur de frappe, corrigée. merci! (et non pas "merci|") :smiley: