Atmega 8 Servoansteuerung Problem in C

OP #4538952
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
#4539010
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren