Forum: Compiler & IDEs Mein erstes eigenes Programm


von Michael F. (mic-xep)


Lesenswert?

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
}

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Michael F. schrieb:
> Habe ich das volatile hier richtig benutzt?

Ja, das ist korrekt, da sonst der Optimierer des Compilers Zugriffe auf 
sich vermeintlich nicht ändernde Variablen entfernen könnte.

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.