Forum: Mikrocontroller und Digitale Elektronik Compare auf einen kaskadierten 32bit Counter bei AtXmega


von Samuel (Gast)


Lesenswert?

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!

von Peter II (Gast)


Lesenswert?

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) {
  }

von Samuel (Gast)


Lesenswert?

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

von Michael K. (Gast)


Lesenswert?

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 ...

von Zedd (Gast)


Lesenswert?

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

von 32 bit adressraum (Gast)


Lesenswert?

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?

von Zedd (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.