Bagaimana cara mengatur sekering kecepatan jam pada ATtiny85 saat menggunakan Arduino sebagai programmer?

17

Saya mengikuti tutorial ini , pemrograman ATtiny85 dengan Arduino, menggunakannya untuk memainkan beberapa nada (melalui speaker piezo). Saya kesulitan mendapatkan nada pada nada yang tepat (saya membuat bentuk gelombang secara manual, karena fungsi nada () tidak didukung pada ATtiny85).

Saya percaya masalahnya mungkin karena perbedaan kecepatan clock pada Arduino dan ATtiny. Saya mengerti kecepatan clock dapat diubah pada ATtiny, bagaimana cara melakukannya menggunakan lingkungan Arduino?

ketakutan
sumber
omong-omong ini benar-benar keren, terima kasih sudah berbagi!
vicatcu
Hormat! Saya tidak pernah berhasil memprogram attiny85 saya dengan cara ini .. Saya selalu memiliki kesalahan "programmer tidak sinkron" ketika avrdude mencoba untuk menulis flash. Mengganti arduino dengan bajak laut bus bekerja ...
JonathanD
@ Jon: Saya tidak yakin akar penyebab di balik "programmer tidak sinkron", tetapi dengan AVR Studio Anda dapat menyesuaikan frekuensi pemrograman. Mungkin ada opsi serupa di avrdude, mungkin patut dilihat jika Anda pernah mencobanya lagi
Nick T

Jawaban:

2

Saya percaya perangkat lunak Arduino (perpustakaan dan semua) menganggap Anda beroperasi pada 16MHz. Jika Anda menerapkan asumsi itu pada jam Anda benar-benar berjalan pada ... hal-hal akan berhasil. Dengan asumsi Anda menjalankan Tiny85 pada osilator internal, saya pikir itu berjalan pada 1MHz, jadi cukup gandakan semua pernyataan keterlambatan Anda (dan pengertian waktu lainnya) dengan 16.

Jika Anda membutuhkan akurasi yang lebih baik daripada osilator internal, Anda harus berpikir tentang menggunakan kristal eksternal atau resonator, tetapi Anda harus mengubah pengaturan sekering AVR agar bisa berfungsi, dan saya pikir Anda akan memerlukan programmer seperti AVRISP mkII untuk melakukan itu dengan AVR Studio (rekomendasi saya).

Saya tidak tahu banyak tentang sketsa ArduinoISP tetapi bagi saya kelihatannya ini agak mengganggu protokol ISP untuk mengunggah program ke chip target (bukan pada board Mega328), tidak yakin itu dilengkapi untuk memanipulasi sekering. ArduinoISP didokumentasikan di sini http://arduino.cc/en/Tutorial/ArduinoISP , fwiw. Perhatikan bahwa Anda tidak dapat menggunakan UNO saat ini untuk menjalankan sketsa ArduinoISP. Bagiku tidak terlihat seperti Anda dapat menggunakan sketsa untuk membuat Arduino antarmuka yang layak untuk menggunakan alat AVR Studio GUI.

EDIT : Sepertinya barang sudah menyusul dan UNO layak untuk ArduinoISP sekarang - terima kasih atas komentarnya semua

vicatcu
sumber
Terima kasih atas informasi tentang UNO, saya sebenarnya menggunakan Duemilanove dengan chip 168 yang ditukar dengan 328, dan bisa mendapatkan sketsa ATtiny yang normal untuk diunggah dengan baik melalui ArduinoISP. Saya akan mencoba / 16 tip Anda!
fearoffours
@ takut. Anda tahu hal lain yang bisa Anda coba adalah menulis sketsa berdasarkan ArduinoISP yang mengatur sekering ke nilai tertentu. Jika ArduinoISP dapat menulis Flash, tidak ada alasan saya bisa memikirkan bahwa Anda tidak dapat menggedor protokol ISP yang dijelaskan dalam lembar data AVR untuk mengatur Fuse.
vicatcu
1
@fearoffours, saya juga baru sadar (dan memperbarui posting) untuk mengatakan kalikan dengan 16 daripada dibagi dengan 16 (Anda menjalankan jam lebih lambat akan membutuhkan lebih banyak kutu untuk mendapatkan durasi yang sama)
vicatcu
Saya tahu ini lebih dari setahun kemudian, tetapi saya berhasil menggunakan dan UNO sebagai programmer AVR. (Namun, saya memang mengubah sketsa ArduinoISP menjadi delay(20)insted delay(40)dalam definisi void heartbeat().)
JellicleCat
Saya tahu ini bahkan lebih lambat tetapi saya berhasil menggunakan Uno saya sebagai programmer AVR tanpa mengubah apa pun dalam sketsa.
ingh.am
4

