/* * Gondel.c * * Created: 07.12.2013 17:41:10 * Author: Manuel */ #define F_CPU 1000000UL #define EEPReadWord(addr) eeprom_read_word((uint16_t *)addr) #define EEPWriteWord(addr, val) eeprom_write_word((uint16_t *)addr, val) #define Hall1 PA0 #define PotiGesch PA1 #define PotiStand PA2 #define LED PA3 #define PWM PA6 #define Richtung PA7 #define Hall2 PB0 #define Anlernen PB2 #include #include #include #include #include uint8_t Startsequenz; //Byte um Startfrequenz festzulegen uint8_t Lernroutine; //Byte um Lernroutine festzulegen uint8_t ADC_Geschwindigkeit; //Byte für Geschwindigkeitmessung uint8_t ADC_Standzeit; //Byte für Standzeitmessung uint16_t Motorrichtung; //word zum speichern der Motorrichtung uint16_t Schritte; //word für eine Runde uint16_t Runde; //word für Rundenzähler uint16_t SollRunden; //word für sollrunden uint8_t Speed = 80; uint8_t i; //byte für Wiederholfuntkionen void ADC_Auslesen(uint8_t ADC_sel) //Funktion ADC-Auslesen { ADMUX &= ~(1<0; i--) //Wartezeit von 40 ms solange wiederholen bis ADC-Wert erreicht { _delay_ms(40); //0,04 * (25 bis 280) entspricht mindestens 1sek bis ~11,2sek max wartezeit } } void Speedset(void) { ADC_Auslesen(0); //ADC1 auswählen und starten ADC_Geschwindigkeit = ADCH; //ADC-High in Variable speichern OCR1A = Speed - (ADC_Geschwindigkeit/5); //Geschiwindigkeit festlegen } void StartRampe(void) //Funktion Start { Speedset(); //Geschwindigkeit auslesen, festlegen OCR1A += 200; //und verlangsamen TCCR1A |= 1<0; i--) //Wartezeit von 25 ms 100-mal wiederholen { OCR1A -= 1; //Geschwindigkeit dabei alle 40 ms erhöhen _delay_ms(40); } for(i = 100; i>0; i--) //Wartezeit von 50 ms 100-mal wiederholen { OCR1A -= 1; _delay_ms(50); //Geschwindigkeit dabei alle 50 ms erhöhen } //bis Anfangsgeschwindigkeit vom ADC-Auslesen erreicht PCMSK0 |= 1<0; i--) //Wartezeit von 40 ms solange wiederholen bis ADC-Wert erreicht { OCR1A += 1; _delay_ms(50); } for(i = 100; i>0; i--) { OCR1A += 1; _delay_ms(40); } } void LED_blink(uint8_t blinkzahl) //Funktion Status LED blinken { for(i = blinkzahl; i>0; i--) //So oft blinken wie in Eingabewert vorgesehen { PORTA |= 1<= SollRunden-8) { EndRampe(); do {} while (bit_is_clear(Startsequenz, 0)); //warten bis Ende das erste mal erreicht {} } //************************************************** //***********Standardschleife if(Runde < SollRunden-8) { Speedset(); } } } ISR(PCINT0_vect) //Interrupt für Hall1 (UNTEN) { PCMSK0 &= ~(1<