Come posso impostare i fusibili della velocità di clock su un ATtiny85 quando uso un Arduino come programmatore?


17

Sto seguendo questo tutorial , programmando ATtiny85 con un Arduino, utilizzandolo per riprodurre alcuni toni (attraverso un altoparlante piezoelettrico). Sto lottando per ottenere i toni con l'intonazione corretta (sto creando manualmente le forme d'onda, poiché la funzione tone () non è supportata su ATtiny85).

Credo che il problema potrebbe essere dovuto alle diverse velocità di clock su Arduino e ATtiny. Capisco che la velocità di clock può essere modificata su ATtiny, come posso farlo usando l'ambiente arduino?


tra l'altro è davvero bello, grazie per averlo condiviso!
Vicatcu,

Giù i cappelli! Non sono mai riuscito a programmare il mio attiny85 in questo modo .. Ho sempre errori di "programmatore fuori sincrono" quando avrdude tenta di scrivere il flash. Scambiare l'arduino con un pirata di autobus funziona però ...
JonathanD

@Jon: Non sono sicuro della causa alla base di "programmatore fuori sincrono", ma con AVR Studio puoi regolare la frequenza di programmazione. Potrebbe esserci un'opzione simile in avrdude, potrebbe valere la pena dare un'occhiata se mai lo provi di nuovo
Nick T

Risposte:


2

Credo che il software Arduino (librerie e tutto il resto) supponga che tu stia funzionando a 16MHz. Se applichi quell'assunto all'orologio a cui stai effettivamente eseguendo ... le cose dovrebbero funzionare. Supponendo che tu stia eseguendo Tiny85 sul suo oscillatore interno, penso che funzioni a 1MHz, quindi moltiplica tutte le tue dichiarazioni di ritardo (e altre nozioni di tempo) per 16.

Se hai bisogno di una precisione maggiore rispetto a quella fornita dall'oscillatore interno, dovresti pensare di utilizzare un cristallo esterno o un risonatore, ma dovrai cambiare le impostazioni dei fusibili dell'AVR affinché funzioni, e penso che avrai bisogno di un programmatore come l'AVRISP mkII per farlo con AVR Studio (il mio consiglio).

Non so molto dello sketch di ArduinoISP ma a me sembra che sbatta un po 'il protocollo ISP per caricare un programma sul chip target (non sul Mega328 di bordo), non sono sicuro che sia equipaggiato per manipolare i fusibili. ArduinoISP è documentato qui http://arduino.cc/en/Tutorial/ArduinoISP , prima guerra mondiale. Si noti che attualmente non è possibile utilizzare UNO per eseguire lo schizzo ArduinoISP. Non mi sembra che tu possa usare lo schizzo per rendere Arduino un'interfaccia praticabile per l'utilizzo degli strumenti della GUI di AVR Studio.

EDIT : Sembra che le cose siano state raggiunte e che ora UNO sia realizzabile per ArduinoISP - grazie per i commenti a tutti


Grazie per l'heads-up sull'UNO, sto effettivamente usando un Duemilanove con il chip 168 scambiato con un 328, e posso ottenere i normali schizzi ATtiny da caricare correttamente tramite ArduinoISP. Proverò il tuo consiglio / 16!
fearoffours,

@fearoffours Sai un'altra cosa che potresti provare è scrivere uno schizzo basato su ArduinoISP che imposta i fusibili su un certo valore. Se ArduinoISP è in grado di scrivere Flash, non c'è motivo per cui non riesca a pensare che non sia possibile eseguire il bit-bang del protocollo ISP descritto nei fogli dati AVR per impostare i fusibili.
vicatcu,

1
@fearoffours, anche io ho appena realizzato (e aggiorna il post) di dire moltiplicare per 16 invece di dividere per 16 (per eseguire un orologio più lento ci vorranno più tick per ottenere la stessa durata)
vicatcu

So che è passato più di un anno, ma uso con successo e UNO come programmatore AVR. (Tuttavia, ho fatto modificare il disegno ArduinoISP a delay(20)invece di delay(40)nella sua definizione di void heartbeat().)
JellicleCat

So che è ancora più tardi, ma ho usato con successo il mio Uno come programmatore AVR senza cambiare nulla nello schizzo.
ingh.am

4

Sto usando Arduino UNO + ArduinoISP con successo.

Aggiungi -Uflag al tuo avrdudecomando per impostare uno o tutti e tre i fusibili ATtiny.

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

La selezione dell'orologio viene eseguita nei bit [3: 0] sul terzo fusibile ('Fuse Low Byte'). Impostali come segue per utilizzare un cristallo esterno (di 8 MHz o più veloce):

-U lfuse:w:0x6f:m

La sua definizione (ne deduco) deve essere simile a: [Fusibile byte basso]: [scrivi]: [valore esadecimale]: [imposta manualmente]

Il valore predefinito per i quattro bit alti di questo byte sono 0110, quindi lasciare 6in 0x6fcosì com'è e cambiare solo la seconda cifra, il f(il suo valore predefinito è 2).

NB: se i tuoi processi impiegano più tempo o meno di quanto ti aspetti, controlla il tuo prescaler del clock e la tua definizione di CPU F _ .


Volevo avvertire che ho appena bloccato il mio AtTiny85 utilizzando l' -U lfuse:w:0x6f:mopzione avrdude sopra . Dovrò ripristinarlo utilizzando una configurazione ad alta tensione. Quindi un avvertimento per le persone (come me) che stanno cercando di ripristinare le micce senza sapere cosa stanno facendo.
MV

