atmega32 bricked con puntas de fusible

Accidentalmente seleccioné el reloj incorrecto en Atmel Studio (oscilador RC de 8-12 MHz en lugar de cristal de 8 MHz) y estoy tratando de averiguar cómo puedo desbloquearlo ahora. Tengo un arduino a mano y un amigo me dijo que puedo usarlo 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 en baudios, pero no sé a dónde ir desde allí.

Respuestas (2)

Los AVR, así como casi cualquier otra cosa que use osciladores resonantes paralelos (o, en pocas palabras, tiene 2 pines de reloj/XTAL) siempre pueden ser controlados por un reloj externo directo que pasa por alto cualquier configuración incorrecta que se haya quemado accidentalmente en los fusibles. El pin de 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 se conecta el circuito resonante paralelo correcto entre XTAL1 y XTAL2. Todos los circuitos del oscilador tienen la salida como parte de un circuito cerrado, por lo que, independientemente de la configuración de los bits del fusible, XTAL1 es donde se alimenta la salida de un oscilador externo, y el AVR no sabe ni le importa de dónde proviene realmente su reloj. Los bits del fusible simplemente alteran cosas entre XTAL1 y XTAL2, pero XTAL1 es la entrada real para el reloj.

Todo lo que ha hecho es romper temporalmente la capacidad del chip para generar su propia fuente de reloj, por lo que todo lo que necesita hacer es tener algo más que controle su pin de reloj (XTAL1). Er, no necesita simular un oscilador RC, y ciertamente no podría simular uno en ningún significado real de la palabra usando un Arduino. Independientemente, no hay necesidad o punto. Simplemente vierta una buena onda cuadrada de 1 MHz con un 50 % de servicio en XTAL1 y estará listo para comenzar.

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

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

Si tiene un arduino funcionando a 16 MHz, necesitamos distribuir uniformemente 8 instrucciones adicionales, así que intente:

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. 
}   

Esos le darán esa agradable onda cuadrada de 1 MHz de servicio del 50% que su ATmega32 anhela.

¿Por qué tiene sentido usar 1 MHz en lugar de los 8 o 16 MHz "nativos" del Arduino? ¿Se debe a que los desafíos de mantener la señal limpia sobre los cables de la placa de prueba, etc. aumentan considerablemente a medida que aumenta la frecuencia, por lo que la mejor oportunidad de éxito contra los posibles parásitos es mantener el flujo bajo?

Suministre un tren de pulsos al pin XTAL1 como se describe en la sección "Programación de 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.

Gracias por la ayuda. Sin embargo, saqué la hoja de datos del atmega32 y no he podido encontrar la velocidad a la que tengo que definir el tren de pulsos. ¿Se me escapa algo?
"Dependiendo de los fusibles CKSEL, debe estar presente un reloj válido. Los períodos mínimos alto y bajo para la entrada del reloj serial (SCK) se definen de la siguiente manera:" "Bajo:> 2 ciclos de reloj de CPU para f ck < 12 MHz, 3 relojes de CPU ciclos para f ck ≥ 12 MHz" "Alto:> 2 ciclos de reloj de CPU para f ck < 12 MHz, 3 ciclos de reloj de CPU para f ck ≥ 12 MHz"