M1.R
28.11.2009, 19:41
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.
#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:
void pause(uint16_t wert) //millisek eingeben max 65535
{
uint16_t ende=zaehler+wert;
while (zaehler<ende);
}
die Funktion für die Dauer so:
uint32_t dauer(void)
{
uint16_t wert=zaehler-start_zeit;
return wert;
}
das Testprogramm:
//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:
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.
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.
#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:
void pause(uint16_t wert) //millisek eingeben max 65535
{
uint16_t ende=zaehler+wert;
while (zaehler<ende);
}
die Funktion für die Dauer so:
uint32_t dauer(void)
{
uint16_t wert=zaehler-start_zeit;
return wert;
}
das Testprogramm:
//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:
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.