Timer Falsch? servo reagiert nicht

#847705
Lesenswert?

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
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren