Wie stelle ich die Taktgeschwindigkeitssicherungen auf einem ATtiny85 ein, wenn ich einen Arduino als Programmierer verwende?

Ich folge diesem Tutorial , programmiere den ATtiny85 mit einem Arduino und spiele damit einige Töne (über einen Piezo-Lautsprecher). Ich habe Probleme damit, die Töne auf die richtige Tonhöhe zu bringen (ich erstelle die Wellenformen manuell, da die Funktion tone() auf dem ATtiny85 nicht unterstützt wird).

Ich glaube, das Problem kann auf unterschiedliche Taktraten bei Arduino und ATtiny zurückzuführen sein. Ich verstehe, dass die Taktrate auf dem ATtiny geändert werden kann, wie erreiche ich dies mit der Arduino-Umgebung?

das ist übrigens echt cool, danke fürs teilen!
Hut ab! Ich habe es noch nie geschafft, meinen attiny85 auf diese Weise zu programmieren. Ich habe immer "programmer out of sync" -Fehler, wenn avrdude versucht, den Flash zu schreiben. Das Arduino mit einem Buspirat zu tauschen funktioniert aber ...
@Jon: Ich bin mir der Ursache für "Programmierer nicht synchron" sicher, aber mit AVR Studio können Sie die Programmierfrequenz anpassen. Möglicherweise gibt es eine ähnliche Option in avrdude, die einen Blick wert sein könnte, wenn Sie es jemals wieder versuchen

Antworten (7)

Ich glaube, die Arduino-Software (Bibliotheken und alle) geht davon aus, dass Sie mit 16 MHz arbeiten. Wenn Sie diese Annahme auf die Uhr anwenden, mit der Sie tatsächlich laufen, sollten die Dinge funktionieren. Angenommen, Sie betreiben den Tiny85 mit seinem internen Oszillator, denke ich, dass er mit 1 MHz läuft, also multiplizieren Sie einfach alle Ihre Verzögerungsanweisungen (und andere Zeitbegriffe) mit 16.

Wenn Sie eine höhere Genauigkeit als der interne Oszillator benötigen, sollten Sie über die Verwendung eines externen Kristalls oder eines Resonators nachdenken, aber Sie müssen die Sicherungseinstellungen des AVR ändern, damit dies funktioniert, und ich denke, Sie benötigen einen Programmierer wie den AVRISP mkII, um das mit AVR Studio zu machen (meine Empfehlung).

Ich weiß nicht viel über die ArduinoISP-Skizze, aber für mich sieht es so aus, als würde es das ISP-Protokoll ein bisschen knallen, um ein Programm auf den Zielchip (nicht den integrierten Mega328) hochzuladen, nicht sicher, ob es zum Manipulieren von Sicherungen ausgestattet ist. ArduinoISP ist hier dokumentiert http://arduino.cc/en/Tutorial/ArduinoISP , fwiw. Beachten Sie, dass Sie derzeit kein UNO verwenden können, um die ArduinoISP-Skizze auszuführen. Es sieht für mich nicht so aus, als könnten Sie die Skizze verwenden, um das Arduino zu einer brauchbaren Schnittstelle für die Verwendung der GUI-Tools von AVR Studio zu machen.

BEARBEITEN : Es sieht so aus, als ob das Zeug aufgeholt hat und ein UNO jetzt für ArduinoISP brauchbar ist - danke für alle Kommentare

Vielen Dank für die Hinweise zum UNO. Ich verwende tatsächlich einen Duemilanove, bei dem der 168-Chip gegen einen 328 ausgetauscht wurde, und kann die normalen ATtiny-Skizzen über ArduinoISP ordnungsgemäß hochladen. Ich werde deinen /16-Tipp ausprobieren!
@fearofours Sie wissen, dass Sie auch versuchen könnten, eine auf ArduinoISP basierende Skizze zu schreiben, die die Sicherungen auf einen bestimmten Wert setzt. Wenn ArduinoISP den Flash schreiben kann, gibt es keinen Grund, warum ich mir vorstellen kann, dass Sie das in den AVR-Datenblättern beschriebene ISP-Protokoll nicht bit-bangen könnten, um die Fuses einzustellen.
@fearoffours, ich habe auch gerade festgestellt (und den Beitrag aktualisiert), dass ich sagen soll, mit 16 multiplizieren, anstatt durch 16 zu dividieren (wenn Sie eine langsamere Uhr ausführen, werden mehr Ticks benötigt, um die gleiche Dauer zu erhalten).
Ich weiß, es ist über ein Jahr später, aber ich benutze und UNO erfolgreich als AVR-Programmierer. (Allerdings habe ich die ArduinoISP-Skizze geändert, um sie in ihrer Definition von zu delay(20)ersetzen .) delay(40)void heartbeat()
Ich weiß, dass es noch später ist, aber ich habe meinen Uno erfolgreich als AVR-Programmierer verwendet, ohne etwas an der Skizze zu ändern.

