die for-schleife wird wegoptimiert wenn sie leer ist.
setzt mal eine delay rein oder ein nop.
castle
Hallo Leute,
ich habs jetzt geschaft ein gutes Board zubasteln (noch nicht ganz fertig!) Aber immerhin ist auch ein Servo schon dran, bloß jetzt hab ich Probleme beim programmieren:
Mein Servo bewegt sich nur ein kleines Stück und dann gar nicht mehr! ich möchte aber das er von Anfang bis Ende fährt! Bestimmt hab ich nur was Kleines vergessen, aber ich finde es einfach nicht!
also hier ist mal der Code:
Danke für eure hilfe!Code:#include <avr/io.h> #include <avr/signal.h> #include <avr/interrupt.h> #include <inttypes.h> #include <math.h> volatile unsigned char servowert; volatile unsigned char puls; volatile unsigned char zaehler; int set_servo(volatile uint8_t pos) { servowert = (pos/180) + 1; } int main(void) { zaehler = 0; sei(); DDRD |= (1<<PD7); PORTD |= (1<<PD7); //Timer0 übernimmt die Highphase //muss 1ms sein also 25 Takte bei einem Prescaler von 64 puls = 25; TCCR2 = (1<<CS22) | (1<<WGM21) |(1<<COM21) |(1<<COM20); TCNT2 = (255-puls); TIMSK = (1<<TOIE2); for(;;) { } } SIGNAL(SIG_OVERFLOW2) { if(zaehler == 0) { PORTD &= ~(0<<PD7); TCNT2 = (255-puls); zaehler++; //PORTB = (0<<PB0); } else if ( (zaehler > 0 ) && (zaehler < 20 ) ) { TCNT2 = (255-puls); zaehler++; } else { TCNT2 = (255-puls); zaehler = 0; PORTD |= (1<<PD7); } }
matic
die for-schleife wird wegoptimiert wenn sie leer ist.
setzt mal eine delay rein oder ein nop.
castle
Hi,
Danke für deine Antwort! Aber auch wenn ich was in die For-Schleife schreibe passiert nix anderes! Hab den Code mal bisschen umgeschrieben! Vielleicht hast du ja noch ein paar Ideen!
gruß maticCode:#include <avr/io.h> #include <avr/signal.h> #include <avr/interrupt.h> #include <inttypes.h> #include <math.h> #include <avr/delay.h> volatile unsigned char servowert; volatile unsigned char puls; volatile unsigned char zaehler; int set_servo(volatile uint8_t pos) { servowert = (pos/180) + 1; } int main(void) { zaehler = 0; sei(); DDRB = (1<<PB1) | (0<<PB0); DDRD |= (1<<PD7); PORTD |= (1<<PD7); //Timer0 übernimmt die Highphase //muss 1ms sein also 25 Takte bei einem Prescaler von 64 puls = 25; TCCR2 = (1<<CS22) | (1<<WGM21) |(1<<COM21) |(1<<COM20); TCNT2 = 6; TIMSK = (1<<TOIE2); while(1) { PORTB = 0xFD; _delay_ms(100000); PORTB = 0xFE; _delay_ms(100000); } } SIGNAL(SIG_OVERFLOW2) { switch(zaehler) { case 0: // case 1: das da aktivieren für 2 mS Servo PORTD |= (1<<PD7); zaehler++; break; case 2: //PORTD &= ~(0<<PD7); PORTD &= ~(1<<PD7); zaehler++; break; case 20: zaehler = 0; PORTD |= (1<<PD7); break; case 21: zaehler = 0; PORTD &= ~(1<<PD7); break; TCNT2 = 6; } }
Hi,
Es geht! Hatte den falsche Timer-Modus! Aber jetzt geht es immer volle Kanne nach links und will nicht mehr aufhören... Naja ich Suche weider!
matic
Lesezeichen