Hallo zusammen Ich habe beim AtXmega zwei einzelne 16bit Counter zu einem 32Bit kaskadiert. Nun möchte ich einen Compare auf einen bestimmten 32Bit wert machen. Hat jemand eine Idee, wie dies am elegantesten geht? Danke!
Samuel schrieb: > Hallo zusammen > > Ich habe beim AtXmega zwei einzelne 16bit Counter zu einem 32Bit > kaskadiert. > > Nun möchte ich einen Compare auf einen bestimmten 32Bit wert machen. > > > Hat jemand eine Idee, wie dies am elegantesten geht? > > Danke! uint32_t a; uint32_t b; if ( a == b) { }
Peter II schrieb: > Samuel schrieb: >> Hallo zusammen >> >> Ich habe beim AtXmega zwei einzelne 16bit Counter zu einem 32Bit >> kaskadiert. >> >> Nun möchte ich einen Compare auf einen bestimmten 32Bit wert machen. >> >> >> Hat jemand eine Idee, wie dies am elegantesten geht? >> >> Danke! > > uint32_t a; > uint32_t b; > > if ( a == b) { > } Ich meinte einen Compare Interrupt! Also es soll einen Interrupt bei einem bestimmten Wert der beiden Register auslösen
Na, wie breit sind den die compare Register ? Das wird nur über Umwege gehen. Z.B. in jeder IRQ des 'unteren' compares prüfen ob der 'obere' schon gekommen ist. Oder beide Compare Out extern per 'und' Gatter verknüpfen. Oder der 'obere' Compare IRQ schaltet den 'unteren' Compare IRQ frei. Oder, oder, oder ...
Effektiv scheint mir nur den langsameren Zähler, ein Compare Interrupts zu verpassen, der bloß den schnelleren Timer-Compare-Interrupt aktiviert. Dieser Compare deaktiviert sich anschließend wieder selbst. Funktioniert aber nur, wenn der ISR Aufruf genug Zeit hat, sonst läuft der schnellere Zähler drüber und das einschalten kommt zu spät. Leider gibt es keine Funktion die einen wirklichen Vergleich auswertet. Es ist immer nur ein Compare Match. Als CNT == CCX kann nur Aktionen auslösen :( Grüße Zedd
Zedd schrieb: > Effektiv scheint mir nur den langsameren Zähler, ein Compare Interrupts > zu verpassen, der bloß den schnelleren Timer-Compare-Interrupt > aktiviert. Dieser Compare deaktiviert sich anschließend wieder selbst. > > Funktioniert aber nur, wenn der ISR Aufruf genug Zeit hat, sonst läuft > der schnellere Zähler drüber und das einschalten kommt zu spät. > > Leider gibt es keine Funktion die einen wirklichen Vergleich auswertet. > Es ist immer nur ein Compare Match. Als CNT == CCX kann nur Aktionen > auslösen :( Ich habs neet verstanden, aber scheinbar geht ehhh nett. Warum nutzt du keinen zur Problemstellung passenden Controller?
Also 500.000 soll der compare sein Langsamer Zähler Compare bei 0x0007, aktiviert CC Interrupt des schnelleren Zählers bei 0xA120. Ist dieser gekommen, schaltet sich der Interrupt des schnelleren Zählers wieder ab... Würde man es nicht so machen, dann würde man 2^16 - 1 mal zu oft einen Interrupt bei einem 32 Bit Durchlauf aufrufen... wenn das net weiter wichtig ist, ist es ja auch okay...
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.