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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.