Jak ustawić bezpieczniki prędkości zegara na ATtiny85, gdy używa się Arduino jako programisty?

17

Postępuję zgodnie z tym samouczkiem , programując ATtiny85 za pomocą Arduino, używając go do odtwarzania niektórych dźwięków (przez głośnik piezoelektryczny). Mam problem z ustawieniem tonów we właściwej wysokości (ręcznie tworzę kształty fal, ponieważ funkcja tone () nie jest obsługiwana w ATtiny85).

Uważam, że problem może wynikać z różnych częstotliwości taktowania w Arduino i ATtiny. Rozumiem, że szybkość zegara można zmienić w ATtiny, jak mogę to zrobić za pomocą środowiska Arduino?

strach
źródło
tak przy okazji, to jest naprawdę fajne, dziękuję za dzielenie się!
vicatcu
Czapki z głów! Nigdy nie udało mi się zaprogramować mojego attiny85 w ten sposób. Zawsze mam błędy „programator zsynchronizowany”, gdy avrdude próbuje napisać flash. Wymiana arduino na pirata autobusowego działa jednak ...
JonathanD
@Jon: Nie jestem pewien pierwotnej przyczyny „braku synchronizacji programisty”, ale w AVR Studio możesz dostosować częstotliwość programowania. Może być podobna opcja w avrdude, może warto ją zobaczyć, jeśli kiedykolwiek raz jeszcze rzucisz na nią wir
Nick T

Odpowiedzi:

2

Wierzę, że oprogramowanie Arduino (biblioteki i wszystkie) zakłada, że ​​pracujesz z częstotliwością 16 MHz. Jeśli zastosujesz to założenie do zegara, na którym faktycznie biegniesz ... wszystko powinno się udać. Zakładając, że używasz Tiny85 na jego wewnętrznym oscylatorze, myślę, że działa on z częstotliwością 1 MHz, więc pomnóż wszystkie swoje instrukcje opóźnień (i inne pojęcia czasu) przez 16.

Jeśli potrzebujesz większej dokładności niż zapewnia wewnętrzny oscylator, powinieneś pomyśleć o użyciu zewnętrznego kryształu lub rezonatora, ale musisz zmienić ustawienia bezpiecznika AVR, aby działało, i myślę, że potrzebujesz programisty takiego jak AVRISP mkII zrobić to z AVR Studio (moja rekomendacja).

Nie wiem dużo o szkicu ArduinoISP, ale dla mnie wygląda na to, że trochę zahuczał protokół ISP, aby załadować program do docelowego układu (nie na pokładzie Mega328), nie jestem pewien, czy jest on przystosowany do manipulowania bezpiecznikami. ArduinoISP jest udokumentowany tutaj http://arduino.cc/en/Tutorial/ArduinoISP , fwiw. Zauważ, że nie możesz obecnie używać UNO do uruchomienia szkicu ArduinoISP. Nie wygląda mi to na to, że można użyć szkicu, aby Arduino był realnym interfejsem do korzystania z narzędzi GUI AVR Studio.

EDYCJA : Wygląda na to, że coś nadrobiło zaległości, a UNO jest teraz realne dla ArduinoISP - dzięki za wszystkie komentarze

