Hallo!
Ich versuche mit einem Mega32 mit 16MHz ein Servo anzusteuern.
Das erzeugendes Steuersignals mithilfe des Timer0 funktioniert bereits, aber wenn ich den Wert der ausschlaggebend für die Position des Servos ist in der Hauptschleife ändern möchte reagiert der uC nicht darauf. Ich kann mir das ganze nicht so ganz erklären.
Das Problem liegt in diesem CodeabschnittCode:#include <avr/io.h> #include <avr/interrupt.h> #ifndef F_CPU /* Definiere F_CPU, wenn F_CPU nicht bereits vorher definiert (z.B. durch Übergabe als Parameter zum Compiler innerhalb des Makefiles). Zusätzlich Ausgabe einer Warnung, die auf die "nachträgliche" Definition hinweist */ #warning "F_CPU war noch nicht definiert, wird nun mit 1000000 definiert" #define F_CPU 16000000UL /* Quarz mit 1,000000 Mhz */ #endif #include <util/delay.h> /* in älteren avr-libc Versionen <avr/delay.h> */ void delay_ms(uint16_t ms) { for(; ms>0; ms--) _delay_ms(1); } //Timer Variable deklarieren uint16_t t = 0; //Servopositionsvariablen uint16_t servo1; // zwichen 900 - 2100 /* Servos & Timer initialisieren */ void servo_init() { //Die Steuersignale der Servos liegen an Port D an! //Port D als Ausgang definieren DDRD = 0xff; //Timer initialisieren TCCR0 = (1<<CS00); TCNT0 = 96; TIMSK|=(1<<TOIE0); //Intrerrupts einschalten sei(); } //ISR beim überlauf des Timers T0 ISR(TIMER0_OVF_vect){ TCNT0 = 96; t = t+10; if(t==20000){ t = 0; //Servo-steuer-impuls einschalten PORTD = 0x01; } //Routine zum abschalten der Servo-steuer-impulse if(t>servo1){ //Servo-steuer-impuls ausschalten PORTD = 0x00; } } int main( void ) { servo1 = 900; servo_init(); sei(); DDRC = 0x00; PORTC = 0xff; delay_ms(1000); servo1 = servo1 + 1200; while( 1 ) { servo1 = 900 + PINC; } return 0; // Wird von int main() verlangt }
Ich hoffe ihr könnt mir bei der Fehlerbehebung helfen.Code:while( 1 ) { servo1 = 900 + PINC; }
Gruß Christoph







Zitieren

Lesezeichen