Sorry, dass ich wieder mal störe aber ich habe ein problem, ich habe
entlich verstanden wie timer grundsätzlich funktionieren. ich habe eine
led zum blinken gebracht, soweit sogut, dann wollte ich den timer so
umfunktinieren, dass alle 0,1 ms ein interrupt ausgelößt wird, also bei
8 mhz alle 800 takte. ich teile also mit dem prescaler den takt durch 8
und zähle im timer bis hundert.
in der interruptrutine warte ich 200 interrupts ab (20ms) um dann 1ms zu
warten. (muss ja mindestens gewartet werden) anschließend warte ich noch
x zyklen ab, wobei x der servostellung entspricht. hier mein code, der
servo schlägt ganz nach rechts aus, obwol er doch eigentlich in der
Mittelstellung sein müsste oder?
hier das Beispiel
1 | #include <stdint.h>
|
2 | #include <avr/io.h>
|
3 | #include <avr/interrupt.h>
|
4 |
|
5 |
|
6 | int8_t waiting, servo, tmp, servotmp;
|
7 |
|
8 |
|
9 | //Interrupt Service Routine
|
10 | ISR(TIMER0_COMP_vect) // Sollte alle 0,1 ms per interrupt besucht werden
|
11 | {
|
12 |
|
13 | servo = 5; // Servoposition zwischen 0 und 10
|
14 |
|
15 | waiting++;
|
16 |
|
17 | if(waiting == 200){
|
18 |
|
19 | PORTB |= (1 << 0); /* setzt Bit 0 an PortB auf 1 */
|
20 |
|
21 | if(tmp <= 9){ // auf jeden Fall 1 ms warten
|
22 | tmp++; // tmp für 1 ms warten
|
23 | waiting=199; // für rücksprung in schleife
|
24 | servotmp=0;
|
25 | }else{
|
26 | // jezt spezifische einstellung
|
27 |
|
28 | if(servotmp == servo){ // rücksprung
|
29 | PORTB &= ~(1 << 0); /* loescht Bit 0 an PortB */
|
30 | waiting=0;
|
31 | tmp=0;
|
32 | }else{
|
33 | servotmp++; // Korigieren und nächsten zyklus abwarten
|
34 | waiting=199;
|
35 | }
|
36 |
|
37 | }
|
38 | }
|
39 |
|
40 | }
|
41 |
|
42 | //Hauptprogramm
|
43 |
|
44 | int main(void) {
|
45 |
|
46 | //Pin Konfiguration
|
47 | DDRB = 0xFF; //PORT B als Ausgang
|
48 |
|
49 | //Timer 0 initialisieren
|
50 | TCNT0 = 0x00; //Timer 0 mit Null initialisieren
|
51 | OCR0 = 0x64; //Vergleichsregister initialisieren (bis 100 zählen)
|
52 | TIMSK = (1<<OCIE0); //Output Compare interrupt enable
|
53 | sei(); //Enable Global Interrupt
|
54 |
|
55 | //Timer Start für Taktfrequenz / 8
|
56 | TCCR0 = ((1<<WGM01) | (1<<COM00) | (1<<CS01) | (0<<CS00));
|
57 | // CTC Mode | Toggle OC0 | Prescaler clk/8
|
58 |
|
59 | while(1==1){
|
60 |
|
61 |
|
62 |
|
63 |
|
64 | };
|
65 |
|
66 | return 0;
|
67 | }
|