ChristophB
23.10.2009, 19:30
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.
#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
}
Das Problem liegt in diesem Codeabschnitt
while( 1 ) {
servo1 = 900 + PINC;
}
Ich hoffe ihr könnt mir bei der Fehlerbehebung helfen.
Gruß Christoph
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.
#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
}
Das Problem liegt in diesem Codeabschnitt
while( 1 ) {
servo1 = 900 + PINC;
}
Ich hoffe ihr könnt mir bei der Fehlerbehebung helfen.
Gruß Christoph