Modifier la fréquence du quartz de l'Atmega328P

Bonjour,
Je cherche un moyen de diminuer la consommation électrique des petits projets que je fais avec un arduino breadboard en jouant sur la fréquence de l'horloge. J'ai réussi via le mode sleep à diminuer drastiquement cette consommation. Je souhaiterai également voir les effets d'une baisse de fréquence. Avez-vous une ligne de programmation (utilisant l'IDE Arduino) permettant d'arriver à passer de 16Mhz à 8Mhz par exemple?
Merci d'avance.

Salut

un arduino breadboard

Je suppose que tu veux parler d'un ATMage328P en boîtier DIP ?

@+

Bonjour,

Tu peux utiliser la clock interne à 8MHz. Voir ici (chapitre “Minimal Circuit (Eliminating the External Clock)”).

kamill:
Bonjour,

Tu peux utiliser la clock interne à 8MHz. Voir ici (chapitre "Minimal Circuit (Eliminating the External Clock)").

Merci de ton retour. Je vais essayer en espérant que cela marche avec la version 1.85 de l'IDE. Sur ton lien il semble que cela fonctionne avec la version 1.6.
Il s'agit bien de l'atmega328P DIP pour répondre à la précédente question.

Si je veux descendre à 4, 2 ou 1 MHz, as-tu une autre astuce?

Merci

Oui, la version pour 1.6 fonctionne avec l'IDE 1.85. Tu vas simplement avoir un message de warning, si tu veux le supprimer voir ma réponse à un post précédent ici.

Le problème d'utiliser une fréquence plus faible est entre autre qu'il faut adapter le boot loader à cette fréquence. Il faudrait des fichiers board pour ces fréquences.

Ici un tuto qui semble interessant pour ton problème (je n'ai pas essayé).

kamill:
Oui, la version pour 1.6 fonctionne avec l'IDE 1.85. Tu vas simplement avoir un message de warning, si tu veux le supprimer voir ma réponse à un post précédent ici.

Le problème d'utiliser une fréquence plus faible est entre autre qu'il faut adapter le boot loader à cette fréquence. Il faudrait des fichiers board pour ces fréquences.

Ici un tuto qui semble interessant pour ton problème (je n'ai pas essayé).

Parfait, cela répond intégralement à ma question! Super.
Merci.

gaelcom:
Bonjour,
Je cherche un moyen de diminuer la consommation électrique des petits projets que je fais avec un arduino breadboard en jouant sur la fréquence de l'horloge. J'ai réussi via le mode sleep à diminuer drastiquement cette consommation. Je souhaiterai également voir les effets d'une baisse de fréquence. Avez-vous une ligne de programmation (utilisant l'IDE Arduino) permettant d'arriver à passer de 16Mhz à 8Mhz par exemple?
Merci d'avance.

Salut,
Tu peux aussi moduler la fréquence de l'Arduino de manière dynamique en modifiant le registre CLKPR.
exemple:

  cli(); // on stop les interruptions 
  CLKPR = 0x80; // activer le bit7 avant l'écriture
  CLKPR = 0x0X; // où x est le prédiviseur exprimé en puissance de 2, de 0 à 8 (division de 1 à 256)
  sei(); // on rétablit les interruptions

Bien sûr, toutes les fonctions de temps en serons affectées.
A 4Mhz ou moins, tu peux baisser le tension à 1,8V et gagner beaucoup à fréquence égale.
Et bien sur utiliser un Arduino pro.

Il est aussi possible de mettre en service un diviseur par 8 en agissant sur les fuses avec avrdude en ligne de commande.
Il est aussi possible de désactiver les modules qui ne sont pas utilisé voir Gammon Forum : Electronics : Microprocessors : Power saving techniques for microprocessors

ChristopheFr:
Salut,
Tu peux aussi moduler la fréquence de l’Arduino de manière dynamique en modifiant le registre CLKPR.
exemple:

  cli(); // on stop les interruptions 

CLKPR = 0x80; // activer le bit7 avant l’écriture
 CLKPR = 0x0X; // où x est le prédiviseur exprimé en puissance de 2, de 0 à 8 (division de 1 à 256)
 sei(); // on rétablit les interruptions



Bien sûr, toutes les fonctions de temps en serons affectées.
A 4Mhz ou moins, tu peux baisser le tension à 1,8V et gagner beaucoup à fréquence égale.
Et bien sur utiliser un Arduino pro.

J’ai essayé en rajoutant le registre CLKPR avec le sketch Blink classique (je n’ai pas mis cli(); ni sei(); ça marche malgré tout) . Cela fonctionne en mettant CLKPR=0x01 pour être à 8MHz. La durée d’une seconde de clignotement passe à deux; c’est la preuve que la fréquence a été divisée par deux. Par contre impossible de parvenir à ce résultat en utilisant la bibliothèque LowPower. Peut importe la fréquence que je choisis, la led continue de battre au même rythme. Le LowPower et CLKPR ne sont pas compatibles?
Ci-dessous mon code:

include <LowPower.h> // Appel librairie pour économiser batterie

// the setup function runs once when you press reset or power the board
void setup() {
// initialize digital pin LED_BUILTIN as an output.
pinMode(LED_BUILTIN, OUTPUT);

CLKPR=0x80; // va de paire avec la ligne dessous
CLKPR=0x01; // pour passer de 16Mhz à 8Mhz. si on change de fréquence on garde quand même la ligne au dessus

}

// the loop function runs over and over again forever
void loop() {
digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level)
LowPower.powerDown (SLEEP_4S, ADC_OFF, BOD_OFF);

digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW
LowPower.powerDown (SLEEP_4S, ADC_OFF, BOD_OFF);
}

