Ich wollte mich also schon seit einiger Zeit von der Arduino-Abstraktion lösen. Ich habe ein Board gemacht, das einen ATtiny10 mit einem Kristall und einem Ausgang hat. Ich kann für mein ganzes Leben nicht verstehen, was ich falsch mache.
Hier ist das Problem: Wenn ich die Taktquelle auswähle, funktioniert der AVR nicht mehr.
Ich hatte eine benutzerdefinierte Platine (kleine) gemacht, um alles darauf zu montieren. Ich dachte, ich hätte etwas nicht richtig gemacht (obwohl der Schaltplan richtig aussah)
Ich änderte das Design und machte ein anderes (für das zweite hatte ich Spuren mit einer Uhr, die von einer Grundplatte umgeben war (funktionierte immer noch nicht) [Außerdem verwendete das erste Design alles außer dem AVR, der von ebay bezogen wurde. Ich dachte, es wäre vielleicht ein Qualitätsproblem, die zweite Platine stammt vollständig von Mouser]
Um sicherzugehen, dass ich kein absoluter Idiot war, kaufte ich mir schließlich ein Breakout-Board und baute die Schaltung einfach auf. Dies funktionierte immer noch genauso wie alle anderen
Es funktioniert gut mit dem internen Oszillator, aber sobald ich programmiere, um die Taktquelle zu ändern, stoppt es.
Beachten Sie, dass ich R2 hinzugefügt habe, um den MOSFET heruntergezogen zu halten, aber ich fülle ihn nicht zum Programmieren, da TPI (Tiny Programming Interface) Pullups auf dieser Leitung verwendet und ich das nicht füllen kann, wenn ich den Chip programmieren werde
Seite 21 des Datenblattes zum Wechseln der Uhr
Seite 22 des Datenblattes zum Prescaler (Clock-Prescaler nicht Timer-Prescaler)
Ich verwende einen MkII-Programmierer von Atmel und dies sind die Sicherungsbits:
Externe Uhr ausgeben
0xFB
Dies wurde über Atmel Studio eingestellt und ich habe ein paar verschiedene ATtiny's verwendet und die Chips haben diese einmal eingestellten Einstellungen beibehalten, daher bin ich mir ziemlich sicher, dass die Sicherungen richtig schreiben
Jetzt der Code: (Das ist das ganze Programm, der Timer-Teil funktioniert (offensichtlich nicht, wenn die Uhr umschaltet))
#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)
{
}
}
Irgendetwas fehlt mir bestimmt. Ich habe versucht, die insbesondere die Uhrenabschnitte des Datenblatts zu lesen und erneut zu lesen, um es selbst herauszufinden. Ich bin allerdings ratlos. Vielleicht kann mir jemand helfen, meinen Fehler zu verstehen.
Danke schön! Bitte lassen Sie mich wissen, wenn ich weitere Informationen hinzufügen kann, um das Verständnis zu erleichtern
Die Verwendung des zweibeinigen Kristalls ist mit dem spezifischen Gerät nicht möglich. Es gibt nur die Möglichkeit, eine externe Taktquelle zu verwenden, Sie können also einen externen Oszillator wie den folgenden verwenden und die Taktimpulse an den CLKI-Pin (Pin 1) anlegen.
Anders als der zweibeinige Quarz, der zusätzliche Schaltkreise innerhalb der MCU und zwei Kondensatoren benötigt, ist dieser vierpolige Quarzoszillator ein vollständiger Oszillator, der nur Strom benötigt, um den Takt zu erzeugen.
Wladimir Cravero
Dan
Wladimir Cravero
Dan