ATmega32-Programmierung ohne externe Uhr?

Ich verwende einen Atmega32. Ich möchte einen externen 16-MHz-Quarz verwenden und verwende einen universellen Programmierer (wie http://www.kanda.com/products/wellon/VP-290.html ). Meine Frage ist: Wenn ich den Chip programmiert und seine Sicherungsbits so eingestellt habe, dass er einen externen Oszillator verwendet, brauche ich dann einen externen Oszillator, wenn ich seinen Blitz neu programmieren möchte?

Antworten (3)

Ja! Wenn Sie die Sicherungen so konfigurieren, dass der Controller von einer externen Uhr läuft, benötigen Sie diese externe Uhr auch für die Neuprogrammierung.

Es ist wichtig zu beachten, dass ich dies mit einem als ISP (In circuit Serial Programmer) konfigurierten Arduino getestet habe , der nicht versucht, dem zu programmierenden Gerät einen externen Takt bereitzustellen. Andere Programmierer können dies tun, aber das hängt vom Programmierer ab. ISP ist die häufigste Art, diese Geräte zu programmieren, aber es gibt auch andere Programmierer. Tatsache ist, dass das Gerät an sich eine externe Uhr benötigt. Unsicher für einen parallelen Programmierer. Ein High Voltage Programmer kommt ohne externen Takt aus.

Getestet habe ich das nicht mit einem ATmega, sondern eher mit einem ATtiny45 , aber beide AVR's sind sich in diesen Aspekten sehr ähnlich.

Das habe ich getan:

  • Ich habe ein kleines Programm geschrieben, um eine 1-kHz-Rechteckwellenausgabe auszugeben (Liste unten);
  • Ich habe 2 MHz Takt ausgewählt und programmiert .low = 0x61Beachten Sie, dass die Sicherungseinstellungen Controller-spezifisch sein können, also ist dies die Einstellung für ATtiny45;
  • Der Controller gibt erwartungsgemäß eine Frequenz von 1 kHz aus;
  • Ich habe 1,8432 MHz als Takt ausgewählt und programmiert .low = 0xe0;
  • Die Ausgangsfrequenz fiel auf 0 Hz, bis ich den Oszillator anschloss, dann sprang sie wieder wie erwartet auf 1 kHz;
  • Ich habe den externen Oszillator abgenommen (Ausgang: 0Hz);
  • Ich habe versucht, das Gerät zu programmieren, was zu Folgendem führte:

avrdude: Gerätesignatur = 0xffffff

Avrdude: Huch! Ungültige Gerätesignatur.

Überprüfen Sie die Verbindungen und versuchen Sie es erneut, oder verwenden Sie -F, um diese Prüfung zu überschreiben.

  • Ich habe den externen Oszillator wieder angeschlossen und das Gerät für 2 MHz programmiert, das folgende Ergebnis:

fertig. Danke schön.

  • und natürlich war der Ausgang wieder bei 1kHz.

Also abschließend:

Wenn Sie die Sicherungen für die Verwendung einer externen Uhr programmieren, benötigen Sie auch eine externe Uhr, um das Gerät zu programmieren.


/*
        (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;
        }
}

Es hängt von dem Programmierer ab, den Sie beim zweiten Programmieren des Chips verwenden.

Um einen ISP-Programmierer ( wie USBTinyIPS ) zu verwenden , muss der Chip laufen und funktionsfähig sein, um programmiert zu werden. Wenn Sie die Sicherungen so einstellen, dass sie den externen Quarz/Resonator ( CKSEL1, CKSEL2, CKSEL3und CKOPTBits) verwenden, benötigt der Chip den externen Quarz/Resonator, um überhaupt zu laufen, es gibt keine Fallback-Option wie "Oh, kein externer Quarz? Ich werde verwenden Sie einfach den internen Resonator"). Sie müssen also den Quarz/Resonator für die Flash-Programmierung über ISP anschließen. Aus diesem Grund wird empfohlen, dass Sie die Sicherungswerte überprüfen, bevor Sie sie programmieren: Es ist eine einfache Möglichkeit, den Chip zu mauern (nicht nur, indem Sie ihn so einstellen, dass er einen externen Quarz/Resonator verwendet, wenn Sie keinen haben Hand,SPIENSicherungswert)

Sie können ATmega32 auch über Hochspannungsprogrammierung (seriell oder parallel) und JTAG programmieren. Für Hochspannungsprogrammierung braucht man den externen Quarz nicht, da bin ich mir ziemlich sicher: HVSP und HVPP können verwendet werden, um die Fuses ohne externe Taktung zurückzusetzen. Ich bin mir nicht sicher, welche Methode Ihr Programmierer verwendet. Wenn Sie ISP sind, müssen Sie den externen Taktmechanismus neu programmieren, sobald Sie die Sicherungen für den externen Quarz / Resonator eingestellt haben.

Einige kleinere Klarstellungen: Der ATmega32 unterstützt HVPP, aber NICHT HVSP (MCUs mit weniger als 20 Pins unterstützen HVSP, solche mit mehr als 20 Pins unterstützen HVPP). HVPP erfordert keinen externen Kristall, aber es erfordert Zugriff auf den XTAL1 / CLKI-Pin, daher ist es schwierig, es auf einer Platine mit angeschlossenem Kristall zu verwenden.
Wenn ich mich also von CKSEL3:0, LB1 und SPIEN fernhalte, sollte ich den Flash 10.000 Mal über die SPI-Schnittstelle ohne externe Oszillatoren neu programmieren können, oder? Und was ist das CKOPTBit - ich konnte es nicht im Datenblatt finden?

Nein, Sie brauchen den externen Oszillator nicht, um den Blitz neu zu programmieren.

Diese Antwort wäre besser, wenn Sie einen Verweis darauf hinzufügen würden.