Comment régler les fusibles de vitesse d'horloge sur un ATtiny85 lorsque j'utilise un Arduino comme programmeur?

17

Je suis en train de suivre ce tutoriel , de programmer l'ATtiny85 avec un Arduino, de l'utiliser pour jouer quelques sons (via un haut-parleur piézo). J'ai du mal à obtenir les tons à la bonne hauteur (je crée les formes d'onde manuellement, car la fonction tone () n'est pas prise en charge sur l'ATtiny85).

Je crois que le problème peut être dû à des vitesses d'horloge différentes sur l'Arduino et ATtiny. Je comprends que la vitesse d'horloge peut être modifiée sur ATtiny, comment puis-je accomplir cela en utilisant l'environnement Arduino?

peuroffours
la source
au fait c'est vraiment cool, merci pour le partage!
vicatcu
Chapeau! Je n'ai jamais réussi à programmer mon attiny85 de cette façon .. J'ai toujours des erreurs de "programmeur désynchronisé" quand avrdude tente d'écrire le flash. Échanger l'arduino avec un pirate de bus fonctionne bien ...
JonathanD
@ Jon: Je ne suis pas sûr de la cause profonde du "programmeur désynchronisé", mais avec AVR Studio vous pouvez ajuster la fréquence de programmation. Il peut y avoir une option similaire dans avrdude, cela pourrait valoir le coup si vous lui donnez un tourbillon à nouveau
Nick T

Réponses:

2

Je crois que le logiciel Arduino (bibliothèques et tous) suppose que vous travaillez à 16 MHz. Si vous appliquez cette hypothèse à l'horloge à laquelle vous exécutez réellement ... les choses devraient s'arranger. En supposant que vous exécutez le Tiny85 sur son oscillateur interne, je pense qu'il fonctionne à 1 MHz, alors multipliez simplement toutes vos déclarations de retard (et autres notions de temps) par 16.

Si vous avez besoin d'une meilleure précision que celle fournie par l'oscillateur interne, vous devriez penser à utiliser un cristal externe ou un résonateur, mais vous devrez modifier les paramètres de fusible de l'AVR pour que cela fonctionne, et je pense que vous aurez besoin d'un programmeur comme l'AVRISP mkII pour le faire avec AVR Studio (ma recommandation).

Je ne sais pas grand-chose sur l'esquisse ArduinoISP, mais pour moi, il semble que le protocole ISP frappe un peu pour télécharger un programme sur la puce cible (pas le Mega328 intégré), pas sûr qu'il soit équipé pour manipuler des fusibles. ArduinoISP est documenté ici http://arduino.cc/en/Tutorial/ArduinoISP , fwiw. Notez que vous ne pouvez pas utiliser un UNO actuellement pour exécuter l'esquisse ArduinoISP. Il ne me semble pas que vous puissiez utiliser l'esquisse pour faire de l'Arduino une interface viable pour l'utilisation des outils GUI d'AVR Studio.

EDIT : Il semble que les choses se soient rattrapées et un UNO est viable pour ArduinoISP maintenant - merci pour les commentaires tous

