calculadores previos de la velocidad del reloj de Arduino al inicio sin fusibles

2

Sé que es posible cambiar el prescaler del reloj en tiempo de ejecución. Pero, ¿hay una manera de configurar el prescaler que se usa en el arranque en un ATMega328? Soy consciente de los fusibles, pero esos son bastante permanentes. Quiero que se inicie a 8MHz y ver si está funcionando primero con una batería de respaldo de bajo voltaje. Y si no, entonces cambia a 16MHz. He intentado hacerlo como lo primero en setup () pero no parece lo suficientemente rápido.

    
pregunta Adam Haile

1 respuesta

3
  

Soy consciente de los fusibles, pero son bastante permanentes

Puede usar el fusible CLKDIV8, solo controla el valor del divisor de CPU precargado, por lo que no lo considero un cambio permanente.
El fusible establece el valor cargado predeterminado en CLKPR (Registro de preescala del reloj) en cualquiera de

  • clk / 1
  • clk / 8

Luego, en su código, simplemente puede configurar el divisor en clk / 1 para restaurar la velocidad de la CPU a 16MHz

No estoy seguro, pero a menos que el cargador de arranque sea adaptable, este cambio puede afectar la velocidad de UART y crear problemas con el gestor de arranque Arduino, esto debe probarse.

Hice una prueba con mi Arduino pro mini (m328p). Después de habilitar el fusible CLKDIV8 usando un programador externo, el cargador de arranque Arduino deja de responder y no veo ninguna manera de anular la velocidad UART que el IDE de Arduiono intenta usar.

Solución actualizada

Encontré otra solución que no necesita cambiar el cargador de arranque, simplemente creas un nuevo perfil para la placa que tiene el fusible CLDIV8 habilitado.

Debe modificar el archivo boards.txt (por ejemplo, arduino-1.5.5 \ hardware \ arduino \ avr \ boards.txt), la velocidad en baudios para cada placa se almacena allí.

Localice la sección que hace referencia a su placa, por ejemplo, en mi caso

## Arduino Pro or Pro Mini (5V, 16 MHz) w/ ATmega328
## -------------------------------------------------
pro.menu.cpu.16MHzatmega328=ATmega328 (5V, 16 MHz)

pro.menu.cpu.16MHzatmega328.upload.maximum_size=30720
pro.menu.cpu.16MHzatmega328.upload.maximum_data_size=2048
pro.menu.cpu.16MHzatmega328.upload.speed=57600

pro.menu.cpu.16MHzatmega328.bootloader.low_fuses=0xFF
pro.menu.cpu.16MHzatmega328.bootloader.high_fuses=0xDA
pro.menu.cpu.16MHzatmega328.bootloader.extended_fuses=0x05
pro.menu.cpu.16MHzatmega328.bootloader.file=atmega/ATmegaBOOT_168_atmega328.hex

pro.menu.cpu.16MHzatmega328.build.mcu=atmega328p
pro.menu.cpu.16MHzatmega328.build.f_cpu=16000000L

Ahora copie y pegue esa sección para crear una entrada duplicada que vamos a modificar. En esa entrada, tendrá que cambiar el nombre para que no entre en conflicto con el existente (cualquier nuevo nombre será suficiente) y establecer la velocidad en baudios en 1/8 de la que se usó originalmente.
Estoy mostrando los cambios en negrita

Laentradaanteriorconlanuevasiguienteseveasíenmicaso:

##ArduinoProorProMini(5V,16MHz)w/ATmega328##-------------------------------------------------pro.menu.cpu.16MHzatmega328=ATmega328(5V,16MHz)pro.menu.cpu.16MHzatmega328.upload.maximum_size=30720pro.menu.cpu.16MHzatmega328.upload.maximum_data_size=2048pro.menu.cpu.16MHzatmega328.upload.speed=57600pro.menu.cpu.16MHzatmega328.bootloader.low_fuses=0xFFpro.menu.cpu.16MHzatmega328.bootloader.high_fuses=0xDApro.menu.cpu.16MHzatmega328.bootloader.extended_fuses=0x05pro.menu.cpu.16MHzatmega328.bootloader.file=atmega/ATmegaBOOT_168_atmega328.hexpro.menu.cpu.16MHzatmega328.build.mcu=atmega328ppro.menu.cpu.16MHzatmega328.build.f_cpu=16000000L##ArduinoProorProMini(5V,16MHz)w/ATmega328CLKDIV8##-------------------------------------------------pro.menu.cpu.16MHzatmega328CLKDIV8=ATmega328(5V,16MHz)CLKDIV8pro.menu.cpu.16MHzatmega328CLKDIV8.upload.maximum_size=30720pro.menu.cpu.16MHzatmega328CLKDIV8.upload.maximum_data_size=2048pro.menu.cpu.16MHzatmega328CLKDIV8.upload.speed=7200pro.menu.cpu.16MHzatmega328CLKDIV8.bootloader.low_fuses=0xFFpro.menu.cpu.16MHzatmega328CLKDIV8.bootloader.high_fuses=0xDApro.menu.cpu.16MHzatmega328CLKDIV8.bootloader.extended_fuses=0x05pro.menu.cpu.16MHzatmega328CLKDIV8.bootloader.file=atmega/ATmegaBOOT_168_atmega328.hexpro.menu.cpu.16MHzatmega328CLKDIV8.build.mcu=atmega328ppro.menu.cpu.16MHzatmega328CLKDIV8.build.f_cpu=16000000L

Despuésdeguardarelarchivo,veráunanuevaentradaenelIDEdeArduino.Alusarlo,podráprogramarlaplacamodificada.

    
respondido por el alexan_e

Lea otras preguntas en las etiquetas