Ich verwende Arduino UNO + ArduinoISP erfolgreich.

Fügen -USie Ihrem avrdudeBefehl Flags hinzu, um eine oder alle der drei ATtiny-Sicherungen zu setzen.

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

Die Taktauswahl erfolgt in Bits[3:0] auf der dritten Sicherung ('Fuse Low Byte'). Stellen Sie sie wie folgt ein, um einen externen Quarz (mit 8 MHz oder schneller) zu verwenden:

-U lfuse:w:0x6f:m

Seine Definition (ich schließe daraus) muss etwa so lauten: [Fuse Low Byte]:[write]:[Hex-Wert]:[manuell einstellen]

Der Standardwert für die vier hohen Bits dieses Bytes ist 0110, also lassen Sie das 6in 0x6fso wie es ist und ändern Sie nur die zweite Ziffer, das f(der Standardwert ist 2).

NB: Wenn Ihre Prozesse länger oder kürzer dauern als erwartet, überprüfen Sie Ihren Clock-Prescaler und Ihre Definition von F _ CPU.

Ich wollte warnen, dass ich gerade meinen AtTiny85 gemauert habe, indem ich die obige -U lfuse:w:0x6f:mavrdude-Option verwendet habe. Ich muss es mit einem Hochspannungs-Setup zurücksetzen. Also ein Wort der Vorsicht an Leute (wie mich), die versuchen, Sicherungen zurückzusetzen, ohne zu wissen, was sie tun.
@MV Hast du es wirklich gemauert oder einfach nicht das externe XO verwendet, als du versucht hast, die Sicherung zurückzusetzen?
Hatte keine externe Uhr zu verwenden. Was bedeutet Mauern im engeren Sinne?
@JellicleCat, Wenn Sie die Sicherung so einstellen, dass sie ein externes XO verwendet, müssen Sie von da an ein externes XO verwenden, das an die MCU angeschlossen ist, um Sicherungen zu programmieren / einzustellen / zurückzusetzen. Wenn Sie dies nicht tun, haben Sie den Eindruck, dass die MCU gemauert ist (~ nicht mehr funktioniert), weil sie die Erweiterung benötigt. XO zu funktionieren, auch um es über ISP zu programmieren.
In Ordnung. Wenn ich die Sache verstehe, habe ich die Sicherungen so eingestellt, dass sie ein XO erwarten, und um den Chip dann wiederherzustellen, habe ich einen Arduino verwendet, um eine stehende Welle zu liefern, die für ein XO diente.
Selbstverschuldet, aber ich bin auch hier den Sicherungen gefolgt, ohne genau zu wissen, was es bedeutet. Erforderte einen zweiten Chip, der sich wie eine Uhr verhält, nur um eine erneute Neuprogrammierung zu ermöglichen.

