Hallo,

auf folgende Weise versuche ich Pausen zu programmieren und eine Dauer zu ermitteln (Atmega 32, 8Mhz):
Zu Beginn wird ein Zähler gestartet der jede Millisekunde um 1 weiterzählt.

Code:
#define preloader 131
volatile uint32_t zaehler;

ISR(TIMER0_OVF_vect)  // wird jede ms ausgeführt
{
	TCNT0 = preloader;
	zaehler++;
}

die Funktion für die Pause sieht so aus:
Code:
void pause(uint16_t wert)		//millisek eingeben max 65535
{
	uint16_t ende=zaehler+wert;
	while (zaehler<ende);
}
die Funktion für die Dauer so:
Code:
uint32_t dauer(void)		
{
	uint16_t wert=zaehler-start_zeit;
	return wert;
}
das Testprogramm:
Code:
//test45

#include "loeffler.h"
#include "uart.h" //fleury

/*****************************************************************************/
void SerPrint (char *data)
{
  unsigned char i = 0;
  while (data [i] != 0x00)	uart_putc (data [i++]);
}
/****************************************************************************/
void PrintInt (int wert)
{
  char text [7]; 
  itoa (wert, text, 10);
  SerPrint (text);
}
/****************************************************************************/

int main(void)
{
    loeffler_init();	
	
	uint8_t i;
	uint16_t pausen[21];
	led_rechts(rot);
	led_links(rot);
	for(i=0; i<20; i++)
	{
		start_zeit=zaehler;
		pause(1000);
		pausen[i]=(dauer());
	}
	led_rechts(gruen);
	led_links(gruen);
	uart_init( UART_BAUD_SELECT(UART_BAUD_RATE,F_CPU) );
	SerPrint("\n\r");
	for(i=0; i<20; i++)
	{
		SerPrint("\n\r");
		PrintInt (i);
		SerPrint("\t"); 
		PrintInt (pausen[i]);
	}
	while(1);
    return(0);
}
die ermittelten Pausenwerte sollten nun theoretisch jew. 1000 ms sein.

Das Ergebnis sieht aber so aus:

Code:
0       1000
1       1000
2       1000
3       840
4       1000
5       1000
6       1000
7       1000
8       864
9       1000
10      1000
11      1000
12      1000
13      864
14      1000
15      1000
16      1000
17      1000
18      864
19      1000
warum geht das so nicht?
Wäre schön, wenn mir jemand weiterhelfen könnte.

Gruss
M.