Gast
#4455274
Hallo allerseits, Ich habe ein Problem und hoffe, ihr könnt mir helfen. Und zwar folgendes: Ich habe einen Mikrocontroller (ATmega328p-pu (der gleiche wie im Arduino Uno)), und habe vor in naher Zukunft einen Motor mittels 8-Bit Timer0 anzusteuern. Für Motoren gestaltet sich Phasenrichtige PWM als nützlich, also hab ich´s damit versucht. Hier einmal mein C-Code
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
28 | |
29 | |
30 | |
31 | |
32 | |
33 | |
34 | |
35 | |
36 | |
37 | |
38 | |
39 | |
40 | |
41 | |
Was mich wundert ist, dass das ganze überhaupt funktioniert. Die Interrupt-Subroutine hat ja den Vektor "TIMER0_OVF_vect", d.h. es ist ein overflow-vector, d.h. die Subroutine wird jedesmal aufgerufen, wenn ein Timeroverflow stattfindet, was laut Datenblatt immer dann geschieht, wenn BOTTOM, also der Zählerstatus von 0 erreicht wird. D.h. Der Timer Zählt: 0(BOTTOM) rauf-> 255(TOP) runter-> 0(BOTTOM) Aber weil ich meinen Mikrocontroller mit dem Oszilloskop am PIND6 ausgemessen habe, bin ich draufgekommen, dass die Interrupt-Subroutine wohl nicht nur im Falle des erreichens von BOTTOM aufgerufen wird(was einen Duty-Cycle von 50% zur Folge hätte), sondern dass ich den Duty-Cycle sehrwohl durch beschreiben (wie im obigen Codesnippet) des OCR0A - Registers steuern kann. Also warum wird die Interrupt-Subroutine doch immer durchlaufen, wenn der Counter bei 63 angekommen ist, und nicht wenn ein einfacher Overflow (BOTTOM) stattfindet ?? Anm.: im Datenblatt steht folgendes: "The Timer/Counter Overflow Flag (TOV0) is set each time the counter reaches BOTTOM. The Interrupt Flag can be used to generate an interrupt each time the counter reaches the BOTTOM value." Ich hoffe, ihr könnt mir helfen, Danke schon mal im Voraus, LG Felix
