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

17

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 por 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 diferentes velocidades de reloj en Arduino y ATtiny. Entiendo que la velocidad del reloj se puede alterar en el ATtiny, ¿cómo puedo lograr esto usando el entorno arduino?

miedo
fuente
Por cierto, esto es realmente genial, ¡gracias por compartir!
vicatcu
¡Felicitaciones! Nunca he logrado programar mi attiny85 de esta manera ... Siempre tengo errores de "programador fuera de sincronización" cuando avrdude intenta escribir el flash. Sin embargo, intercambiar el arduino con un pirata de autobús funciona ...
JonathanD
@ Jon: No estoy seguro de la causa raíz de "programador fuera de sincronización", 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
Nick T

Respuestas:

2

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

Si necesita una precisión mejor que la que proporciona el oscilador interno, debería pensar en usar un cristal externo o un resonador, pero necesitará cambiar la configuración de fusibles 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 a bordo), no estoy seguro de que esté equipado para manipular fusibles. ArduinoISP se documenta aquí http://arduino.cc/en/Tutorial/ArduinoISP , fwiw. Tenga en cuenta que no puede utilizar una UNO actualmente 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 una UNO es viable para ArduinoISP ahora, gracias por los comentarios.

vicatcu
fuente
Gracias por el aviso sobre la UNO, en realidad estoy usando un Duemilanove con el chip 168 intercambiado por un 328, y puedo obtener los bocetos ATtiny normales para cargar correctamente a través de ArduinoISP. ¡Probaré tu / 16 tip!
fearoffours
@fearoffours Sabes que otra cosa que puedes intentar es escribir un boceto basado en ArduinoISP que establezca los fusibles en un cierto valor. Si ArduinoISP puede escribir el Flash, no hay ninguna razón por la que pueda pensar que no podría golpear el protocolo ISP descrito en las hojas de datos AVR para configurar los Fusibles.
vicatcu
1
@fearoffours, también me acabo de dar cuenta (y actualizar la publicación) para decir multiplicar por 16 en lugar de dividir por 16 (si ejecutas un reloj más lento, se necesitarán más ticks para obtener la misma duración)
vicatcu
Sé que es más de un año después, pero uso con éxito y UNO como programador AVR. (Sin embargo, alteró el boceto ArduinoISP a delay(20)insted de delay(40)en su definición de void heartbeat().)
JellicleCat
Sé que es incluso más tarde, pero utilicé con éxito mi Uno como programador AVR sin cambiar nada en el boceto.
ingh.am
4

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 ('Fusible de byte bajo'). Ajústelos de la siguiente manera para utilizar un cristal externo (de 8MHz o más rápido):

-U lfuse:w:0x6f:m

Su definición (infiero) debe ser algo así como: [Fusible de byte bajo]: [escribir]: [valor hexadecimal]: [establecer manualmente]

El valor predeterminado para los cuatro bits altos de este byte es 0110, así que deje el 6in 0x6fcomo está y solo cambie el segundo dígito, el f(su valor predeterminado es2 ).

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

JellicleCat
fuente
Quería advertir que acabo de bloquear mi AtTiny85 usando la -U lfuse:w:0x6f:mopción avrdude anterior . Necesitaré restablecerlo usando una configuración de alto voltaje. Entonces, una advertencia para las personas (como yo) que están tratando de restablecer los fusibles sin saber lo que están haciendo.
MV
@MV ¿Realmente lo bloqueó o simplemente no usó el XO externo al intentar restablecer el fusible?
maldito
No tenía reloj externo para usar. ¿Qué significa el ladrillo en un sentido más estricto?
JellicleCat
@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 / configurar / restablecer fusibles. Si no lo hace, le dará la impresión de que el mcu está bloqueado (~ ya no funciona) porque necesita la ext. XO para funcionar, incluso para programarlo a través de ISP.
maldito
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.
JellicleCat
3

Intente usar el tutorial relacionado del mismo grupo (High-Low Tech del MIT) titulado Programming an ATtiny w / Arduino 1.0 .

Un resumen rápido: desde el menú Herramientas-> Tablero en el IDE de Arduino, seleccione el ATtiny85 y la frecuencia con 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 tarjeta de velocidad deseada modifica la forma en que funcionan el delay () y otras funciones relacionadas con el tiempo de Arduino para sincronizarse con la velocidad del reloj.

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

Tumba
fuente
1

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

Nick T
fuente
No pensé que el Arduino era en sí misma un programador ISP - pensé que tiene un jefe de la ISP en él para que pueda grabar un nuevo gestor de arranque en un ATMega328 frescas en el circuito ...
vicatcu
leyendo el artículo más de cerca, parece que puedes usar el boceto ArduinoISP para hacer esto: ¡aprendes algo nuevo todos los días! :)
vicatcu
AVR studio está bien si estás 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 "núcleo" y "Burn Bootloader".
mckenzm
1

Los ajustes de fusibles predeterminados para el ATtiny85 son: lfuse 0x62, hfuse 0xdf, efuse 0xff. 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.

Craig
fuente
+1 esto es realmente útil, especialmente si la velocidad del reloj es de 1MHz, gracias
fearoffours
0

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 he probado y funcionó, por lo que puedo confirmarlo, por lo que la página ArduinoISP está desactualizada y la advertencia de UNO debe ignorarse. Si su UNO fue uno del primer lote, probablemente tenga un gestor de arranque defectuoso, deberá volver a cargar el gestor de arranque. Revisa 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 1MHz (confirmado por el archivo boards.txt), por lo que tal vez el problema de ajuste podría estar en las bibliotecas centrales portadas o en su código.

Saludos cordiales

Havok
fuente
0
  1. Elija un tablero ATTiny del "administrador de tableros" que incluye el ATTiny85. Esto está en el menú "Herramientas". Creo que esto incluye "PLL interno de 16MHz" 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 sepa más, elija un reloj interno .

  4. Haga clic en "Grabar cargador de arranque" como elemento del 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 al final a menos que tenga repuestos o un programador de alto voltaje para reiniciar los fusibles.

mckenzm
fuente