vicatcu
źródło
Dzięki za informacje na temat UNO, faktycznie używam Duemilanove z układem 168 zamienionym na 328 i mogę uzyskać normalne szkice ATtiny, aby poprawnie przesłać za pośrednictwem ArduinoISP. Wypróbuję twoją wskazówkę / 16!
terroroffours
@fearoffours Wiesz, inną rzeczą, którą możesz spróbować, jest napisanie szkicu opartego na ArduinoISP, który ustawia bezpieczniki na określoną wartość. Jeśli ArduinoISP potrafi napisać Flasha, nie ma powodu, dla którego nie mogę wymyślić protokołu ISP opisanego w arkuszach danych AVR w celu ustawienia Bezpieczników.
vicatcu
1
@fearoffours, również zdałem sobie sprawę (i zaktualizowałem post), aby powiedzieć pomnożyć przez 16 zamiast dzielić przez 16 (działa wolniejszy zegar, potrzeba więcej
tyknięć,
Wiem, że to ponad rok później, ale z powodzeniem używam i UNO jako programista AVR. (Zmieniłem jednak szkic ArduinoISP, aby delay(20)wprowadzić go delay(40)w definicji void heartbeat().)
JellicleCat
Wiem, że jest jeszcze później, ale z powodzeniem użyłem mojego Uno jako programisty AVR bez zmiany czegokolwiek w szkicu.
ingh.am
4

Korzystam z Arduino UNO + ArduinoISP.

Dodaj -Uflagi do swojego avrdudepolecenia, aby ustawić jeden lub wszystkie trzy bezpieczniki ATtiny.

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

Wyboru zegara dokonuje się w bitach [3: 0] trzeciego bezpiecznika („Fuse Low Byte”). Ustaw je w następujący sposób, aby użyć zewnętrznego kryształu (8 MHz lub szybszego):

-U lfuse:w:0x6f:m

Jego definicja (wnioskuję) musi być taka: [Fuse Low Byte]: [write]: [wartość hex]: [ustawiany ręcznie]

Domyślna wartość dla czterech wysokich bitów tego bajtu są 0110, więc pozostawić 6w 0x6fjak to jest, i tylko zmienić drugą cyfrę, f(jego wartość domyślna to 2).

Uwaga: jeśli procesy trwają dłużej lub krócej niż się spodziewasz, sprawdź preskaler zegara i swoją definicję F _ CPU.

JellicleCat
źródło
Chciałem ostrzec, że właśnie zamurowałem mój AtTiny85, używając powyższej -U lfuse:w:0x6f:mopcji avrdude. Będę musiał go zresetować za pomocą zestawu wysokiego napięcia. Więc słowo ostrzeżenia dla ludzi (takich jak ja), którzy próbują zresetować bezpieczniki, nie wiedząc, co robią.
MV
@MV Naprawdę to zamurowałeś, czy po prostu nie użyłeś zewnętrznego XO podczas próby zresetowania bezpiecznika?
cholera
Nie miał zewnętrznego zegara do użycia. Co oznacza „murowanie” w bardziej surowym sensie?
JellicleCat
@JellicleCat, Jeśli ustawisz bezpiecznik tak, aby używał zewnętrznego XO, będziesz musiał użyć zewnętrznego XO podłączonego do MCU odtąd do programowania / ustawiania / resetowania bezpieczników. Nie zrobienie tego sprawi wrażenie, że mcu jest zamurowane (~ już nie działa), ponieważ potrzebuje rozszerzenia. XO działa, nawet w przypadku programowania przez ISP.
cholera
W porządku. Jeśli rozumiem sprawę, ustawiłem bezpieczniki, aby oczekiwać XO, a następnie, aby przywrócić układ, użyłem Arduino, aby dostarczyć falę stojącą, która służyła do XO.
JellicleCat
3

Spróbuj użyć pokrewnego samouczka tej samej grupy (High-Low Tech MIT) zatytułowanego Programowanie ATtiny w / Arduino 1.0 .

Szybkie podsumowanie: Z menu Narzędzia-> Płytka w Arduino IDE wybierz ATtiny85 i częstotliwość, na której chcesz pracować (zegar wewnętrzny 1 lub 8 MHz lub zewnętrzny kryształ 20 MHz), a następnie użyj Narzędzia -> Nagraj Bootloader ” Wierzę, że wybranie pożądanej płyty prędkości modyfikuje sposób działania opóźnienia () i innych funkcji Arduino związanych z czasem, aby zsynchronizować się z prędkością zegara.

Osiągnąłem sukces dzięki temu podejściu, używając kilku układów ATtiny84. Prosty program migania został naprawiony, a także bardziej czułe taktowanie wymagane do ręcznego sterowania impulsami wysyłanymi do serwomechanizmu za pomocą delayMicroseconds ().

Tom B.
źródło
1

Wygląda na to, że używasz ArduinoISP, spróbuj użyć AVR Studio lub opcji wiersza poleceń dla avrdude. W zależności od tego, jak został napisany ArduinoISP, może on działać podobnie jak Atmel AVRISP mkII lub podobny.

Nick T.
źródło
Nie sądziłem, że Arduino sam jest programistą ISP - myślałem, że ma nagłówek ISP, dzięki czemu możesz wypalić nowy bootloader na świeżym ATMega328 w obwodzie ...
vicatcu 14.10
czytając artykuł bliżej, wydaje się, że możesz to zrobić za pomocą szkicu ArduinoISP - każdego dnia uczysz się czegoś nowego! :)
vicatcu
Studio AVR działa poprawnie, jeśli korzystasz z systemu Windows. Wiedz, że istnieje wtyczka AVR dla Eclipse (różni się ona od wtyczki Arduino znanej jako Sloeber). W oknie Właściwości -> AVR dostępny jest sprytny dialog z bezpiecznikami. Ale tak, OP chce po prostu użyć częstotliwości „rdzenia” i „Burn Bootloadera”.
mckenzm
1

