Forum: Mikrocontroller und Digitale Elektronik Atmega 8 Servoansteuerung Problem in C


von Daniel G. (gulkemulke)


Lesenswert?

Hallo zusammen,

ich bräuchte mal eure Hilfe. Wir haben ein Schulprojekt Windkraftanlage 
bekommen. Wir sind schon mitten im Projekt, aber stoßen hier auf 
folgendes Problem: Die Trumdrehung wird von einem Windenservo 
realisiert. Wenn die Windkraftanlage eingeschaltet wird soll sie solange 
drehen bis Initialisierungsimpuls (LS0) bekommt. Momentan ist es aber 
so, dass sie einfach immer weiter läuft obwohl die IF Bedingung nicht 
erfüllt ist. Hab ich hier einen Fehler bei dem Parametrieren von dem 
Timer gemacht? PB1 ist die Signalleitung zum Servo.

#include <avr/io.h>
#define F_CPU 3686400UL
#define LS0 2
#define LS1 3
#define LED1 4

int main(void)
{
DDRD = 0b00010000;
PORTD = 0b00000100;

DDRB=0x00;

while (1)
{

  if(!(PIND & (1<<LS0)))
  {
  PORTD |= (1<<LED1);      // Anzeige wenn Verzweigung


    DDRB = 0x02;                          // Setup PB1 as output


     ICR1 = 40000;                         // Set TOP to 40000 
Frequency=
                                           // 4MHZ  40000  2 = 100Hz
                                           // Phas e correct mode 
Periode
                                           //is
                                           // 2 * Timer Periode
     OCR1A = 4000;                         // Set Dutycycle
                                           // 2000 => Pulse= 1ms +90 deg
                                           // 3000 => Pulse= 1.5ms 0 deg
                                           // 4000 => Pulse= 2ms -90 deg

     TCCR1A = (1<<WGM11)|(1<<COM1A1);     // Set Timer1 in Phase Correct
                                          //Mode
                                          // with ICR1 as TOP value. Set
                                          //OC1A
     TCCR1B = (1<<WGM13)|(1<<CS10);       // on compare match and clear
                                           //OC1A
                                          // on BOTTOM. Clock Prescaler 
is
                                          // 1




    // for(;;);                             // Endless loop
                                          // main() will never be left
                                          // Write Values to OCR1A ot 
turn
                                          // The Servo


    // return 0;                            // This line will never be
                                           //executed

  }
  else
  {
  PORTD &= ~(1<<LED1);
  }//endif
}//while(1)
}// main

von Holger L. (max5v)


Lesenswert?

Sobald der Timer einmal eingestellt wurde läuft der, dann ist es egal ob 
ein anderer Block aufgerufen wird in dem eine Led geschaltet wird.
Das heißt der Timer muß nur einmal eingestellt und anschließend gestoppt 
werden.

In F_CPU sind 3686400UL eingetragen und für die Berechnung werden 
anscheinend 4MHz genutzt, was bei einem Timing für Servos nicht 
besonders gut ist.

Den Teil mit der Zuweisung an DDRB und PORTD kann man übersichtlicher 
schreiben, besonders wenn bereits Defines angelegt sind.

DDRB |= ( ( 1 << LS0) | ( 1 << LS1) );  // LS0 und LS1 gesetzt

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.