¿Programación de ATmega32 sin reloj externo?

3

Estoy usando un Atmega32. Quiero usar un cristal externo de 16 MHz y estoy usando un programador universal (como enlace ) . Mi pregunta es: una vez que haya programado el chip y configurado sus bits de fusible para usar un oscilador externo, ¿necesitaría un oscilador externo cuando quisiera reprogramar su flash?

    
pregunta Asad Ismail

3 respuestas

6

¡Sí! Cuando configura los fusibles para hacer que el controlador funcione desde un reloj externo, también necesita ese reloj externo para la reprogramación.

Es importante notar que probé esto con un Arduino configurado como ISP (En el circuito Serial Programador), que no intenta proporcionar un reloj externo al dispositivo que se está programando. Otros programadores pueden hacer esto, pero eso dependería del programador. ISP es la forma más común de programar estos dispositivos, pero también hay otros programadores. El hecho es que el dispositivo en sí necesita un reloj externo. No estoy seguro para un programador paralelo. Un programador de alto voltaje puede prescindir de un reloj externo.

No probé esto con un ATmega, sino con un ATtiny45 , pero ambos AVR son muy similares en estos aspectos.

Esto es lo que hice:

  • Escribí un pequeño programa para generar una salida de onda cuadrada de 1kHz (listado a continuación);
  • Seleccioné el reloj de 2MHz y programé .low = 0x61 . Observe que la configuración del fusible puede ser específica del controlador, por lo que esta es la configuración para ATtiny45;
  • El controlador genera una frecuencia de 1 kHz, como se esperaba;
  • Seleccioné 1.8432MHz para el reloj y programé .low = 0xe0 ;
  • La frecuencia de salida se redujo a 0Hz hasta que conecté el oscilador, luego salté a 1kHz, nuevamente como se esperaba;
  • Desconecté el oscilador externo (salida: 0Hz);
  • Intenté programar el dispositivo, lo que resultó en:
  

avrdude: firma del dispositivo = 0xffffff

     

avrdude: ¡Ay! Firma de dispositivo no válida.

     

Vuelva a verificar las conexiones y vuelva a intentarlo, o use -F para anular esta verificación.

  • Volví a conectar el oscilador externo y programé el dispositivo para 2MHz con el siguiente resultado:
  

avrdude hecho. Gracias.

  • y, por supuesto, la salida volvió a 1kHz.

En conclusión:

Si programa los fusibles para usar un reloj externo, también necesitará un reloj externo para programar el dispositivo.

/*
        (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;
        }
}
    
respondido por el jippie
4

Depende del programador que usará la segunda vez que programe el chip.

Para utilizar un programador ISP ( como USBTinyIPS ), el chip debe estar en funcionamiento y funcionar para poder programado. Si configura los fusibles para usar el cristal / resonador externo ( CKSEL1 , CKSEL2 , CKSEL3 y CKOPT bits), entonces el chip necesitará el cristal / resonador externo para funcionar, no hay opción de reserva como "Oh, ¿no hay un cristal externo? Solo usaré el resonador interno"). Por lo tanto, deberá tener el cristal / resonador conectado para la programación de Flash a través de ISP. Por esta razón, se recomienda que verifique y vuelva a verificar los valores de los fusibles antes de programarlos: es una forma fácil de bloquear el chip (no solo configurándolo para que use un cristal / resonador externo cuando no tenga uno). pero también porque puede hacer que no responda programando algunos valores, como el valor de SPIEN fuse)

También puede programar ATmega32 a través de la programación de alto voltaje (serie o paralelo) y JTAG. Para la programación de alto voltaje no necesita el cristal externo, estoy bastante seguro de que se pueden usar HVSP y HVPP para restablecer los fusibles sin temporización externa. No estoy seguro de qué método utiliza su programador. Si es ISP, entonces necesitará el mecanismo de reloj externo para reprogramar una vez que haya configurado los fusibles para el cristal / resonador externo.

    
respondido por el angelatlarge
-2

No, no necesita el oscilador externo para reprogramar el flash.

    
respondido por el Suirnder

Lea otras preguntas en las etiquetas