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:
die Funktion für die Dauer so:Code:void pause(uint16_t wert) //millisek eingeben max 65535 { uint16_t ende=zaehler+wert; while (zaehler<ende); }
das Testprogramm:Code:uint32_t dauer(void) { uint16_t wert=zaehler-start_zeit; return wert; }
die ermittelten Pausenwerte sollten nun theoretisch jew. 1000 ms sein.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); }
Das Ergebnis sieht aber so aus:
warum geht das so nicht?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
Wäre schön, wenn mir jemand weiterhelfen könnte.
Gruss
M.







Zitieren

Lesezeichen