Программирование ATmega32 без внешних часов?

Я использую Atmega32. Я хочу использовать внешний кварц 16 МГц и использую универсальный программатор (например, http://www.kanda.com/products/wellon/VP-290.html ). У меня вопрос: после того, как я запрограммировал чип и установил его фьюз-биты для использования внешнего генератора, нужен ли мне внешний генератор, когда я хочу перепрограммировать его флэш-память?

Ответы (3)

Да! Когда вы настраиваете фьюзы, чтобы контроллер работал от внешних часов, вам также нужны эти внешние часы для перепрограммирования.

Важно отметить, что я тестировал это с Arduino, настроенным как ISP (внутрисхемный последовательный программатор), который не пытается обеспечить внешние часы для программируемого устройства. Это могут сделать и другие программисты, но это будет зависеть от программиста. ISP является наиболее распространенным способом программирования этих устройств, но есть и другие программаторы. Дело в том, что устройство само по себе нуждается во внешних часах. Не уверен для параллельного программиста. Программатор высокого напряжения может обойтись без внешних часов.

Я не тестировал это с ATmega, а скорее с ATtiny45 , но оба AVR очень похожи в этих аспектах.

Вот что я сделал:

  • Я написал небольшую программу для вывода сигнала прямоугольной формы с частотой 1 кГц (листинг ниже);
  • Я выбрал тактовую частоту 2 МГц и запрограммировал. .low = 0x61Обратите внимание, что настройки фьюза могут зависеть от контроллера, поэтому это настройка для ATtiny45;
  • Контроллер выдает частоту 1 кГц, как и ожидалось;
  • Я выбрал 1,8432 МГц для часов и запрограммировал .low = 0xe0;
  • Выходная частота упала до 0 Гц, пока я не подключил генератор, затем она подскочила до 1 кГц, как и ожидалось;
  • Я отсоединил внешний генератор (выход: 0 Гц);
  • Пробовал программировать устройство, в результате:

avrdude: Подпись устройства = 0xffffff

avrdude: Ой! Неверная подпись устройства.

Дважды проверьте соединения и повторите попытку или используйте -F, чтобы переопределить эту проверку.

  • Я снова подключил внешний генератор и запрограммировал устройство на 2 МГц, и получился следующий результат:

avrdude сделано. Спасибо.

  • и, конечно же, выходной сигнал вернулся к частоте 1 кГц.

Итак, в заключение:

Если вы программируете фьюзы для использования внешних часов, то вам также потребуются внешние часы для программирования устройства.


/*
        (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, вам потребуется перепрограммировать внешний синхронизирующий механизм после установки фьюзов для внешнего кристалла/резонатора.

Некоторые небольшие уточнения: ATmega32 поддерживает HVPP, но НЕ HVSP (MCU с менее чем 20 контактами поддерживают HVSP, с более чем 20 контактами поддерживают HVPP). HVPP не требует внешнего кристалла, но требует доступа к выводу XTAL1/CLKI, поэтому его сложно использовать на плате с подключенным кристаллом.
Так что, если я воздержусь от CKSEL3:0, LB1 и SPIEN, я должен просто перепрограммировать флэш-память 10 000 раз через интерфейс SPI без каких-либо внешних генераторов, верно? А что это за CKOPTбит - в даташите не нашел?

Нет, вам не нужен внешний генератор, чтобы перепрограммировать вспышку.

Этот ответ был бы лучше, если бы вы добавили ссылку на него.