Hallo liebe Community.
Nein, ich bin nicht ein weiterer Neuling der verzweifelt auf der Suche
nach Hilfe ist, viel mehr wollte ich mit diesem Thread der Gemeinschaft
ein großes Dankeschön aussprechen, da ich wohl behaupten kann, alles was
ich nun über C-Programmieren und über Microcontroller weiß,
Mikrocontroller.net zu verdanken habe. Für die Profis hier, ist das
sicherlich ein recht simples Programm, aber ich möchte es dennoch
präsentieren. :)
Ein "winkender" Servo mittels einfachen 8bit-Timer auf einem ATMega8.
Ich würde mich sehr über Kritik und vor allem Verbesserungen freuen.
Mein nächstes Ziel wird es wohl sein zu versuchen eine eigene
Servosteuerung über UART zu realisieren.
Eine Frage hab ich allerdings noch. Habe ich das volatile hier richtig
benutzt, weil ich die Variablen in geteilten Prozessen benutze und ich
die Werte aus dem Interrupt mit in die Main Funktion nehmen möchte? Oder
hätte das gar nicht sein müssen und wenn, warum? :D
1 | #include <avr/interrupt.h>
|
2 | #include <avr/io.h>
|
3 |
|
4 | //F_CPU = 3.686.400
|
5 | //Prescaler = 256
|
6 | //3.686.400/256 = 14.400Zähler/s
|
7 | //1s = 1000ms
|
8 | //14.400Zähler - 1000ms
|
9 | //1Zähler - 69.5µs
|
10 | //255Zähler = 17708.3µs
|
11 | //
|
12 | //Ein Overflow = 17,7ms
|
13 | //Auflösung in TCNT0 für Stuersignal = 225-240
|
14 | // (2ms-1ms)
|
15 |
|
16 | volatile unsigned char servo_pos,aussetzer;
|
17 |
|
18 | int main(void)
|
19 | {
|
20 | sei();
|
21 |
|
22 | servo_pos=225;
|
23 | aussetzer=0;
|
24 |
|
25 | TIMSK = (1<<TOIE0);
|
26 | TCCR0 = (1<<CS02);
|
27 |
|
28 | DDRB = (1<<DDB1);
|
29 |
|
30 | while(1)
|
31 | {
|
32 | if(aussetzer==2)
|
33 | {
|
34 | servo_pos = servo_pos + 1;
|
35 | aussetzer = 0;
|
36 | }
|
37 | if(servo_pos==240)
|
38 | {
|
39 | while(1)
|
40 | {
|
41 | if(aussetzer==2)
|
42 | {
|
43 | servo_pos = servo_pos - 1;
|
44 | aussetzer = 0;
|
45 | }
|
46 | if(servo_pos==225)
|
47 | {
|
48 | break;
|
49 | }
|
50 | }
|
51 | }
|
52 | }
|
53 | }
|
54 |
|
55 | ISR(TIMER0_OVF_vect)
|
56 | {
|
57 | PORTB = (0<<PINB1);
|
58 | if(aussetzer==1)
|
59 | {
|
60 | PORTB = (1<<PINB1); //
|
61 | TCNT0 = servo_pos; //Pin1 auf High gesetzt und der Timer auf die
|
62 | //jeweilige Zeit die er noch hochzählen soll.
|
63 | } //Nach der Zeit 1-2ms wird Pin0 im nächsten Interrupt wieder Low gesetzt.
|
64 | aussetzer = aussetzer + 1;
|
65 | }
|