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