Hallo zusammen,
Ich habe ein erstes Testprogramm für meinen Hexapod geschrieben und das funktioniert wunderbar.
***Crora
Nun wollte ich das aber nicht unbedingt mit der delay funktion sondern mit einem Timer realisieren.Code:#include <avr/io.h> //#include <avr/interrupt.h> #include <util/delay.h> int main (void) { DDRA = 0b00000001; //PA0 Servo 12 DDRB = 0b00011111; //PB0-4 Servo 11/10/7/8/9 DDRC = 0b11111100; //PC2-7 Servo 4/5/6/3/2/1 DDRD = 0b11111100; //PD2-7 Servo 15/14/13/16/17/18 while (1) { PORTA |= (1 << PA0); PORTB |= (1 << PB0); PORTB |= (1 << PB1); PORTB |= (1 << PB2); PORTB |= (1 << PB3); PORTB |= (1 << PB4); PORTC |= (1 << PC2); PORTC |= (1 << PC3); PORTC |= (1 << PC4); PORTC |= (1 << PC5); PORTC |= (1 << PC6); PORTC |= (1 << PC7); PORTD |= (1 << PD2); PORTD |= (1 << PD3); PORTD |= (1 << PD4); PORTD |= (1 << PD5); PORTD |= (1 << PD6); PORTD |= (1 << PD7); _delay_us(1500); //480=0°/1250=90°/2160=180° PORTA &= ~(1 << PA0); PORTB &= ~(1 << PB0); PORTB &= ~(1 << PB1); PORTB &= ~(1 << PB2); PORTB &= ~(1 << PB3); PORTB &= ~(1 << PB4); PORTC &= ~(1 << PC2); PORTC &= ~(1 << PC3); PORTC &= ~(1 << PC4); PORTC &= ~(1 << PC5); PORTC &= ~(1 << PC6); PORTC &= ~(1 << PC7); PORTD &= ~(1 << PD2); PORTD &= ~(1 << PD3); PORTD &= ~(1 << PD4); PORTD &= ~(1 << PD5); PORTD &= ~(1 << PD6); PORTD &= ~(1 << PD7); _delay_ms(18); } return 1; }
Timer0 ist synchron zum 16MHz takt geschaltet. und wird auf 256-160=96 vorgealden. Das ergibt einen Überlauf alle 10µs.
Bei jedem überlauf soll mein timer1 erhöht werden. wenn dieser 250 erreicht hat wird er zurückgesetzt und timer2 (auf 8 vorgeladen) wird um eins vermindert.
timer1 ist ein timer der 0-2,5ms läuft und timer2 ist alle 20ms gleich null.
Vielleicht sieht ja jemand einen fehler bei den Steuerbits, eine einfachen Tippfehler oder einen grundsätzlichen Fehler in der logik.Code:#include <avr/io.h> #include <avr/interrupt.h> //#include <util/delay.h> unsigned char timer1=0; unsigned char timer2=8; unsigned char pulse=0; SIGNAL (SIG_OVERFLOW0) { timer1++; if(timer1==250) { timer1=0; timer2--; } TCNT0 = 256 - 160; //Timer0 neu vorladen } int main (void) { DDRA = 0b00000001; //PA0 Servo 12 DDRB = 0b00011111; //PB0-4 Servo 11/10/7/8/9 DDRC = 0b11111100; //PC2-7 Servo 4/5/6/3/2/1 DDRD = 0b11111100; //PD2-7 Servo 15/14/13/16/17/18 TCNT0 = 256 - 160; //Timer0 vorladen (10us) TCCR0 |= (1 << CS00); //CS02/01/00 mit 001 belegen: Teiler 1 TIMSK |= (1 << TOIE0); //Timer0 Interrupt freigegeben sei(); //Interrupts freigegeben while(1) { if(timer2 == 0) { timer2 = 8; pulse = 1; PORTA |= (1 << PA0); PORTB |= (1 << PB0); PORTB |= (1 << PB1); PORTB |= (1 << PB2); PORTB |= (1 << PB3); PORTB |= (1 << PB4); PORTC |= (1 << PC2); PORTC |= (1 << PC3); PORTC |= (1 << PC4); PORTC |= (1 << PC5); PORTC |= (1 << PC6); PORTC |= (1 << PC7); PORTD |= (1 << PD2); PORTD |= (1 << PD3); PORTD |= (1 << PD4); PORTD |= (1 << PD5); PORTD |= (1 << PD6); PORTD |= (1 << PD7); } if(pulse == 1 && timer1 >= 150) { pulse = 0; PORTA &= ~(1 << PA0); PORTB &= ~(1 << PB0); PORTB &= ~(1 << PB1); PORTB &= ~(1 << PB2); PORTB &= ~(1 << PB3); PORTB &= ~(1 << PB4); PORTC &= ~(1 << PC2); PORTC &= ~(1 << PC3); PORTC &= ~(1 << PC4); PORTC &= ~(1 << PC5); PORTC &= ~(1 << PC6); PORTC &= ~(1 << PC7); PORTD &= ~(1 << PD2); PORTD &= ~(1 << PD3); PORTD &= ~(1 << PD4); PORTD &= ~(1 << PD5); PORTD &= ~(1 << PD6); PORTD &= ~(1 << PD7); } } return 1; }
Vielleicht habe ich mich auch bei der Berechnung der Steuergrößen vertan.
Es ist mein erster µC den ich komplett selbst programmiere. ( habe nur RP6 Erfahrung)
vielen Dank für eure Hilfe
mfg WarChild







Zitieren

Lesezeichen