ATtiny External Clock funktioniert nicht

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.

Schema

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 Uhreinstellungen

Seite 22 des Datenblattes zum Prescaler (Clock-Prescaler nicht Timer-Prescaler) Clock 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

Attiny10 Datenblatt

Versuchen Sie, CLKM0 eine 0 zu schreiben, wenn es eine 1 ist, erhalten Sie die 'reservierte' Kombination und wer weiß, was passieren kann.
@VladimirCravero Ich habe dieses Bit auf 0 gesetzt und es startet die externe Uhr nicht
Dieses Bit ist beim Zurücksetzen sowieso Null, aber ich kann nicht sehen, wo Sie es in Ihrem Code auf Null setzen.
@VladimirCravero Entschuldigung, ich meinte, ich habe das geändert, nachdem Sie gefragt haben. Ich werde bearbeiten, um die Änderung widerzuspiegeln. Entschuldigen Sie das Missverständnis

Antworten (1)

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.

Geben Sie hier die Bildbeschreibung ein

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.

Ich dachte sogar, dass der Compiler den zweiten Schreibvorgang in CCP optimierte und damit die Grenze von vier Taktzyklen durchbrach ... Schön.
Ah! Das macht Sinn. Ich schaue mir den Atmega328 an und sehe, dass er XTAL-Pins hat, während dieser CLKI- und CLK0-Pins hat. Bedeutet diese Benennung auf AVR-Chips, dass die internen Schaltkreise nicht vorhanden sind?
@Dan Wenn ein Gerät den Betrieb mit einem zweipoligen Kristall unterstützt, hat es einen XTAL1- und einen XTAL2-Pin. Sie können sich einfach den Abschnitt Taktquellen im Datenblatt des Geräts ansehen, an dem Sie interessiert sind. Ein externer Takt bedeutet eine externe Taktimpulsquelle, ein externer Quarz bedeutet den zweibeinigen Quarz, den Sie verwenden möchten.
Richtig ... Der CLKI wird für den externen Takteingang verwendet, und CLK0 (Systemtakt) kann als Taktgeber für ein anderes Gerät verwendet werden.
"Bedeutet diese Benennung auf AVR-Chips, dass sie nicht über die internen Schaltkreise verfügen?" Wenn ein AVR einen Kristall direkt ansteuern kann, wird dies irgendwo im Datenblatt angegeben, z. B. auf S. 29 des ATmega328P-Datenblatts . Der Abschnitt "Clock Sources" des ATtiny10-Datenblatts erwähnt niemals das Wort "Crystal" oder zeigt irgendwelche Abbildungen, die die zwei Pins eines Crystal zeigen, der direkt mit dem AVR verbunden ist. Das bedeutet, dass ein zweipoliger Kristall allein nicht ausreicht – der ATtiny10 erfordert eine der im Datenblatt beschriebenen Optionen.