vicatcu
la source
Merci pour les informations concernant l'UNO, j'utilise en fait un Duemilanove avec la puce 168 remplacée par une 328, et je peux obtenir les croquis ATtiny normaux à télécharger correctement via ArduinoISP. Je vais essayer votre astuce / 16!
fearoffours
@fearoffours Vous savez une autre chose que vous pourriez essayer d'écrire un croquis basé sur ArduinoISP qui définit les fusibles à une certaine valeur. Si ArduinoISP peut écrire le Flash, il n'y a aucune raison que je puisse penser que vous ne pouviez pas bang-bang le protocole ISP décrit dans les fiches techniques AVR pour définir les fusibles.
vicatcu
1
@fearoffours, je viens également de réaliser (et de mettre à jour le post) de dire multiplier par 16 au lieu de diviser par 16 (votre exécution d'une horloge plus lente, il faudra plus de tics pour obtenir la même durée)
vicatcu
Je sais que c'est plus d'un an plus tard, mais j'utilise avec succès et UNO comme programmeur AVR. (Cependant, j'ai modifié le croquis ArduinoISP pour l' delay(20)installer delay(40)dans sa définition de void heartbeat().)
JellicleCat
Je sais que c'est encore plus tard, mais j'ai utilisé avec succès mon Uno en tant que programmeur AVR sans rien changer dans le croquis.
ingh.am
4

J'utilise Arduino UNO + ArduinoISP avec succès.

Ajoutez des -Uindicateurs à votre avrdudecommande pour définir l'un ou l'ensemble des trois fusibles ATtiny.

avrdude -p attiny85 -P com8 -c stk500v1 -b 19200 -U lfuse:w:0x6f:m -U flash:w:main.hex

La sélection de l'horloge se fait en bits [3: 0] sur le troisième fusible ('Fuse Low Byte'). Réglez-les comme suit pour utiliser un cristal externe (de 8 MHz ou plus rapide):

-U lfuse:w:0x6f:m

Sa définition (je déduis) doit être quelque chose comme: [Fuse Low Byte]: [écriture]: [valeur hexadécimale]: [définie manuellement]

La valeur par défaut pour les quatre bits de poids fort de cet octet est 0110, alors laissez le 6in 0x6ftel quel et ne changez que le deuxième chiffre, le f(sa valeur par défaut est 2).

NB: Si vos processus prennent plus ou moins de temps que prévu, vérifiez votre prédécaleur d'horloge et votre définition de F _ CPU.

JellicleCat
la source
Je voulais vous avertir que je viens de briquer mon AtTiny85 en utilisant l' -U lfuse:w:0x6f:moption avrdude ci-dessus . Je vais devoir le réinitialiser à l'aide d'une configuration haute tension. Donc, un mot d'avertissement aux gens (comme moi) qui essaient de réinitialiser les fusibles sans savoir ce qu'ils font.
MV
@MV L'avez-vous vraiment briquée ou n'avez tout simplement pas utilisé le XO externe lorsque vous avez essayé de réinitialiser le fusible?
Damd
Il n'y avait pas d'horloge externe à utiliser. Que signifie la brique au sens strict?
JellicleCat
@JellicleCat, Si vous configurez le fusible pour utiliser un XO externe, vous devrez utiliser un XO externe attaché au MCU à partir de là pour programmer / régler / réinitialiser les fusibles. Ne pas le faire, vous donnera l'impression que le MCU est maçonné (~ ne fonctionne plus) car il a besoin de l'ext. XO pour fonctionner, même pour le programmer via ISP.
Damd
Bien. Si je comprends bien, j'ai réglé les fusibles pour attendre un XO, puis pour restaurer la puce, j'ai utilisé un Arduino pour fournir une onde stationnaire, qui a servi de XO.
JellicleCat
3

Essayez d'utiliser le didacticiel correspondant du même groupe (High-Low Tech du MIT) intitulé Programmation d'un ATtiny avec Arduino 1.0 .

Un résumé rapide: Dans le menu Outils-> Carte dans l'IDE Arduino, sélectionnez l'ATtiny85 et la fréquence à laquelle vous souhaitez fonctionner (horloge interne de 1 ou 8 Mhz, ou cristal externe de 20 Mhz), puis utilisez Outils -> Graver Bootloader " Je crois que la sélection de la carte de vitesse souhaitée modifie la façon dont le retard () et d'autres fonctions Arduino liées au temps fonctionnent afin de se synchroniser avec la vitesse d'horloge.

J'ai moi-même réussi cette approche en utilisant des puces ATtiny84. Le programme de clignotement simple est fixe, ainsi que la synchronisation plus sensible requise pour contrôler manuellement les impulsions envoyées à un servo à l'aide de delayMicroseconds ().

Tom B
la source
1

Il semble que vous utilisez ArduinoISP, essayez d'utiliser AVR Studio ou les options de ligne de commande pour avrdude. Selon la façon dont l'ArduinoISP a été écrit, il peut fonctionner comme un Atmel AVRISP mkII ou similaire.

Nick T
la source
Je ne pensais pas que l'Arduino était lui-même un programmeur ISP - je pensais qu'il avait un en-tête ISP dessus pour que vous puissiez graver un nouveau bootloader sur un ATMega328 frais en circuit ...
vicatcu
en lisant l'article de plus près, il semble que vous pouvez utiliser le croquis ArduinoISP pour ce faire - vous apprenez quelque chose de nouveau chaque jour! :)
vicatcu
AVR studio est OK si vous êtes sous Windows. Sachez qu'il existe un plugin AVR pour Eclipse (différent du plugin Arduino connu sous le nom de Sloeber). Il y a un dialogue de fusible astucieux disponible sous Propriétés -> AVR. Mais oui, l'OP veut juste utiliser les fréquences "de base" et "Burn Bootloader".
mckenzm
1

Les paramètres de fusible par défaut pour l'ATtiny85 sont: lfuse 0x62, hfuse 0xdf, efuse 0xff. Celui-ci utilise l'oscillateur RC (8 MHz) interne avec "division par 8", l'horloge est donc de 1 MHz.

Voir http://www.engbedded.com/fusecalc pour plus de paramètres de fusible.

Vous pouvez toujours utiliser avrdude directement pour modifier les paramètres de fusible de votre ATtiny85 même lorsque vous utilisez un ArduinoISP comme programmeur.

Si vous attiny85.build.f_cpufinissez par changer manuellement le fusible pour modifier l'horloge, veillez à modifier la ligne de votre fichier [arduino_folder] \ hardware \ attiny45_85 \ boards.txt.

Craig
la source
+1 cela est vraiment utile, en particulier la vitesse d'horloge étant de 1 MHz, merci
fearoffours
0

Je pense que vous pouvez définir les fusibles avec l'ArduinoISP, mais pas avec l'IDE Arduino mais avec avrdude, vérifiez ce lien . Je ne l'ai jamais testé moi-même.

Le tutoriel dit explicitement que vous pouvez utiliser Arduino UNO et je l'ai testé et travaillé, donc je peux le confirmer, donc la page ArduinoISP est obsolète et l'avertissement UNO doit être ignoré. Si votre UNO faisait partie du premier lot, vous avez probablement un chargeur de démarrage défectueux, vous devrez reflasher le chargeur de démarrage. Consultez cette page pour plus d'informations (ignorez les numéros de série, tous mes UNO n'étaient pas de cette série et avaient des problèmes).

Les bibliothèques de base portées que vous avez téléchargées à partir du didacticiel sont écrites pour utiliser l'oscillateur interne de 1 MHz (confirmé à partir du fichier boards.txt), donc peut-être que le problème de synchronisation peut être dans les bibliothèques de base portées ou dans votre code.

Sincères amitiés

Havok
la source
0
  1. Choisissez une carte ATTiny dans le "gestionnaire de cartes" qui inclut l'ATTiny85. C'est dans le menu "Outils". Je pense que cela inclut maintenant "PLL interne 16 MHz". (Vous pouvez en installer un sur http://drazzy.com/package_drazzy.com_index.json )

  2. Sélectionnez ATTiny85 explicitement si nécessaire.

  3. Choisissez une horloge. Jusqu'à ce que vous en sachiez plus, choisissez une horloge interne .

  4. Cliquez sur "Graver Bootloader" comme élément de menu.

Attention, vous ne pourrez peut-être plus programmer le MCU si vous choisissez des valeurs très basses. Si c'est votre intention, faites-le en dernier, sauf si vous avez des pièces de rechange ou un programmateur haute tension pour réinitialiser les fusibles.

mckenzm
la source