Hallo zusammen,
Ich habe ein erstes Testprogramm für meinen Hexapod geschrieben und das funktioniert wunderbar.
SexCrora
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;
}
Nun wollte ich das aber nicht unbedingt mit der delay funktion sondern mit einem Timer realisieren.
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.
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 sieht ja jemand einen fehler bei den Steuerbits, eine einfachen Tippfehler oder einen grundsätzlichen Fehler in der logik.
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
Lesezeichen