PLL im ATTiny45 kalibrieren: Unterschied zwischen den Versionen

Aus Hobbyelektronik.org
Wechseln zu: Navigation, Suche
(erste Version)
K (Kategorie hinzugefügt)
Zeile 67: Zeile 67:
  
 
Sobald ich wieder einen Tiny45 zum Basteln über habe, werde ich evtl. ein USB-Device bauen, das man direkt kalibrieren kann und der Wert direkt vom PC ausgelesen werden kann.
 
Sobald ich wieder einen Tiny45 zum Basteln über habe, werde ich evtl. ein USB-Device bauen, das man direkt kalibrieren kann und der Wert direkt vom PC ausgelesen werden kann.
 +
 +
[[Category:AVR]]
 +
[[Category:USB]]

Version vom 13. Oktober 2007, 23:38 Uhr

Der ATTiny 45 besitzt neben dem Tiny 26 eine interne PLL, die es erlaubt, den Takt vom AVR während dem Betrieb zu verändern. Standardmäßig ist diese auf 16MHz eingestellt, allerdings kann man deren Takt durch Verändern des OSCCAL-Registers verändern.

Warum?

Bei manchen Anwendungen ist ein Takt abseits von 16MHz erforderlich, wie zum Beispiel bei AVR-USB. Hier muss die Frequenz 16.5MHz betragen, da das Device vom PC sonst nicht erkannt wird.

AVR-USB

Im Beispiel EasyLogger wird die abweichende Frequenz in main() berechnet, falls kein abweichender Wert im EEProm steht.

Allerdings funktioniert die Errechnung nicht immer zuverlässig. Dann muss man den Wert manuell ermitteln.

Wert ermitteln

Man kann den OSCCAL-Wert natürlich per trial & error ermitteln, allerdings muss man (theoretisch) alle 256 Werte "durchprobieren". Wenn man vom festgelegten Registerwert ausgeht (lässt sich z. B. mit AVR Studio auslesen) kann man die Suche auf etwa 10-15 Werte beschränken. Allerdings ist das immernoch relativ Zeitaufwendig.

Um die Sache zu erleichtern, bietet der ATTiny45 (wie eigentlich alle AVRs) die Funktion, den Takt auf einem Pin (PB4[?]) auszugeben. Dazu muss einfach die Fuse CKOUT aktiviert werden.

Nun kann mit einem sehr simplen Programm und einem Frequenzzähler der CPU-Takt ermittelt werden:

int main() {
    OSCCAL = 100;
    while(1);
}

Das Programm kann dann geflasht und der Takt an PB4 gemessen werden. Falls der Frequenzzähler (wie meiner) keine 16-20MHz mitmacht, kann die Fuse CKDIV8 (Takt durch 8 teilen) aktiviert werden.

optional kann der Code auch dahingehend angepasst werden, dass er nicht mehrmals geflasht werden muss:

int main() {
    DDRB &= ~(PB3)

    if(PINB | PB3) {
        OSCCAL = 150
    } else {
        OSCCAL = 100;
    }
    while(1);
}

Wenn nun beim Anlegen der Spannung PB3 an Vcc anliegt, wird OSCCAL auf 150, andernfalls auf 100 gesetzt.

Die Formel zum Berechnen des OSCCAL-Wertes lautet folgendermaßen:

OSCziel = (fmax-fmin)/(OSCmax-OSCmin)*(fziel-OSCmin)+fmin

Angenommen, bei OSCCAL 100 werden 15.5MHz gemessen und bei OSCCAL 150 eine Frequenz von 17.86MHz und die Zielfrequenz 16.5MHz beträgt, ergibt sich folgendes:

OSCziel = (17.86-15.5)/(150-100)*(16.5-100)+15.5

OSCziel = 11.56

Der Wert für OSCCAL ist dann 12. Dieser Wert kann entweder an die erste Stelle im EEProm oder direkt ins Programm geschrieben werden.

Aber Vorsicht!

Beim Portieren von Schaltungen vom Steckbrett auf Lochraster/Platine kann es sein, dass man den AVR neu kalibrieren muss! Das führte beim SNES-Joypad ein bisschen zu Verwirrung, da die Schaltung auf dem Steckbrett aber auf der Platine nicht mehr vom PC erkannt wurde.

Sobald ich wieder einen Tiny45 zum Basteln über habe, werde ich evtl. ein USB-Device bauen, das man direkt kalibrieren kann und der Wert direkt vom PC ausgelesen werden kann.