www.mikrocontroller.net

Forum: Compiler & IDEs Mein erstes eigenes Programm


Autor: Michael F. (mic-xep)
Datum:

Bewertung
0 lesenswert
nicht 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
#include <avr/interrupt.h>
#include <avr/io.h>

 //F_CPU = 3.686.400
 //Prescaler = 256
 //3.686.400/256 = 14.400Zähler/s
 //1s = 1000ms
 //14.400Zähler - 1000ms
 //1Zähler - 69.5µs
 //255Zähler = 17708.3µs
 //
 //Ein Overflow = 17,7ms
 //Auflösung in TCNT0 für Stuersignal = 225-240
 //                                    (2ms-1ms)

volatile unsigned char servo_pos,aussetzer;

int main(void)
{
  sei();

  servo_pos=225;
  aussetzer=0;

  TIMSK = (1<<TOIE0);
  TCCR0 = (1<<CS02);

  DDRB = (1<<DDB1);
  
  while(1)
    {
      if(aussetzer==2)
        {
        servo_pos = servo_pos + 1;
        aussetzer = 0;
        }
      if(servo_pos==240)
        {
          while(1)
            {
              if(aussetzer==2)
                {
                servo_pos =  servo_pos - 1;
                aussetzer = 0;
                }
              if(servo_pos==225)
                {
                break;
                }
            }
        }
    }
}

ISR(TIMER0_OVF_vect)
{
  PORTB = (0<<PINB1);
  if(aussetzer==1)
  {
    PORTB = (1<<PINB1);    //
    TCNT0 = servo_pos;     //Pin1 auf High gesetzt und der Timer auf die     
                           //jeweilige Zeit die er noch hochzählen soll. 
  }                        //Nach der Zeit 1-2ms wird Pin0 im nächsten Interrupt wieder Low gesetzt.
  aussetzer = aussetzer + 1;
}  

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.