Premier point :
Le bootloader et le réglage des fuses n'ont rien à voir entre eux. Je persiste et signe.
Arduino fait tout en même temps pour que ce soit plus simple pour les utilisateurs, mais ce faisant ne simplifie pas la compréhension.
Deuxiéme point :
La fonction init() n'est pas dans le bootloader.
Arduino ne dit pas que tu écris un programme mais un schetch.
Ce n'est pas pour faire bien, c'est qu'il y a une différence.
Le programme que reçoit le compilateur c'est l'IDE arduino qui l'écrit en ajoutant ce qui manque aux fonctions que tu as écris.
Voilà le VRAI programme "main.cpp" transmis au compilateur : (on le trouve dans les fichiers de l'IDE).
/*
main.cpp - Main loop for Arduino sketches
Copyright (c) 2005-2013 Arduino Team. All right reserved.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <Arduino.h>
// Declared weak in Arduino.h to allow user redefinitions.
int atexit(void (* /*func*/ )()) { return 0; }
// Weak empty variant initialization function.
// May be redefined by variant files.
void initVariant() __attribute__((weak));
void initVariant() { }
void setupUSB() __attribute__((weak));
void setupUSB() { }
int main(void)
{
init();
initVariant();
#if defined(USBCON)
USBDevice.attach();
#endif
setup();
for (;;) {
loop();
if (serialEventRun) serialEventRun();
}
return 0;
}
Ce programme répond aux normes du C/C++.
Les fonctions "arduino" sont prédéclarées dans le fichier Arduino.h et tous les registres (Timer, mesure analogique, etc) y sont configurés à la mode Arduino dans la fonction init() qui fait partie de l'IDE Arduino.
Ce que j'ai dis, peut-être n'ai-je pas été clair, c'est de comparer les deux réglages : celui arduino, qui doit donner des valeurs de temps corrects, et ton réglage.
Le réglage des timers c'est une série de diviseurs sur l'horloge système.
Ce que j'ai en tête, c'est que si l'horloge du timer qui gère le temps est égale Fh/128 dans le cas arduino et Fh/16 dans le cas jfs59 et bien @jfs59 quand il veut un temps de 1 seconde ii faudra qu'il en demande 8 fois plus puisque le compteur du timer compte 8 fois plus vite.
Le seul risque que je vois, c'est que les compteurs comptant plus vite, ils déborderont plus vite et on n'aura moins que les 40 ou 50 jours de débordement de la fonction millis().
Je pense qu'il y a de la marge.
J'espère que maintenant que je me suis fais comprendre.
J'espère aussi que je ne me suis pas fichu le doigt dans l'œil jusqu'au coude dans mon raisonnement => même si je pense avoir raison, je n'évacue jamais la possibilité de me tromper.
Ceux qui refusent l'idée qu'ils peuvent se tromper ne font pas de vieux os dans le développement.
Danse l'atmega328p (le seul que je connaisse).
Le Timer 0 est affecté par Arduino pour la mesure de temps.
Ce qui fait que le réglage pour millis impose une fréquence d'environ 900 Hz pour la PWM gérée par T0 et T2 et environ 400 Hz pour les sorties pilotées par T1 qui est 16 bit et qui n'utilise pas le même format de PWM que T0 et T2.
Pour l'attiny85 je ne vois qu'une solution : lire la datasheet.
Question subsidiaire : qui a fait l'adaptation de l'attiny85 à l'IDE Arduino ?
C'est l'équipe Arduino ou c'est une équipe indépendante qui a pu faire des choix différents ?