Versuchen Sie, das zugehörige Tutorial derselben Gruppe (MIT's High-Low Tech) mit dem Titel Programming an ATtiny w/ Arduino 1.0 zu verwenden .

Eine kurze Zusammenfassung: Wählen Sie im Menü Tools -> Board in der Arduino IDE den ATtiny85 und die Frequenz aus, mit der Sie laufen möchten (1 oder 8 MHz interner Takt oder 20 MHz externer Quarz) und verwenden Sie dann Tools -> Bootloader brennen. Ich glaube, dass die Auswahl der gewünschten Geschwindigkeitskarte die Art und Weise ändert, wie die Verzögerung () und andere zeitbezogene Arduino-Funktionen funktionieren, um mit der Taktgeschwindigkeit zu synchronisieren.

Ich hatte mit diesem Ansatz selbst Erfolg mit einigen ATtiny84-Chips. Das einfache Blinkprogramm ist behoben, ebenso wie ein empfindlicheres Timing, das für die manuelle Steuerung von Impulsen erforderlich ist, die mit delayMicroseconds () an ein Servo gesendet werden.

Es scheint, dass Sie ArduinoISP verwenden, versuchen Sie es mit AVR Studio oder den Befehlszeilenoptionen für avrdude. Je nachdem, wie das ArduinoISP geschrieben wurde, kann es wie ein Atmel AVRISP mkII oder ähnlich funktionieren.

Ich dachte nicht, dass der Arduino selbst ein ISP-Programmierer ist - ich dachte, er hat einen ISP-Header, damit Sie einen neuen Bootloader auf einen neuen ATMega328 im Schaltkreis brennen können ...
Wenn Sie den Artikel genauer lesen, scheint es, als könnten Sie die ArduinoISP-Skizze dazu verwenden - Sie lernen jeden Tag etwas Neues! :)
AVR Studio ist in Ordnung, wenn Sie Windows verwenden. Beachten Sie, dass es ein AVR-Plugin für Eclipse gibt (dies unterscheidet sich von dem Arduino-Plugin, das als Sloeber bekannt ist). Es gibt einen raffinierten Sicherungsdialog, der unter Eigenschaften --> AVR verfügbar ist. Aber ja, das OP möchte nur die "Core" -Frequenzen und den "Burn Bootloader" verwenden.

Die Standardsicherungseinstellungen für das ATtiny85 sind: lfuse 0x62, hfuse 0xdf, efuse 0xff. Dies verwendet den internen RC-Oszillator (8 MHz) mit "Teilen durch 8", sodass der Takt 1 MHz beträgt.

Weitere Sicherungseinstellungen finden Sie unter http://www.engbedded.com/fusecalc .

Sie können avrdude immer noch direkt verwenden, um die Sicherungseinstellungen Ihres ATtiny85 zu ändern, selbst wenn Sie einen ArduinoISP als Programmierer verwenden.

Wenn Sie die Sicherung manuell ändern, um die Uhr zu ändern, müssen Sie die attiny85.build.f_cpuZeile Ihrer Datei [arduino_folder]\hardware\attiny45_85\boards.txt bearbeiten.

+1 Das ist wirklich nützlich, vor allem die Taktrate von 1 MHz, danke

Ich denke, Sie können die Sicherungen mit dem ArduinoISP setzen, aber nicht mit der Arduino IDE, sondern mit avrdude, überprüfen Sie diesen Link . Habe es selbst nie getestet.

Das Tutorial sagt ausdrücklich, dass Sie das Arduino UNO verwenden können, und ich habe es getestet und funktioniert, also kann ich das bestätigen, also ist die ArduinoISP-Seite veraltet und die UNO-Warnung sollte ignoriert werden. Wenn Ihr UNO eines aus der ersten Charge war, haben Sie wahrscheinlich einen fehlerhaften Bootloader, Sie müssen den Bootloader neu flashen. Weitere Informationen finden Sie auf dieser Seite (ignorieren Sie die Seriennummern, alle meine UNOs stammten nicht aus dieser Serie und hatten Probleme) .

Die portierten Core-Bibliotheken, die Sie aus dem Tutorial heruntergeladen haben, sind so geschrieben, dass sie den internen 1-MHz-Oszillator verwenden (bestätigt durch die Datei boards.txt), sodass das Timing-Problem möglicherweise in den portierten Core-Bibliotheken oder in Ihrem Code liegt.

Mit freundlichen Grüßen

  1. Wählen Sie ein ATTiny-Board aus "Boards Manager", das das ATTiny85 enthält. Dies ist im Menü "Extras". Ich denke, das schließt jetzt "16 MHz interne PLL" ein. (Sie können eines von http://drazzy.com/package_drazzy.com_index.json installieren )

  2. Wählen Sie bei Bedarf explizit ATTiny85 aus.

  3. Wähle eine Uhr. Bis Sie mehr wissen, wählen Sie eine interne Uhr.

  4. Klicken Sie als Menüpunkt auf "Bootloader brennen".

Achtung, bei sehr niedrigen Werten kann die MCU eventuell nicht mehr programmiert werden. Wenn dies Ihre Absicht ist, tun Sie dies zuletzt, es sei denn, Sie haben Ersatzteile oder einen Hochspannungsprogrammierer, um die Sicherungen zurückzusetzen.