Erste Schritte mit dem Infineon XMC 2Go

Angefangen hatte Alles mit einer Aktion von Infineon auf Mikrocontroller.net über 100 XMC 2Go Starterkits. Ich bewarb mich mit meiner Idee einer großen farbigen LED Uhr. Die Uhr hatte ich bereits seit ca. einem Jahr gebaut und der XMC1100 sollte nun die Steuerung übernehmen. Diese Idee kam an und ich erhielt ein Kit per Post.

Gleich nach dem anstecken an ein micro USB Kabel meldete sich die Demo Anwendung wit einem abwechselnden Blinken der LEDs auf dem Board.

XMC 2Go Start LED unten XMC 2Go Start LED oben

Die Installation der Infineon IDE DAVE lief nach einer kurzen Registrierung genauso wie der Import der Demo Anwendung ( XMC_2Go_Initial_Start.zip ) problemlos.

Da ich leider kein DAVE CE Tutorial passend für den XMC1000 gefunden habe, sondern nur für die XMC4000-Serie, habe ich mich entschlossen erste Programmierversuche direkt in C zu unternehmen.

Dazu wollte ich zuerst versuchen die RTC in Betrieb zu nehmen, wozu ich die RTC Application Note zu Rate genommen habe:

int RTC_init()
{
// Time in Format "??:??:??"
char time[] = __TIME__;
int stunden = atoi(time);
int minuten = atoi(&(time[3]));
int sekunden = atoi(&(time[6]));

// Disable clock gating to RTC
SCU_GENERAL->PASSWD = 0x000000C0UL; // disable bit protection
SCU_CLK->CGATCLR0 |= SCU_CLK_CGATCLR0_RTC_Msk;
SCU_GENERAL->PASSWD = 0x000000C3UL; // enable bit protection

// Disable RTC
while (SCU_GENERAL->MIRRSTS & SCU_GENERAL_MIRRSTS_RTC_CTR_Msk);
RTC->CTR &= ~RTC_CTR_ENB_Msk;

// Enable clock to RTC
// Nothing to do

// Configure current time and date
while ((SCU_GENERAL->MIRRSTS & (SCU_GENERAL_MIRRSTS_RTC_TIM0_Msk
| SCU_GENERAL_MIRRSTS_RTC_TIM1_Msk )) != 0x0U);
RTC->TIM0 = ((uint32_t)sekunden << RTC_TIM0_SE_Pos)
| ((uint32_t)minuten << RTC_TIM0_MI_Pos)
| ((uint32_t)stunden << RTC_TIM0_HO_Pos)
| (((uint32_t)0U) << RTC_TIM0_DA_Pos);
RTC->TIM1 = 0;

// Enable the RTC module
while (SCU_GENERAL->MIRRSTS & SCU_GENERAL_MIRRSTS_RTC_CTR_Msk);
RTC->CTR |= RTC_CTR_ENB_Msk;

return 0;
}

Die einzustellende Uhrzeit habe ich mir zum Testen aus der kompilierzeit der Software generieren lassen:

// Time in Format "??:??:??"
char time[] = __TIME__;
int stunden = atoi(time);
int minuten = atoi(&(time[3]));
int sekunden = atoi(&(time[6]));

Zuerst muss der Takt für das RTC-Modul aktiviert werden. Wichtig ist dabei, dass das „Clock Gating“, also das Sperren des Takts deaktiviert, somit also zurückgesetzt werden muss. Außerdem muss der Schrteibschutz dazu deaktiviert werden.

// Disable clock gating to RTC
SCU_GENERAL->PASSWD = 0x000000C0UL; // disable bit protection
SCU_CLK->CGATCLR0 |= SCU_CLK_CGATCLR0_RTC_Msk;
SCU_GENERAL->PASSWD = 0x000000C3UL; // enable bit protection

Danach sollte, um unvorhergesehne Ereignissen bei Überläufen zuvorzukommen die Uhr gestoppt werden.

// Disable RTC
while (SCU_GENERAL->MIRRSTS & SCU_GENERAL_MIRRSTS_RTC_CTR_Msk);
RTC->CTR &= ~RTC_CTR_ENB_Msk;

Erst danach wird die Uhrzeit und das Datum eingestellt, wobei ich hier nur die Zeit eingestellt habe.

// Configure current time and date
while ((SCU_GENERAL->MIRRSTS & (SCU_GENERAL_MIRRSTS_RTC_TIM0_Msk
| SCU_GENERAL_MIRRSTS_RTC_TIM1_Msk )) != 0x0U);
RTC->TIM0 = ((uint32_t)sekunden << RTC_TIM0_SE_Pos)
| ((uint32_t)minuten << RTC_TIM0_MI_Pos)
| ((uint32_t)stunden << RTC_TIM0_HO_Pos)
| (((uint32_t)0U) << RTC_TIM0_DA_Pos);
RTC->TIM1 = 0;

Danach kann die Uhr wieder aktiviert werden.

// Enable the RTC module
while (SCU_GENERAL->MIRRSTS & SCU_GENERAL_MIRRSTS_RTC_CTR_Msk);
RTC->CTR |= RTC_CTR_ENB_Msk;

Aufgrund des internen Aufbaus der Register als Schieberegister ist es außerdem nötig vor einem Schreibbefehl immer das entsprechende Busy-Bit zu überprüfen.

XMC1100 SCU_CCUGestern hatte ich nach einigen Stunden eine Zeitdifferenz von mehreren Minuten festgestellt, was vermutlich von dem ungenauen RC Schwingkreis herkommt. Für eine Uhr wäre das natürlich nicht ausreichend. In der Application Note ist die Rede von dem ACMP-Modul (Analoger Komparator) welcher mit einem Quarz als Taktquelle dienen kann, jedoch ist dieses Modul beim XMC1100 nicht vorhanden und laut dem Reference Manual steht nur der RC-Takt als Quelle zur Verfügung.

Also handelt es sich mit dieser Abweichung wohl doch nicht wirklich um eine Real Time Clock bzw. Echtzeituhr.

 

Anbei noch mein Erweiterter Code als DAVE Projekt:

xmc2go_mit_rtc_init

1 Kommentar

  1. Bernd April 14, 2014 4:35 pm  Antworten

    Hallo,

    dass hast du sehr gut dokumentiert.
    Ich bin zu dem gleichen Ergebnis gekommen, leider.

    Gruß,
    Bernd

Schreibe einen Kommentar