68tjs:
Il est aussi possible de mettre en service un diviseur par 8 en agissant sur les fuses avec avrdude en ligne de commande.
Il est aussi possible de désactiver les modules qui ne sont pas utilisé voir Gammon Forum : Electronics : Microprocessors : Power saving techniques for microprocessors

Je suis aller sur le lien. Comment utiliser cette ligne de commande:

avrdude -c usbtiny -p m328p -U lfuse:w:0xE2:m

Directement dans l'IDE Arduino? Je n'y suis pas parvenu.
Merci de ton aide.

Pourquoi dans l'IDE ?
Personnellement je modifie les fuses en ligne de commande.

@+

hbachetti:
Pourquoi dans l'IDE ?
Personnellement je modifie les fuses en ligne de commande.

@+

Je ne connais pas ce principe de ligne de commande. Je passe par l'IDE pour la programmation. Comment faut-il procéder?

gaelcom:
J'ai essayé en rajoutant le registre CLKPR avec le sketch Blink classique (je n'ai pas mis cli(); ni sei(); ça marche malgré tout) .

Les deux instructions doivent s'exécuter à la file, si une interruption survient entre-temps, l'instruction échoue.

gaelcom:
Par contre impossible de parvenir à ce résultat en utilisant la bibliothèque LowPower. Peut importe la fréquence que je choisis, la led continue de battre au même rythme. Le LowPower et CLKPR ne sont pas compatibles?
Ci-dessous mon code:
[...]
LowPower.powerDown (SLEEP_4S, ADC_OFF, BOD_OFF);

sleep utilise le RC interne, il est possible qu'il n'en tienne pas compte, à vérifier dans le datasheet:
http://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-42735-8-bit-AVR-Microcontroller-ATmega328-328P_Datasheet.pdf

gaelcom:
Je ne connais pas ce principe de ligne de commande. Je passe par l'IDE pour la programmation. Comment faut-il procéder?

Ca dépend de ton OS, demande à Google "ouvrir console windows"

ChristopheFr:
Les deux instructions doivent s'exécuter à la file, si une interruption survient entre-temps, l'instruction échoue.

Ok c'est plus clair ainsi.

ChristopheFr:
sleep utilise le RC interne, il est possible qu'il n'en tienne pas compte, à vérifier dans le datasheet:
http://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-42735-8-bit-AVR-Microcontroller-ATmega328-328P_Datasheet.pdf

De la lecture en perspective...

ChristopheFr:
Ca dépend de ton OS, demande à Google "ouvrir console windows"

Il faut faire F12 et j'ai la console qui s'affiche. Ensuite pourrais-tu me donner la marche à suivre ou un tuto correspondant si c'est trop fastidieux?

