Go Down

Topic: ARDUINO UNO 16MHz (Read 2738 times) previous topic - next topic

iutGeii

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

Benvenuto

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.

iutGeii

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.

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.

skywodd

Bonjour,


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.
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

iutGeii

ok merci, je vais regarder ç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 ?

patg_


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?
Mes Arduineries: http://breizhmakers.over-blog.com/

iutGeii

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...

Benvenuto


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 ?

iutGeii

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>

sype

Salut,

tu n'as pas introduit le type de variable : int, float, double etc.. Je pense  :smiley-roll-sweat:
Du type :
Code: [Select]
int CLKPS0 = 0; // ou float etc..
   int CLKPS1 = 0;
   int CLKPS2 = 0;
   int CLKPS3 = 0;

iutGeii

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ù.

zoroastre

#13
Jun 01, 2012, 05:38 pm Last Edit: Jun 02, 2012, 11:06 am by zoroastre Reason: 1
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 :

Quote
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.
Gné! ;)

skywodd

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 :
Code: [Select]
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 :
Code: [Select]
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)
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

Go Up