Forum: Mikrocontroller und Digitale Elektronik Timer Falsch? servo reagiert nicht


von Sonke A. (soeni)


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
}

von Peter B. (pbuenger)


Lesenswert?

Was mir aufgefallen ist: mit int8_t kannst Du nicht bis 200 zählen.

Gruß,
Peter

von Sonke A. (soeni)


Lesenswert?

das geht doch bis 255 oder??

von Robin T. (rotoe) Benutzerseite


Lesenswert?

Sönke Paschko wrote:
> das geht doch bis 255 oder??

Richtig

von Magnus Müller (Gast)


Lesenswert?

uint8_t geht bis 255
^
|

von Robin T. (rotoe) Benutzerseite


Lesenswert?

Ja und? uint heißt nur das er auch ins negative gehen kann.
Wenn nicht bitte ich um Entschuldigung aber so hab ichs bisher immer 
gedacht.

von Magnus Müller (Gast)


Lesenswert?

Robin Tönniges wrote:
> Ja und? uint heißt nur das er auch ins negative gehen kann.

Leider falsch.

int  == integer

uint == unsigned integer (ohne Vorzeichen / nur positiv)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.