Kalibration

XMega Blockdiagramm

Der XMega besitzt eine ganze Reihe Register welche Kalibrationswerte für die DACs, ADCs und die Oszillatoren beinhalten. Diese Werte werden bei der Produktion ermittelt und in den Chip einprogrammiert, sodass diese nur ausgelesen und in die dementsprechenden Kalibrationsregister geschrieben werden müssen.
Das Auslesen der Register geschieht mit Hilfe des NVM (Non-Volatile-Memory) Controller. Dieser Controller ist im Chip integriert und er steuert alle Zugriffe auf den Flash (Programmierung mittels PDI, JTAG, auslesen und schreiben der Signaturen, usw.).
Von daher muss der Zugriff auf die Kalibrationssignaturen auch über diesen Controller laufen.
Das Auslesen der Signaturen erfolgt mit dieser Funktion:

Und aufgerufen wird die Funktion (hier im Beispiel für den Offset vom DACB) so:

Was geschieht da jetzt?
Als erstes wird eine Funktion erzeugt die LeseKalibrationsbyte heißt. Das int vor dem Funktionsnamen bedeutet, dass die Funktion einen Wert vom Typ Integer zurück gibt und das int Index bedeutet, dass die Funktion einen Wert vom Typ Integer beim Funktionsaufruf erwartet und dieser wird dann in einer lokalen Variable namens Index gespeichert.
In der nächsten Teile wird eine lokale Variable vom Typ Integer mit dem Namen result erzeugt. Anschließend wird mit

dem NVM-Controller gesagt, dass der nächste Lesezugriff nicht auf den Flashspeicher zugreift sondern auf den extra Bereich mit den Kalibrationsbytes. Als nächstes wird mit pgm_read_byte(Index) ein Byte, welches durch den Wert von Index bestimmt wird, aus dem Flash gelesen und unter result gespeichert. Der nächste Befehl ist, einfach gesagt, ein NOP-Befehl für den NVM-Controller. Mit return(result) wird der Inhalt der Variable result zurück gegeben. Mit den beiden Zeilen:

werden Funktionen zum auslesen des Flashspeichers und die Funktion offsetto bereitgestellt.
Die Funktion LeseKalibrationsByte wird nun so aufgerufen:

Hierbei geschieht folgendes:
Der Rückgabewert (die Variable die in der Funktion result heißt) wird im Register DACB.OFFSETCAL gespeichert. Anschließend wird die Funktion aufgerufen. Wir erinnern uns das als Wert ein Integer mit in die Funktion übergeben werden soll. Dieser Integer wird wie folgt gebildet. Mit der Funktion offsetof wird der Abstand von der Startposition des anschließend genannten Structs bis hin zu einem Element welches als zweiter Parameter angegeben ist gezählt. Das heißt in dem Beispiel gibt offsetof eine 50 bzw. 0x32 wieder, weil der Abstand vom Anfang des Structs NVM_PROD_SIGNATURES_t bis zu dem Element DACBOFFCAL 50 beträgt. Wie das Struct aufgebaut ist sieht man in der iox128a1.h vom AVR-Studio. Diese 50 ist der Wert der in die Funktion übergeben wird und dann in der Funktion Index heißt.
Innerhalb der Funktion wird dann mit dem Befehl

der Inhalt der Speicherstelle 50 vom Signaturbereich ausgelesen.
Wenn der Wert dann mit der Tabelle vergleichen wird, erkannt man das dieser Wert haargenau der Speicherstelle des Kalibrationswertes entspricht und dieser Wert wird dann unter result gespeichert.
Dieser Wert wird dann aus der Funktion zurück gegeben und im DACB.OFFSETCAL-Register gespeichert.
Auf diese Weise kann jeder Controller, unabhängig vom Inhalt der Kalibrationsregister, automatisch kalibriert werden. Diese Funktion kann dann auch verwendet werden um den ADC bzw. die Oszillatoren zu kalibrieren.
Hierfür muss nur statt DACBOFFCAL der dem entsprechende Name des Kalibrationsregisters eingetragen werden (z.B. ADCBCAL0 für das CAL-Register vom ADCB). Außerdem muss das Zielregister geändert werden, sprich statt DACB.OFFSETCAL muss da z.B. ADCB.CALL stehen.

 

-> Zurück zum XMega Tutorial

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Time limit is exhausted. Please reload CAPTCHA.