Timer Falsch? servo reagiert nicht

OP #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

Eine eigene Frage? Dieser Thread ist über 18 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.