Brickega atmega32 con bits de fusible

1

Seleccioné accidentalmente el reloj equivocado en el estudio de atmel (8-12MHz RC Oscillator en lugar de 8MHz crystal) y estoy tratando de descubrir cómo puedo desbloquearlo ahora. Tengo un arduino a mano y un amigo me dijo que puedo usar eso para simular un oscilador RC. Sin embargo, a pesar de lo que he intentado, no he podido hacerlo funcionar. He probado una amplia gama de velocidades de transmisión, pero no sé a dónde ir desde allí.

    
pregunta asdf

2 respuestas

3

Los AVR, así como casi cualquier otra cosa que use osciladores resonantes paralelos (o, simplemente, tiene 2 clavijas de reloj / XTAL) siempre pueden ser controlados por un reloj externo directo que omite cualquier configuración incorrecta que se haya quemado accidentalmente en los fusibles. El pin del reloj "real" es, en el caso del ATmega32, el pin XTAL1. Los bits del fusible cambian el comportamiento del pin XTAL2 para que genere su propio reloj si el circuito resonante paralelo correcto está conectado entre XTAL1 y XTAL2. Todos los circuitos del oscilador tienen la salida como parte de un bucle cerrado, por lo que, independientemente de la configuración del bit de fusible, XTAL1 es donde se alimenta la salida de un oscilador externo, y el AVR no sabe ni se preocupa de dónde viene realmente su reloj. Los bits de fusible solo alteran el material entre XTAL1 y XTAL2, pero XTAL1 es la entrada real para el reloj.

Todo lo que has hecho ha roto temporalmente la capacidad del chip para generar su propia fuente de reloj, por lo que todo lo que necesitas hacer es hacer que otra cosa conduzca su pin de reloj (XTAL1). Er, no necesitas simular un oscilador RC, y ciertamente no puedes simular uno en ningún significado real de la palabra usando un Arduino. Independientemente, no hay necesidad o punto. Simplemente vierta una onda cuadrada de 1 MHz con un 50% de servicio en XTAL1 y estará listo para comenzar.

Podrías hacer esto más fácilmente con ese Arduino, dependiendo de lo rápido que sea. Si se ejecuta a 8MHz, este código debería producir un reloj de 1MHz en el pin digital 11.

void main()
{
    DDRB = 0xFF;
    cli();  // disable interrupts
    while(1)
    {
        PORTB |= 0x8;
        PORTB |= 0x8;
        PORTB &= ~0x8;
    }
}

Si tienes un arduino funcionando a 16MHz, necesitamos distribuir de manera uniforme 8 instrucciones adicionales, así que prueba:

void main()
{
    DDRB = 0xFF;
    cli();  // disable interrupts
    while(1)
    {
        PORTB |= 0x8; //sbi 2 cycles 
        PORTB |= 0x8; //sbi 2 cycles
        nop(); // 1 cycle each
        nop();
        nop();
        nop();  // 8 cycles spent with D11 high
        PORTB &= ~0x8; // cbi 2 cycles
        nop(); // 1 cycle each
        nop();
        nop();
        nop();
    }   // rjmp 2 cycles - D11 spent 8 cycles low. 
}   

Aquellos te darán esa agradable onda cuadrada de 50 MHz de 1MHz que tu ATmega32 desea.

    
respondido por el metacollin
0

Suministre un tren de pulsos al pin XTAL1 como se describe en la sección "Programación de la memoria" de la hoja de datos. Asegúrese de que el tren de pulsos sea lo suficientemente rápido y que el programador sea lo suficientemente lento para cumplir con todas las restricciones descritas en la subsección correspondiente.

    
respondido por el Ignacio Vazquez-Abrams

Lea otras preguntas en las etiquetas