@MV L'hai davvero messo in mattoni o semplicemente non hai usato l'XO esterno quando hai provato a ripristinare il fusibile?
dannato

Non aveva un orologio esterno da usare. Che cosa significa bricking in un senso più rigoroso?
JellicleCat

@JellicleCat, se si imposta il fusibile per utilizzare un XO esterno, sarà necessario utilizzare un XO esterno collegato alla MCU da quel momento in poi per programmare / impostare / ripristinare i fusibili. Non farlo, ti darà l'impressione che l'MCU sia in muratura (~ non funziona più) perché ha bisogno dell'estensione. XO per funzionare, anche per programmarlo tramite ISP.
maledetto

Tutto a posto. Se capisco la questione, ho impostato i fusibili per aspettarmi un XO, e quindi per ripristinare il chip, ho usato un Arduino per fornire un'onda stazionaria, che serviva per un XO.
JellicleCat

3

Prova a utilizzare il tutorial correlato dello stesso gruppo (High-Low Tech del MIT) intitolato Programming an ATtiny w / Arduino 1.0 .

Un breve riepilogo: dal menu Strumenti-> Scheda nell'IDE di Arduino, seleziona ATtiny85 e la frequenza che desideri eseguire (orologio interno da 1 o 8 Mhz o cristallo esterno da 20 Mhz) e quindi usa Strumenti -> Masterizza Bootloader " Credo che la selezione della speed board desiderata modifichi il modo in cui il delay () e le altre funzioni Arduino legate al tempo funzionano al fine di sincronizzarsi con la velocità di clock.

Ho avuto successo con questo approccio da solo usando alcuni chip ATtiny84. Il semplice programma di lampeggiamento è fisso, così come i tempi più sensibili necessari per controllare manualmente gli impulsi inviati a un servo utilizzando delayMicroseconds ().


1

Sembra che tu stia utilizzando ArduinoISP, prova a utilizzare AVR Studio o le opzioni della riga di comando per avrdude. A seconda di come è stato scritto ArduinoISP, potrebbe funzionare proprio come un Atmel AVRISP mkII o simile.


Non pensavo che Arduino fosse esso stesso un programmatore dell'ISP - pensavo che avesse un'intestazione ISP su di esso in modo da poter masterizzare un nuovo bootloader su un nuovo ATMega328 nel circuito ...
vicatcu

leggendo l'articolo più da vicino, sembra che tu possa usare lo sketch di ArduinoISP per farlo - impari qualcosa di nuovo ogni giorno! :)
vicatcu,

AVR studio è OK se sei su Windows. Sappi che esiste un plug-in AVR per Eclipse (questo è distinto dal plug-in Arduino noto come Sloeber). C'è un bel dialogo sui fusibili disponibile in Proprietà -> AVR. Ma sì, l'OP vuole solo usare le frequenze "core" e "Burn Bootloader".
mckenzm,

1

Le impostazioni predefinite dei fusibili per ATtiny85 sono: lfuse 0x62, hfuse 0xdf, efuse 0xff. Questo utilizza l'oscillatore RC interno (8 MHz) con "divide per 8", quindi il clock è 1 MHz.

Vedere http://www.engbedded.com/fusecalc per ulteriori impostazioni sui fusibili.

Puoi comunque utilizzare direttamente avrdude per modificare le impostazioni dei fusibili di ATtiny85 anche quando usi un ArduinoISP come programmatore.

Se attiny85.build.f_cpufinisci per cambiare manualmente il fusibile per alterare l'orologio, assicurati di modificare la riga del tuo file [arduino_folder] \ hardware \ attiny45_85 \ boards.txt.


+1 questo è davvero utile, specialmente se la velocità di clock è 1MHz, grazie
fearoffours,

0

Penso che puoi impostare i fusibili con ArduinoISP, ma non con Arduino IDE ma con avrdude, controlla questo link . Non l'ho mai provato da solo.

Il tutorial dice esplicitamente che puoi usare Arduino UNO e l'ho testato e funzionato, quindi posso confermarlo, quindi la pagina ArduinoISP è obsoleta e l'avviso UNO dovrebbe essere ignorato. Se il tuo UNO era uno del primo batch, probabilmente hai un bootloader difettoso, dovrai eseguire il reflash del bootloader. Controlla questa pagina per ulteriori informazioni (ignora i numeri di serie, tutti i miei UNO non provenivano da quella serie e avevano problemi).

Le librerie core trasferite che hai scaricato dal tutorial sono scritte per usare l'oscillatore interno 1MHz (confermato dal file boards.txt), quindi forse il problema di temporizzazione potrebbe essere nelle librerie core portate o nel tuo codice.

Cordiali saluti


0
  1. Scegli una scheda ATTiny da "board manager" che include ATTiny85. Questo è nel menu "Strumenti". Penso che questo includa "PLL interno a 16 MHz" ora. (Puoi installarne uno da http://drazzy.com/package_drazzy.com_index.json )

  2. Selezionare ATTiny85 esplicitamente, se necessario.

  3. Scegli un orologio. Fino a quando non ne saprai di più, scegli un orologio interno .

  4. Fai clic su "Masterizza Bootloader" come voce di menu.

Attenzione, potrebbe non essere più possibile programmare l'MCU se si scelgono valori molto bassi. Se questo è il tuo intento, fallo per ultimo a meno che tu non abbia ricambi o un programmatore ad alta tensione per ripristinare i fusibili.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.