Por lo tanto, he estado queriendo romper con la abstracción del arduino desde hace un tiempo. Hice un tablero que tiene un ATtiny10 con un cristal y una salida. No puedo por mi vida entender lo que estoy haciendo mal.
Este es el problema: Cuando selecciono la fuente del reloj, el AVR deja de funcionar.
Hice que hicieran un PCB (pequeño) a medida para montarlo todo. Pensando que no hice algo bien (aunque el esquema se veía bien)
Cambié el diseño e hice otro (para el segundo, tenía trazos con el reloj rodeado por un plano de tierra (no funcionaba todavía) [También, el primer diseño usaba todo menos el AVR proveniente de ebay. Pensando que tal vez era un problema de calidad, el segundo tablero se obtiene totalmente de Mouser]
Por último, para asegurarme de que no era un idiota absoluto, compré un tablero de conexiones y sólo hice el circuito. Esto todavía funcionaba como todos los demás
Funciona muy bien con el oscilador interno, pero en cuanto programo para cambiar la fuente del reloj se detiene.
Note que agregué R2 para mantener el MOSFET derribado pero no lo lleno para programarlo, ya que el TPI (Tiny Programming Interface) usa pullups en esa línea y no puedo llenarlo si voy a programar el chip
Página 21 de la hoja de datos sobre el cambio de reloj
Página 22 de la hoja de datos relativa al preescalador (Preescalador con reloj, no con temporizador)
Estoy usando un programador MkII de Atmel y estos son los bits de los fusibles:
Reloj externo de salida
0xFB
Esto fue programado a través del estudio de Atmel y he usado un par de ATtiny's diferentes y los chips mantuvieron estos ajustes una vez programados, así que estoy bastante seguro de que los fusibles están escribiendo correctamente
Ahora el código: (Este es el programa completo, la parte del temporizador funciona (obviamente no aunque una vez que el reloj cambia))
#define F_CPU 8000000
#include <avr/io.h>
#include <avr/interrupt.h>
void initClock()
{
// Setting CLKPSR does not affect the problem (It doesn't work regardless of what this is set to)
// I have tried this before and after setting CLKMSR
CCP = 0xD8;
CLKPSR = 0;
CCP = 0xD8;
CLKMSR = 0b10;
}
void initPorts()
{
DDRB |= (1 << PORTB0); // PB0 = OCR0A
}
void initTimer()
{
// I posted this code just in case, this works as expected (but only on the internal oscillator)
// We want Compare Output Mode, Clear OC0A on Compare Match
TCCR0A = (1 << COM0A0);
// Overflow setting
TIMSK0 |= (1 << OCIE0A);
// We will not use a prescaler
// This also starts the timer
TCCR0B = (1 << CS00) | (1 << WGM02);
// This is the value at which the timer will restart
OCR0A = 8299;
// Set external interrupts
sei();
}
int main(void)
{
initClock();
initPorts();
initTimer();
while(1)
{
}
}
Seguramente tiene que haber algo que me estoy perdiendo. He tratado de leer y releer las secciones del reloj de la hoja de datos para descubrirlo yo mismo. Sin embargo, estoy perplejo. Tal vez alguien pueda ayudarme a entender mi error.
¡Gracias! Por favor, hágame saber si hay más información que pueda añadir para que sea más fácil de entender.