Baisser la consommation de courant, possible ?

Dans la doc de avr_libc tu as ici
http://www.nongnu.org/avr-libc/user-manual/group__avr__power.html
en faisant un #include <avr/power.h> accès à ces macros pour limiter la conso de courant pour le 168 (en eteignant des périphériques qui te servent pas)

power_adc_disable()
power_spi_disable()
power_twi_disable()

Si tu n'as pas besoin de communiquer par l'usb
power_usart0_disable()

sur les 3 timers je pense que tu peux en éteindre 2 sans pb (mais il faut garder celui utilisé par millis ou delay).
power_timer0_disable()
power_timer1_disable()
power_timer2_disable()

Perso j'ai jamais essayé mais fais nous un retour sur les mesures de courant observées en éteignant chacun des modules.

Nicolas

tu as aussi ca http://www.nongnu.org/avr-libc/user-manual/group__avr__sleep.html qui correspond plus a ce que tu veux faire.
Je suis un peu surpris que personne sur le forum en english ait essayé ça.

Nicolas

Merci pour tes réponses.

Est-ce que c'est possible de programmer ça directement depuis l'IDE Arduino ?

Je crois que Benoit Rousseau avait fait une horloge numérique qui utilise le mode interrupt(), mais j'ai pas trop compris ::slight_smile:

pour l'include de <avr/power.h> j'ai en effet des soucis (arduino 11 sous linux) mais pour <avr/sleep.h> aucun pb
J'ai d'ailleurs trouvé qq chose sur le playgroud
http://www.arduino.cc/playground/Learning/ArduinoSleepCode

Nicolas

La librairie sleep.h, je l'ai trouvée, mais pas la power.h.
J'ai trouvé quelques choses sur le site koders, mais je sais pas si c'est la bonne librairies.

Voilà le résultat de mes essais avec sleep.h.

Il existe cinq modes différents :

SLEEP_MODE_IDLE
SLEEP_MODE_ADC
SLEEP_MODE_PWR_SAVE
SLEEP_MODE_STANDBY
SLEEP_MODE_PWR_DOWN

Le premier est le seul où l'horloge tourne et consomme autant qu'en mode normal, avec tous les autres elle ne tourne pas,

il faut vraiment que j'arrive à faire ça avec power.h :-?

Tu utilises bien un atmega168 dans ta définition des board de l'arduino ?
et tu fais bien un

#include <avr/power.h>

Nicolas

J'utilise l'onglet "Tools" dans L'IDE Arduino 010 , et je configure sous "diecimila".

Je fais bien un #include<avr/power.h>, mais je n'avais pas cette librairies dans le Pack Arcuino 010, j'ai été chercher cette lib le net qu j'ai trouver sur un site qui s'appelle "Koders".
L'auteur de la librairies est le même que celui de sleep.h donc je pense que c'est la bonne.

Mais je n'arrive pas à trouver comment mettre mon code, pour sleep j'avais trouvé des exemples.

comment sais tu que tu n'as pas la lib ?
tu es allé voir dans ton .../avr/include/avr/ (sur mon linux c'est dans /usr/avr/include/avr/power.h) ?
Essaye de setter une autre board (genre NG atmega168 pour voir si ca marche la compil).

Nicolas

J'ai regardé dans tout mes dossiers et même en faisant la fonction "rechercher" je ne l'a trouve pas.

Elle devrait être dans le même dossier que celui où se trouve sleep.h ?

Je suis au travail donc je peux pas regarder mais je viens de jeter un oeil sur les releases notes de la version 12 ils parlent de :

  • Upgraded to newer versions of avr-gcc (4.3.0) and avr-libc (1.6). This
    provides support for newer Atmel chips, but may increase the size
    of sketches.

Peut etre qu'en passant à cette version de avr-libc tu auras la lib ?

Nicolas

Je confirme : je viens de comparer les distributions en version 10 et 12 pour mac et tu as power.h uniquement sur la 12.

Bonne suite.

Nicolas

Je me suis remis à jour en installant la 012, je ferais un essai comme ça. :wink:

Petit essai avec power.h :slight_smile:

power_adc_disable() gain de 0,2 mA
power_spi_disable() gain de 0,2 mA
power_twi_disable() gain de 0,0 mA

power_usart0_disable() gain de 0,1 mA

power_timer0_disable() utilisé par millis ou delay
power_timer1_disable() gain de 0,05 mA
power_timer2_disable() gain de 0,05 mA

Soit un gain total de 0,6 mA , je me retrouve avec 9,9 mA :wink:

Si c'est possible de descendre encore un peu... ::slight_smile:

Il me semble que le fait d'avoir utilisé ces macros me fait perdre 15 µseconde par seconde... c'est pas lourd, mais sur 24 heures ça fait pas loin de 10 secondes (avec un quartz de 2Mhertz).

Donc mon horloge retardera de 1 minute pour 6 jours, 10 minutes en 2 mois... :frowning: il faut que je rajoute un fonction pour la correction.

Je fais des essais avec un quartz de 32.768 kHz, mais il me semble que cela ne change rien par rapport au quartz de 1MHz, je suis toujours aux alentours de 10 mA.

Selon ce qui était dit dans un post plus haut la fonction delay() serait gourmande en courant, donc j'ai changé d'option et j'ai réécris le programme avec des boucle comme mesure de temps, je ne note pas de différence par rapport à l'ancien programme.

Je suis toujours aux alentour de 10-11 mA :-?

tu devrais peut etre te repencher sur le sleep.h

J'ai qd meme l'impression en lisant la datasheet en diagonale que tu as un timer (le 2) qui reste actif et qui donc est utilisable pour faire une horloge

Nicolas

Je vais regarder ça plus en détail...

En lisant le data sheet de l'atmega168 , il me semble qu'il a beaucoup de fonction que l'on peut éteindre, il faut encore voir comment ce serait possible de le faire.

Est ce qu'il est possible de passer par l'IDE Arduino pour programmer l'horloge interne, et n'utiliser un quartz externe 32,768 kHz que pour cadencer l'horloge ?

Petit essai ce matin avec la fonction "attachInterupt", je balance un signal d'horloge sur la pin digital 2 ou 3. Le signal d'horloge est donné par un oscillateur-diviseur cadencé par un quartz 32.768 kHz.
Le signal d'horloge récupéré est de 8 Hz, je le divise ensuite par 16 avec l'atmega. En utilisant power.h et sleep.h j'arrive à moins de 8mA pour le tout, oscillateur compris.

Le timer 0 est en fonction car il me permet d'incrémenter la variable (++) avec laquelle j'arrive à diviser mes 8Hz.