Mein erstes eigenes Programm

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

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

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.