Hallo!
Ich suche nach einem Tipp wie ich bei einem durchlaufenden 16-bit Timer
eine "Compare Match" Einheit in Software nachbilden kann. Damit soll
eine variable Frequenz generiert werden. Der Timer darf nicht verändert
werden.
Wäre eine (Hardware-) Compare Match Einheit frei würde man immer im
OC-Interrupt die nächste Periode auf den alten OCR-Wert aufaddieren und
ins OCR schreiben.
In Software kann man nicht davon ausgehen genau zu "treffen" (Counter ==
Compare Value), sondern muss (Counter >= Compare Value) prüfen. Das
funktioniert solange gut bis der Counter rumläuft und wieder bei 0
startet. Um das zu merken muss ich den Overflow auswerten.
Pseudocode:
1 | CNT = 13543
|
2 | OC = 32000
|
3 |
|
4 | if ((CNT >= OC) || (OVF)) // erste Bedingung wahr
|
5 | {
|
6 | [CNT == 34674]
|
7 | OC = OC + 32000 = 64000
|
8 | OVF = false
|
9 | ...
|
10 | }
|
11 |
|
12 | if ((CNT >= OC) || (OVF)) // zweite Bedingung wahr
|
13 | {
|
14 | [CNT == 367]
|
15 | OC = OC + 32000 = 64000
|
16 | OVF = false
|
17 | ...
|
18 | }
|
Problemfall:
1 | CNT = 61543
|
2 | OC = OC + x = 32000
|
3 |
|
4 | sofort:
|
5 |
|
6 | if ((CNT >= OC) || (OVF)) // erste Bedingung wahr -> FALSCH
|
7 |
|
8 | nach Überlauf:
|
9 |
|
10 | if ((CNT >= OC) || (OVF)) // zweite Bedingung wahr -> FALSCH
|
Hat jemand eine Idee das ganze EFFIZIENT zu implementieren. Das ist doch
bestimmt mit nem guten Trick einfach möglich...
Grüße
Robert