Я использую Atmega32. Я хочу использовать внешний кварц 16 МГц и использую универсальный программатор (например, http://www.kanda.com/products/wellon/VP-290.html ). У меня вопрос: после того, как я запрограммировал чип и установил его фьюз-биты для использования внешнего генератора, нужен ли мне внешний генератор, когда я хочу перепрограммировать его флэш-память?
Да! Когда вы настраиваете фьюзы, чтобы контроллер работал от внешних часов, вам также нужны эти внешние часы для перепрограммирования.
Важно отметить, что я тестировал это с Arduino, настроенным как ISP (внутрисхемный последовательный программатор), который не пытается обеспечить внешние часы для программируемого устройства. Это могут сделать и другие программисты, но это будет зависеть от программиста. ISP является наиболее распространенным способом программирования этих устройств, но есть и другие программаторы. Дело в том, что устройство само по себе нуждается во внешних часах. Не уверен для параллельного программиста. Программатор высокого напряжения может обойтись без внешних часов.
Я не тестировал это с ATmega, а скорее с ATtiny45 , но оба AVR очень похожи в этих аспектах.
Вот что я сделал:
.low = 0x61
Обратите внимание, что настройки фьюза могут зависеть от контроллера, поэтому это настройка для ATtiny45;.low = 0xe0
;avrdude: Подпись устройства = 0xffffff
avrdude: Ой! Неверная подпись устройства.
Дважды проверьте соединения и повторите попытку или используйте -F, чтобы переопределить эту проверку.
avrdude сделано. Спасибо.
Итак, в заключение:
Если вы программируете фьюзы для использования внешних часов, то вам также потребуются внешние часы для программирования устройства.
/*
(c) copyright 2013 by J.P. Hendrix
*/
#include <avr/io.h>
#include <util/delay.h>
#define _BS(bit) ( 1 << ( bit ) )
#define _BC(bit) ( 0 << ( bit ) )
/*
ATtiny45
pin function name ISP SPI XO I2C/TWI comparator ADC pin chg
1 !RESET PB5 ADC0 PCINT5 dW
2 extOscPin PB3 XTAL1 CLKI !OC1B ADC3 PCINT3
3 PB4 XTAL2 CLKO OC1B ADC2 PCINT4
4 GND GND
5 PB0 MOSI DI SDA AIN0 OC0A !OC1A AREF PCINT0
6 outputPin PB1 MISO DO AIN1 OC0B OC1A PCINT1
7 PB2 SCK USCK SCL T0 ADC1 PCINT2 INT0
8 VCC VCC
*/
const uint8_t outputPin = _BS( PB1 );
const uint8_t extOscPin = _BS( PB3 );
#ifdef F_CPU
#if ( F_CPU == 1000000 )
// 1MHz
FUSES = { .low = LFUSE_DEFAULT , .high = HFUSE_DEFAULT , .extended = EFUSE_DEFAULT , };
#elif ( F_CPU == 1600000 )
// 1.6MHz => ATtiny15 Compatibilty Mode
#warn "ATtiny15 Compatibility Mode changes Timer1 behaviour!"
FUSES = { .low = 0x63 , .high = HFUSE_DEFAULT , .extended = EFUSE_DEFAULT , };
#elif ( F_CPU == 2000000 )
// 2MHz
FUSES = { .low = 0x61 , .high = HFUSE_DEFAULT , .extended = EFUSE_DEFAULT , };
#elif ( F_CPU == 6400000 )
// 6.4MHz => ATtiny15 Compatibility Mode
#warn "ATtiny15 Compatibility Mode changes Timer1 behaviour!"
FUSES = { .low = 0xe3 , .high = HFUSE_DEFAULT , .extended = EFUSE_DEFAULT , };
#elif ( F_CPU == 8000000 )
// 8MHz
FUSES = { .low = 0xe2 , .high = HFUSE_DEFAULT , .extended = EFUSE_DEFAULT , };
#elif ( F_CPU == 16000000 )
// 16MHz
FUSES = { .low = 0xe1 , .high = HFUSE_DEFAULT , .extended = EFUSE_DEFAULT , };
#else
// #error "F_CPU setting not recognized."
// External oscillator selected
FUSES = { .low = 0xe0 , .high = HFUSE_DEFAULT , .extended = EFUSE_DEFAULT , };
#endif
#else
#error "F_CPU not defined."
#endif
void setup( void ) { // Initialize all hardware
DDRB = outputPin; // Data Direction Register Port B
}
int main( void ) {
setup(); // Initialize the hardware
while ( 1 ) {
_delay_us( 500 );
PORTB ^= outputPin;
}
}
Это зависит от программатора, который вы будете использовать во второй раз, когда будете программировать чип.
Чтобы использовать программатор ISP ( например, USBTinyIPS ), чип должен быть запущен и функционировать, чтобы его можно было запрограммировать. Если вы установите фьюзы на использование внешнего кристалла/резонатора ( CKSEL1
, CKSEL2
, CKSEL3
и CKOPT
биты), тогда микросхеме вообще потребуется внешний кристалл/резонатор для работы, нет альтернативного варианта, такого как «О, нет внешнего кристалла? просто используйте внутренний резонатор"). Таким образом, вам нужно будет подключить кварц/резонатор для программирования флэш-памяти через ISP. Вот почему рекомендуется проверять и перепроверять значения предохранителей перед их программированием: это простой способ испортить чип (а не просто настроить его на использование внешнего кристалла/резонатора, когда у вас его нет). рука,SPIEN
значение предохранителя)
Вы также можете запрограммировать ATmega32 с помощью высоковольтного (последовательного или параллельного) программирования и JTAG. Для программирования высокого напряжения вам не нужен внешний кристалл, я уверен: HVSP и HVPP можно использовать для сброса предохранителей без внешнего тактирования. Я не уверен, какой метод использует ваш программист. Если вы используете ISP, вам потребуется перепрограммировать внешний синхронизирующий механизм после установки фьюзов для внешнего кристалла/резонатора.
Нет, вам не нужен внешний генератор, чтобы перепрограммировать вспышку.
микротерион
келлоги
CKOPT
бит - в даташите не нашел?