¿Cómo configuro los fusibles de velocidad del reloj en un ATtiny85 cuando uso un Arduino como programador?

Estoy siguiendo este tutorial , programando el ATtiny85 con un Arduino, usándolo para reproducir algunos tonos (a través de un altavoz piezoeléctrico). Estoy luchando para obtener los tonos en el tono correcto (estoy creando las formas de onda manualmente, ya que la función tone() no es compatible con el ATtiny85).

Creo que el problema puede deberse a las diferentes velocidades de reloj en Arduino y ATtiny. Entiendo que la velocidad del reloj se puede modificar en el ATtiny, ¿cómo logro esto usando el entorno arduino?

por cierto esto es muy bueno, gracias por compartir!
¡Felicitaciones! Nunca logré programar mi attiny85 de esta manera. Siempre tengo errores de "programador fuera de sincronización" cuando avrdude intenta escribir el flash. Sin embargo, cambiar el arduino por un autobús pirata funciona...
@Jon: No estoy seguro de la causa principal detrás del "programador no sincronizado", pero con AVR Studio puede ajustar la frecuencia de programación. Puede haber una opción similar en avrdude, podría valer la pena echarle un vistazo si alguna vez vuelves a darle un giro

Respuestas (7)

Creo que el software Arduino (bibliotecas y todo) asume que está operando a 16 MHz. Si aplica esa suposición al reloj en el que realmente está corriendo... las cosas deberían funcionar. Suponiendo que está ejecutando el Tiny85 en su oscilador interno, creo que funciona a 1 MHz, así que simplemente multiplique todas sus declaraciones de retraso (y otras nociones de tiempo) por 16.

Si necesita una mayor precisión que la que proporciona el oscilador interno, debe pensar en usar un cristal externo o un resonador, pero deberá cambiar la configuración del fusible del AVR para que funcione, y creo que necesitará un programador como el AVRISP. mkII para hacer eso con AVR Studio (mi recomendación).

No sé mucho sobre el boceto ArduinoISP, pero para mí parece que golpea un poco el protocolo ISP para cargar un programa en el chip de destino (no el Mega328 integrado), no estoy seguro de que esté equipado para manipular fusibles. ArduinoISP está documentado aquí http://arduino.cc/en/Tutorial/ArduinoISP , fwiw. Tenga en cuenta que actualmente no puede usar un UNO para ejecutar el boceto ArduinoISP. No me parece que pueda usar el boceto para hacer que Arduino sea una interfaz viable para usar las herramientas GUI de AVR Studio.

EDITAR : Parece que las cosas se han puesto al día y un UNO es viable para ArduinoISP ahora. Gracias por todos los comentarios.

Gracias por la información sobre el UNO, en realidad estoy usando un Duemilanove con el chip 168 cambiado por un 328, y puedo hacer que los bocetos normales de ATtiny se carguen correctamente a través de ArduinoISP. ¡Probaré tu sugerencia de /16!
@fearoffours Sabes, otra cosa que podrías intentar es escribir un boceto basado en ArduinoISP que establezca los fusibles en un valor determinado. Si ArduinoISP puede escribir el Flash, no hay ninguna razón por la que se me ocurra que no podrías romper el protocolo ISP descrito en las hojas de datos de AVR para configurar los fusibles.
@fearoffours, también me acabo de dar cuenta (y actualizo la publicación) de decir multiplicar por 16 en lugar de dividir por 16 (si estás ejecutando un reloj más lento, se necesitarán más tics para obtener la misma duración)
Sé que ha pasado más de un año, pero uso con éxito UNO como programador AVR. (Sin embargo, modifiqué el boceto de ArduinoISP delay(20)en delay(40)su definición de void heartbeat().)
Sé que es incluso más tarde, pero usé con éxito mi Uno como programador de AVR sin cambiar nada en el boceto.

Estoy usando Arduino UNO + ArduinoISP con éxito.

Agregue -Ubanderas a su avrdudecomando para configurar cualquiera o todos los tres fusibles ATtiny.

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

La selección del reloj se realiza en bits [3:0] en el tercer fusible ('Fuse Low Byte'). Ajústelos de la siguiente manera para hacer uso de un cristal externo (de 8 MHz o más rápido):

-U lfuse:w:0x6f:m

Su definición (supongo) debe ser algo así como: [Fusible Low Byte]:[escribir]:[valor hexadecimal]:[establecer manualmente]

El valor predeterminado para los cuatro bits altos de este byte es 0110, así que déjelo 6como 0x6festá y solo cambie el segundo dígito, el f(su valor predeterminado es 2).

NB: si sus procesos tardan más o menos de lo esperado, verifique su preescalador de reloj y su definición de F _ CPU.