Domyślne ustawienia bezpiecznika dla ATtiny85 to: lfuse 0x62, hfuse 0xdf, efuse 0xff. Wykorzystuje to wewnętrzny oscylator RC (8 MHz) z „dzieleniem przez 8”, więc zegar wynosi 1 MHz.

Więcej informacji na temat ustawień bezpieczników można znaleźć na stronie http://www.engbedded.com/fusecalc .

Nadal możesz używać avrdude bezpośrednio do zmiany ustawień bezpieczników ATtiny85, nawet gdy używasz ArduinoISP jako programatora.

Jeśli zmienisz ręcznie bezpiecznik w celu zmiany zegara, edytuj attiny85.build.f_cpuwiersz swojego pliku [arduino_folder] \ hardware \ attiny45_85 \ boards.txt.

Craig
źródło
+1 to jest naprawdę przydatna, szczególnie szybkość zegara jest 1MHz, dzięki
fearoffours
0

Myślę, że możesz ustawić bezpieczniki za pomocą ArduinoISP, ale nie Arduino IDE, ale avrdude, sprawdź ten link . Nigdy tego nie testowałem.

Samouczek wyraźnie mówi, że możesz używać Arduino UNO, a ja go przetestowałem i działałem, więc mogę to potwierdzić, więc strona ArduinoISP jest nieaktualna i ostrzeżenie UNO powinno zostać zignorowane. Jeśli Twój UNO był jednym z pierwszej partii, prawdopodobnie masz wadliwy program ładujący, musisz ponownie załadować program ładujący. Sprawdź tę stronę, aby uzyskać więcej informacji (zignoruj ​​numery seryjne, wszystkie moje UNO nie były z tej serii i miały problemy).

Biblioteki rdzeni przenośnych pobrane z samouczka są napisane w celu użycia wewnętrznego oscylatora 1 MHz (potwierdzonego z pliku deski.txt), więc może problem z synchronizacją może być w bibliotekach rdzeni przenośnych lub w kodzie.

Z poważaniem

Havok
źródło
0
  1. Wybierz tablicę ATTiny z „menedżera tablic” zawierającego ATTiny85. Znajduje się to w menu „Narzędzia”. Myślę, że obejmuje to teraz „wewnętrzny PLL 16 MHz”. (Możesz zainstalować jeden z http://drazzy.com/package_drazzy.com_index.json )

  2. Wybierz jawnie ATTiny85, jeśli jest to wymagane.

  3. Wybierz zegar. Dopóki nie dowiesz się więcej, wybierz wewnętrzny zegar.

  4. Kliknij „Burn Bootloader” jako element menu.

Uwaga, możesz nie być w stanie zaprogramować MCU, jeśli wybierzesz bardzo niskie wartości. Jeśli taka jest twoja intencja, rób to do końca, chyba że masz części zamienne lub programator wysokiego napięcia, aby zresetować bezpieczniki.

mckenzm
źródło