Saya berhasil menggunakan Arduino UNO + ArduinoISP.

Tambahkan -Ubendera ke avrdudeperintah Anda untuk mengatur salah satu atau semua dari sekering ATtiny.

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

Pemilihan jam dilakukan dalam bit [3: 0] pada sekering ketiga ('Fuse Low Byte'). Tetapkan mereka sebagai berikut untuk menggunakan kristal eksternal (8MHz atau lebih cepat):

-U lfuse:w:0x6f:m

Definisinya (saya simpulkan) harus seperti: [Fuse Low Byte]: [tulis]: [hex value]: [atur secara manual]

Nilai default untuk empat bit tinggi byte ini 0110, sehingga meninggalkan 6di 0x6fseperti itu, dan hanya mengubah digit kedua, f(nilai default adalah 2).

NB: Jika proses Anda memakan waktu lebih lama atau lebih pendek dari yang Anda harapkan, periksa prescaler jam Anda dan definisi Anda dari F _ CPU.

JellicleCat
sumber
Saya ingin mengingatkan bahwa saya baru saja memperbaiki AtTiny85 saya dengan menggunakan -U lfuse:w:0x6f:mopsi avrdude di atas . Saya harus mengatur ulang menggunakan pengaturan tegangan tinggi. Jadi kata hati-hati untuk orang-orang (seperti saya) yang mencoba mengatur ulang sekering tanpa mengetahui apa yang mereka lakukan.
MV
@ MOV Apakah Anda benar-benar merusak atau tidak menggunakan XO eksternal saat mencoba mengatur ulang sekring?
sialan
Tidak punya jam eksternal untuk digunakan. Apa arti bricking dalam arti yang lebih ketat?
JellicleCat
@ JellicleCat, Jika Anda mengatur sekering untuk menggunakan XO eksternal, Anda harus menggunakan XO eksternal yang melekat pada MCU sejak saat itu untuk memprogram / mengatur / mengatur ulang sekering. Tidak melakukan hal itu, akan memberi Anda kesan MCU itu bata (~ tidak bekerja lagi) karena perlu ext. XO berfungsi, bahkan untuk pemrograman melalui ISP.
damd
Baik. Jika saya memahami masalah ini, saya mengatur sekering untuk mengharapkan XO, dan kemudian mengembalikan chip, saya menggunakan Arduino untuk memasok gelombang berdiri, yang berfungsi untuk XO.
JellicleCat
3

Coba gunakan tutorial terkait oleh grup yang sama (Teknologi Tinggi-Rendah MIT) yang berjudul Pemrograman ATtiny w / Arduino 1.0 .

Ringkasan cepat: Dari menu Tools-> Board di Arduino IDE, pilih ATtiny85 dan frekuensi yang Anda inginkan (jam internal 1 atau 8 Mhz, atau kristal eksternal 20Mhz) dan kemudian gunakan Tools -> Burn Bootloader " Saya percaya memilih papan kecepatan yang diinginkan mengubah cara penundaan () dan fungsi Arduino terkait waktu lainnya bekerja untuk menyinkronkan dengan kecepatan jam.

Saya telah berhasil dengan pendekatan ini sendiri menggunakan beberapa chip ATtiny84. Program kedip sederhana sudah diperbaiki, serta waktu yang lebih sensitif diperlukan untuk secara manual mengendalikan pulsa yang dikirim ke servo menggunakan delayMicroseconds ().

