Por lo tanto, he estado queriendo romper con la abstracción arduino por un tiempo. Hice una placa que tiene un ATtiny10 con un cristal y una salida. Por mi vida no puedo entender lo que estoy haciendo mal.
Aquí está el problema: cuando selecciono la fuente del reloj, el AVR deja de funcionar.
Tuve un PCB personalizado (uno pequeño) hecho para montar 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 rastros con un reloj rodeado por un plano de tierra (No funcionó todavía) [También, el primer diseño estaba usando todo, excepto el AVR procedente de eBay. Pensando que tal vez fue un problema de calidad, la segunda placa se obtiene completamente de Mouser]
Por último, para asegurarme de que no era un completo idiota, compré una tabla de ruptura y acabo de rodar en el circuito. Esto todavía se realiza igual que todos los demás
Funciona bien con el oscilador interno, pero tan pronto como programo para cambiar la fuente del reloj, se detiene.
TengaencuentaqueagreguéR2paramantenerelMOSFEThaciaabajoperonolollenoparaprogramarlo,yaqueTPI(TinyProgrammingInterface)usapullupsenesalíneaynopuedorellenaresosivoyaprogramarelchip
Página21delahojadedatossobreelcambiodereloj
Página 22 de la hoja de datos sobre el prescaler (Clock prescaler not timer prescaler)
EstoyusandounprogramadorMkIIdeAtmelyestossonlosbitsdefusible:
Salidaderelojexterno
0xFB
EstoseconfiguróatravésdelestudioAtmelyheusadounpardeATtiny'sdiferentesyloschipsmantuvieronestosajustesunavezestablecidos,asíqueestoybastantesegurodequelosfusiblesseestánescribiendocorrectamente
Ahoraelcódigo:(Esteeselprogramacompleto,lapartedeltemporizadorfunciona(obviamentenounavezqueelrelojcambia))
#defineF_CPU8000000#include<avr/io.h>#include<avr/interrupt.h>voidinitClock(){//SettingCLKPSRdoesnotaffecttheproblem(Itdoesn'tworkregardlessofwhatthisissetto)//IhavetriedthisbeforeandaftersettingCLKMSRCCP=0xD8;CLKPSR=0;CCP=0xD8;CLKMSR=0b10;}voidinitPorts(){DDRB|=(1<<PORTB0);//PB0=OCR0A}voidinitTimer(){//Ipostedthiscodejustincase,thisworksasexpected(butonlyontheinternaloscillator)//WewantCompareOutputMode,ClearOC0AonCompareMatchTCCR0A=(1<<COM0A0);//OverflowsettingTIMSK0|=(1<<OCIE0A);//Wewillnotuseaprescaler//ThisalsostartsthetimerTCCR0B=(1<<CS00)|(1<<WGM02);//ThisisthevalueatwhichthetimerwillrestartOCR0A=8299;//Setexternalinterruptssei();}intmain(void){initClock();initPorts();initTimer();while(1){}}
Seguramentetienequehaberalgoquemeestoyperdiendo.Heintentadoleeryreleerespecialmentelasseccionesderelojdelahojadedatosparapoderresolverloyomismo.Aunqueestoyperplejo.Quizásalguienpuedaayudarmeaentendermierror.
¡Gracias!Déjemesabersihaymásinformaciónquepuedaagregarparaqueseamásfácildeentender