avrdude -c usbtiny -p m328p -U lfuse:w:0xE2:m
Directement dans l'IDE Arduino? Je n'y suis pas parvenu.

Je ne connais pas ce principe de ligne de commande. Je passe par l'IDE pour la programmation. Comment faut-il procéder?

La ligne de commande est quelque chose de fantastique quand on sait s'en servir, non quand on a fait l'effort d'apprendre à s'en servir.
Si tu veux c'est du vieux "DOS" que micro$ nous dit qu'il n'existe plus mais qui est encore toujours partout dans Windows.
Sous Linux tout peut se faire en graphique ou en ligne de commande selon son choix personnel, sous Windows c'est possible dans certain cas en appelant une "console" mais vu que j'ai laissé tombé windaude depuis plus de 15 ans je n'y connais plus rien.

L'IDE ne permet pas ces manipulations parce que c'est contraire aux choix faits par l'équipe Wiring, qu'Arduino a forké.
Avec l’environnement Wiring/Arduino tout doit être identique, aucune place pour la fantaisie .
D'autre part en jouant sur la fréquence d'horloge toutes les fonctions de gestion du temps deviennent fausses ce qui n'est pas acceptable dans le cadre de l'environnement Wiring/Arduino.
Cette IDE est conçue pour des débutants et c'est bien connu que si on veut progresser vite il faut savoir rester simple et avoir des premiers objectifs modestes afin d'acquérir des bases solides.

Ce que tu veux faire sort de cette optique et entre dans du spécialisé. Il faut donc oublier le confort de l'IDE Wiring/Arduino et accepter de lire des datasheets et de la documentation en anglais.
Dans le cas présent pour modifier les fuses et activer le diviseur par 8:
datasheet du micro qui équipe la carte Arduino ou clone.
Datasheet du logiciel avrdude (conçu par le fabrican du micro, Atmel, et non pas par Arduino)

Mais ce n'est pas la seule méthode possible. Tu peux mettre le micro en sommeil. Si tu n'utilise pas des modules comme le SPI ou l'I2C (ou autres) tu peux aussi désactiver l'horloge de ces modules ce qui stoppera leur consommation.

68tjs:
La ligne de commande est quelque chose de fantastique quand on sait s'en servir, non quand on a fait l'effort d'apprendre à s'en servir.
Si tu veux c'est du vieux "DOS" que micro$ nous dit qu'il n'existe plus mais qui est encore toujours partout dans Windows.
Sous Linux tout peut se faire en graphique ou en ligne de commande selon son choix personnel, sous Windows c'est possible dans certain cas en appelant une "console" mais vu que j'ai laissé tombé windaude depuis plus de 15 ans je n'y connais plus rien.

L'IDE ne permet pas ces manipulations parce que c'est contraire aux choix faits par l'équipe Wiring, qu'Arduino a forké.
Avec l’environnement Wiring/Arduino tout doit être identique, aucune place pour la fantaisie .
D'autre part en jouant sur la fréquence d'horloge toutes les fonctions de gestion du temps deviennent fausses ce qui n'est pas acceptable dans le cadre de l'environnement Wiring/Arduino.
Cette IDE est conçue pour des débutants et c'est bien connu que si on veut progresser vite il faut savoir rester simple et avoir des premiers objectifs modestes afin d'acquérir des bases solides.

Ce que tu veux faire sort de cette optique et entre dans du spécialisé. Il faut donc oublier le confort de l'IDE Wiring/Arduino et accepter de lire des datasheets et de la documentation en anglais.
Dans le cas présent pour modifier les fuses et activer le diviseur par 8:
datasheet du micro qui équipe la carte Arduino ou clone.
Datasheet du logiciel avrdude (conçu par le fabrican du micro, Atmel, et non pas par Arduino)

Mais ce n'est pas la seule méthode possible. Tu peux mettre le micro en sommeil. Si tu n'utilise pas des modules comme le SPI ou l'I2C (ou autres) tu peux aussi désactiver l'horloge de ces modules ce qui stoppera leur consommation.

Merci de ton explication. Je viens d'ouvrir la boîte de pandore...Compulser les datasheets et des tutos en anglais ne me fait pas peur. Je vais voir ce que je peux trouver sur la toile à ce sujet.