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?
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.
delay(20)
en delay(40)
su definición de void heartbeat()
.)Estoy usando Arduino UNO + ArduinoISP con éxito.
Agregue -U
banderas a su avrdude
comando 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 6
como 0x6f
está 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.
-U lfuse:w:0x6f:m
opció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.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.
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_cpu
línea de su archivo [arduino_folder]\hardware\attiny45_85\boards.txt.
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
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 )
Seleccione ATTiny85 explícitamente si es necesario.
Elige un reloj. Hasta que sepas más, elige un reloj interno .
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.
vicatcu
jonathand
nick t