Tom B
sumber
1

Tampaknya Anda menggunakan ArduinoISP, coba gunakan AVR Studio atau opsi baris perintah untuk avrdude. Bergantung pada bagaimana ArduinoISP ditulis, ia dapat berfungsi seperti Atmel AVRISP mkII atau serupa.

Nick T
sumber
Saya tidak berpikir Arduino itu sendiri adalah programmer ISP - saya pikir memiliki header ISP di atasnya sehingga Anda dapat membakar bootloader baru ke ATMega328 baru di sirkuit ...
vicatcu
membaca artikel lebih dekat, sepertinya Anda dapat menggunakan sketsa ArduinoISP untuk melakukan ini - Anda belajar sesuatu yang baru setiap hari! :)
vicatcu
Studio AVR tidak masalah jika Anda menggunakan Windows. Ketahuilah bahwa ada plugin AVR untuk Eclipse (ini berbeda dari plugin Arduino yang dikenal sebagai Sloeber). Ada dialog sekering yang bagus tersedia di Properties -> AVR. Tapi ya OP hanya ingin menggunakan frekuensi "inti" dan "Bakar Bootloader".
mckenzm
1

Pengaturan sekering default untuk ATtiny85 adalah: lfuse 0x62, hfuse 0xdf, efuse 0xff. Ini menggunakan osilator RC internal (8 MHz) dengan "bagi dengan 8" sehingga clock adalah 1 MHz.

Lihat http://www.engbedded.com/fusecalc untuk pengaturan sekering yang lebih banyak.

Anda masih dapat menggunakan avrdude secara langsung untuk mengubah pengaturan sekering ATtiny85 Anda, bahkan ketika menggunakan ArduinoISP sebagai programmer.

Jika Anda akhirnya mengubah sekering secara manual untuk mengubah jam, pastikan untuk mengedit attiny85.build.f_cpubaris file [arduino_folder] \ hardware \ attiny45_85 \ boards.txt Anda.

Craig
sumber
+1 ini benar-benar bermanfaat, terutama kecepatan clocknya 1MHz, terima kasih
fearoffours
0

Saya pikir Anda dapat mengatur sekering dengan ArduinoISP, tetapi tidak dengan Arduino IDE tetapi dengan avrdude, periksa tautan ini . Tidak pernah mengujinya sendiri.

Tutorial secara eksplisit mengatakan Anda dapat menggunakan Arduino UNO dan saya telah mengujinya dan berfungsi, jadi saya dapat mengonfirmasi hal itu, sehingga halaman ArduinoISP sudah usang dan peringatan UNO harus diabaikan. Jika UNO Anda adalah salah satu dari batch pertama Anda mungkin memiliki bootloader yang salah, Anda perlu merombak bootloader. Periksa halaman ini untuk informasi lebih lanjut (abaikan nomor seri, semua UNO saya bukan dari seri itu dan ada masalah).

Pustaka inti porting yang Anda unduh dari tutorial ditulis untuk menggunakan osilator internal 1MHz (dikonfirmasi dari file boards.txt), jadi mungkin masalah pengaturan waktu mungkin ada di pustaka inti porting atau dalam kode Anda.

Salam

Havok
sumber
0
  1. Pilih papan ATTiny dari "papan manager" yang mencakup ATTiny85 tersebut. Ini ada di Menu "Tools". Saya pikir ini termasuk "16MHz internal PLL" sekarang. (Anda dapat menginstal salah satu dari http://drazzy.com/package_drazzy.com_index.json )

  2. Pilih ATTiny85 secara eksplisit jika diperlukan.

  3. Pilih jam. Sampai Anda tahu lebih banyak, pilih jam internal .

  4. Klik "Bakar Bootloader" sebagai Item Menu.

Hati-hati, Anda mungkin tidak lagi dapat memprogram MCU jika Anda memilih nilai-nilai yang sangat rendah. Jika ini maksud Anda, lakukan ini terakhir kecuali Anda memiliki suku cadang atau Programmer Tegangan Tinggi untuk mengatur ulang sekering.

mckenzm
sumber