#include #include #ifndef F_CPU #define F_CPU 4000000UL /* Quarz mit 4 Mhz */ #endif #include // Variable definieren uint16_t x ,y ,z; uint16_t Soll_h, Soll_z, Soll_e; uint16_t Soll_winkel; float Soll_zeit; float Timer_wert; float Korrektur_wert ; float korrektur; float Korrekturswert; int main(void) { // PORTB als Ausgang setzen DDRB = 0xff; //Timer initialisieren TCCR1B |= (0<>4 ; //Aus Hex-schalter lesen y = PINA & 0x0f; z = PINC & 0x0f; //Soll Winkel berechnen Soll_e = x; Soll_z = y*10; Soll_h = z*100; Soll_winkel = Soll_h + Soll_z + Soll_e ; /*Winkel umrechnen*/ Soll_zeit = (Soll_winkel*10000)/360; /*Winkel zeitlich umrechnen*/ while(1) { // fallende Flanke von dem Taktgeber warten while ((PIND & (1 << PD0))) {} while (!(PIND & (1 << PD0))) {} // steigende Flanke von dem Komparator warten while (!(PIND & (1 << PD1))) {} while ((PIND & (1 << PD1))) {} // Korrektur dekrementieren bis er 0 wird. for (;korrektur!=0; korrektur--) {} // Ventil einschalten PORTB &= ~(1<= -10000) && (Korrekturswert < 0)) { Korrektur_wert = Korrekturswert + 10000; } else if ( (Korrekturswert >= 0) && (Korrekturswert <= 10000)) { Korrektur_wert = Korrekturswert; } // Korrektur mit 8 multiplizieren weil der Timer mit 8 Prescaler inkrementiert hat. korrektur = Korrektur_wert*8; // steigende Flanke von dem Taktgeber warten while (!(PIND & (1 << PD0))) {} while ((PIND & (1 << PD0))) {} // Ventil ausschalten PORTB &= ~(1<