19 votos

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

Estoy siguiendo esto tutorial programando el ATtiny85 con un Arduino, usándolo para reproducir algunos tonos (a través de un altavoz piezoeléctrico). Estoy luchando con conseguir 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 del Arduino y del ATtiny. Entiendo que la velocidad de reloj puede ser alterado en el ATtiny, ¿cómo puedo lograr esto utilizando el entorno de Arduino?

0 votos

Por cierto, esto es realmente genial, ¡gracias por compartirlo!

0 votos

Me quito el sombrero. Nunca he conseguido programar mi attiny85 de esta manera.. Siempre tengo errores de "programador fuera de sincronización" cuando avrdude intenta escribir la flash. Sin embargo, cambiar el arduino por un bus pirata funciona...

0 votos

@Jon: No estoy seguro de la causa raíz de "programador desincronizado", pero con AVR Studio puedes ajustar la frecuencia de programación. Puede haber una opción similar en avrdude, podría valer la pena un vistazo si alguna vez darle una vuelta de nuevo

4voto

Peter Puntos 1681

Estoy usando Arduino UNO + ArduinoISP con éxito.

Añadir -U banderas a su avrdude para ajustar uno o todos los tres fusibles del 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 los bits[3:0] del tercer fusible ('Fuse Low Byte'). Configúrelos como sigue para hacer uso de un cristal externo (de 8MHz o más rápido):

-U lfuse:w:0x6f:m

Su definición (deduzco) debe ser algo así como: [Byte bajo del fusible]:[escribir]:[valor hexadecimal]:[establecer manualmente]

El valor por defecto de los cuatro bits altos de este byte son 0110 Así que deja el 6 en 0x6f tal cual, y sólo cambiar el segundo dígito, el f (su valor por defecto es 2 ).

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

0 votos

Quería advertir que acabo de brickear mi AtTiny85 usando lo anterior -U lfuse:w:0x6f:m opción avrdude. Tendré que restablecerlo usando una configuración de alto voltaje. Así que una palabra de advertencia a la gente (como yo) que están tratando de restablecer los fusibles sin saber lo que están haciendo.

0 votos

@M-V ¿Realmente lo brickeaste o simplemente no usaste la XO externa cuando intentaste resetear el fusible?

0 votos

No tenía ningún reloj externo para usar. ¿Qué significa "bricking" en un sentido más estricto?

3voto

Mob Puntos 167

Prueba a utilizar el tutorial relacionado del mismo grupo (MIT's High-Low Tech) 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 funcionar (1 u 8 Mhz de reloj interno, o 20Mhz de cristal externo) y luego utilice el menú Herramientas -> Grabar Bootloader". Creo que la selección de la placa de velocidad deseada modifica la forma en que el delay() y otras funciones de Arduino relacionadas con el tiempo trabajan con el fin de sincronizar 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 una sincronización más sensible requerida para controlar manualmente los pulsos enviados a un servo usando delayMicroseconds().

2voto

JW. Puntos 145

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

Si necesitas una mayor precisión que la que proporciona el oscilador interno deberías pensar en utilizar un cristal externo o un resonador, pero tendrás que cambiar la configuración de los fusibles del AVR para que eso funcione, y creo que necesitarás un programador como el AVRISP mkII para hacerlo con AVR Studio (mi recomendación).

No sé mucho sobre el sketch ArduinoISP pero a mí me parece que batea el protocolo ISP para subir un programa al chip de destino (no el Mega328 de a bordo), no estoy seguro de que esté equipado para manipular fusibles. ArduinoISP está documentado aquí http://arduino.cc/en/Tutorial/ArduinoISP Por cierto. Tenga en cuenta que no se puede utilizar un UNO actualmente para ejecutar el sketch ArduinoISP. No me parece que se pueda usar el sketch para hacer del Arduino 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 los comentarios de todos

0 votos

Gracias por el aviso sobre el UNO, en realidad estoy usando un Duemilanove con el chip 168 cambiado por un 328, y puedo conseguir que los sketches normales de ATtiny se carguen correctamente a través de ArduinoISP. ¡Probaré tu consejo de /16!

0 votos

@fearoffours Sabes que otra cosa que podrías probar es escribir un sketch basado en ArduinoISP que ponga los fusibles a un valor determinado. Si ArduinoISP puede escribir la Flash, no hay ninguna razón que se me ocurra para que no se pueda hacer un bit-bang del protocolo ISP descrito en las hojas de datos del AVR para configurar los Fusibles.

1 votos

@fearoffours, también me acabo de dar cuenta (y actualizar el post) para decir multiplicar por 16 en lugar de dividir por 16 (su ejecución de un reloj más lento que tendrá más tics para obtener la misma duración)

1voto

Hrvoje Puntos 4248

Parece que estás usando ArduinoISP, intenta usar Estudio AVR o las opciones de la línea de comandos para avrdude . Dependiendo de cómo se haya escrito el ArduinoISP, puede funcionar igual que un Atmel AVRISP mkII o similar.

0 votos

No creía que el Arduino fuera en sí mismo un programador ISP - creía que tenía una cabecera ISP para poder grabar un nuevo bootloader en un ATMega328 fresco en circuito...

0 votos

Leyendo el artículo más detenidamente, parece que se puede utilizar el sketch de ArduinoISP para hacer esto - ¡se aprende algo nuevo cada día! :)

0 votos

AVR studio está bien si estás en Windows. Sepa que hay un plugin de AVR para Eclipse (es distinto del plugin de Arduino conocido como Sloeber). Hay un diálogo de fusible ingenioso disponible en Propiedades --> AVR. Pero sí el OP sólo quiere usar las frecuencias del "core" y "Burn Bootloader".

1voto

Alasdair Puntos 715

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

Ver http://www.engbedded.com/fusecalc para más ajustes de los fusibles.

Puede seguir utilizando avrdude directamente para cambiar los ajustes de los fusibles de su ATtiny85 incluso cuando utilice un ArduinoISP como programador.

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

0 votos

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

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X