Quería advertir que acabo de bloquear mi AtTiny85 usando la -U lfuse:w:0x6f:mopción avrdude anterior. Tendré que restablecerlo usando una configuración de alto voltaje. Entonces, una advertencia para las personas (como yo) que intentan restablecer los fusibles sin saber lo que están haciendo.
@MV ¿Realmente lo bloqueó o simplemente no usó el XO externo al intentar restablecer el fusible?
No tenía reloj externo para usar. ¿Qué significa bricking en un sentido más estricto?
@JellicleCat, si configura el fusible para usar un XO externo, deberá usar un XO externo conectado a la mcu a partir de ese momento para programar/establecer/restablecer fusibles. Si no lo hace, tendrá la impresión de que la mcu está bloqueada (~ ya no funciona) porque necesita la extensión. XO para funcionar, incluso para programarlo a través de ISP.
Está bien. Si entiendo el asunto, configuré los fusibles para esperar un XO, y luego para restaurar el chip, usé un Arduino para suministrar una onda estacionaria, que sirvió para un XO.
Autoinfligido, pero también seguí los fusibles aquí sin darme cuenta exactamente de lo que significaba. Requería un segundo chip para actuar como un reloj solo para permitir la reprogramación nuevamente.

Intente usar el tutorial relacionado del mismo grupo (High-Low Tech de MIT) titulado Programación de un ATtiny con Arduino 1.0 .

Un resumen rápido: desde el menú Herramientas-> Placa en el IDE de Arduino, seleccione el ATtiny85 y la frecuencia a la que desea ejecutar (reloj interno de 1 u 8 Mhz, o cristal externo de 20 Mhz) y luego use Herramientas -> Grabar cargador de arranque" Creo que seleccionar la placa de velocidad deseada modifica la forma en que el retardo () y otras funciones de Arduino relacionadas con el tiempo funcionan para sincronizarse con la velocidad del reloj.

Yo mismo he tenido éxito con este enfoque utilizando algunos chips ATtiny84. El programa de parpadeo simple es fijo, así como también se requiere una temporización más sensible para controlar manualmente los pulsos enviados a un servo usando delayMicroseconds().

Parece que está usando ArduinoISP, intente usar AVR Studio o las opciones de línea de comando para avrdude. Dependiendo de cómo se haya escrito el ArduinoISP, puede funcionar como un Atmel AVRISP mkII o similar.

No pensé que Arduino fuera en sí mismo un programador de ISP; pensé que tenía un encabezado de ISP para que pueda grabar un nuevo cargador de arranque en un ATMega328 nuevo en el circuito ...
Al leer el artículo más de cerca, parece que puede usar el boceto ArduinoISP para hacer esto: ¡aprende algo nuevo todos los días! :)
El estudio AVR está bien si está en Windows. Sepa que hay un complemento AVR para Eclipse (esto es distinto del complemento Arduino conocido como Sloeber). Hay un ingenioso diálogo de fusibles disponible en Propiedades --> AVR. Pero sí, el OP solo quiere usar las frecuencias "básicas" y "Burn Bootloader".

Los ajustes de fusible predeterminados para el ATtiny85 son: lfuse 0x62, hfuse 0xdf, efuse 0xff. Esto utiliza el oscilador interno RC (8 MHz) con "dividir por 8", por lo que el reloj es de 1 MHz.

Consulte http://www.engbedded.com/fusecalc para obtener más configuraciones de fusibles.

Todavía puede usar avrdude directamente para cambiar la configuración de fusibles de su ATtiny85 incluso cuando usa un ArduinoISP como programador.

Si termina cambiando manualmente el fusible para alterar el reloj, asegúrese de editar la attiny85.build.f_cpulínea de su archivo [arduino_folder]\hardware\attiny45_85\boards.txt.

+1 esto es realmente útil, especialmente la velocidad del reloj es de 1 MHz, gracias

Creo que puede configurar los fusibles con ArduinoISP, pero no con Arduino IDE sino con avrdude, consulte este enlace . Nunca lo probé yo mismo.

El tutorial dice explícitamente que puede usar Arduino UNO y lo probé y funcionó, por lo que puedo confirmarlo, por lo que la página de ArduinoISP está desactualizada y la advertencia de UNO debe ignorarse. Si su UNO era uno del primer lote, probablemente tenga un cargador de arranque defectuoso, deberá volver a actualizar el cargador de arranque. Consulte esta página para obtener más información (ignore los números de serie, todos mis UNO no eran de esa serie y tenían problemas).

Las bibliotecas centrales portadas que descargó del tutorial están escritas para usar el oscilador interno de 1 MHz (confirmado desde el archivo boards.txt), por lo que tal vez el problema de temporización podría estar en las bibliotecas centrales portadas o en su código.

Atentamente

  1. Elija un tablero ATTiny del "administrador de tableros" que incluya el ATTiny85. Esto está en el menú "Herramientas". Creo que esto incluye "PLL interno de 16 MHz" ahora. (Puede instalar uno desde http://drazzy.com/package_drazzy.com_index.json )

  2. Seleccione ATTiny85 explícitamente si es necesario.

  3. Elige un reloj. Hasta que sepas más, elige un reloj interno .

  4. Haga clic en "Grabar cargador de arranque" como elemento de menú.

Precaución, es posible que ya no pueda programar la MCU si elige valores muy bajos. Si esta es su intención, haga esto último a menos que tenga repuestos o un programador de alto voltaje para restablecer los fusibles.