Hallo!
Ich habe mir für meine Mega 128 eine Funktion geschrieben über die ich
verzögerungen Starten und Abfragen kann. Sie nutzt einen 8 bit Timer
Timer0 der assynchron mit einem Uhrenquartz läuft.
hier der Quellcode
1 | #include "rtc.h"
|
2 | #include "uart_printf.h"
|
3 | #include <stdlib.h>
|
4 |
|
5 | #define UsedTimer TCNT0
|
6 |
|
7 | //*********************************************************
|
8 | // Init Routine zum Timer anwerfen und Teiler einstellen
|
9 | //
|
10 |
|
11 | volatile uint8_t sekunde;
|
12 |
|
13 |
|
14 | void InitRtc(void)
|
15 | {
|
16 | sbi(ASSR,AS0); //Assyncron mit uhrenquartz
|
17 | TCCR0 |= Timer0Teiler; //Teiler 32
|
18 | TIMSK |= _BV(TOIE0);
|
19 | };
|
20 |
|
21 | ISR(TIMER0_OVF_vect)
|
22 | {
|
23 | sekunde++;
|
24 | };
|
25 |
|
26 |
|
27 | uint8_t delay1_4(uint8_t Command, uint16_t *Data, uint16_t Value)
|
28 | {
|
29 | uint8_t RetVal=0;
|
30 | uint16_t Diff;
|
31 | //nicht blockierende Zeitverzögerung
|
32 | switch (Command)
|
33 | {
|
34 | case StartNeuTime:
|
35 | {
|
36 | (*Data) = ((uint16_t)(sekunde*256)+UsedTimer);
|
37 |
|
38 | };//case
|
39 | break;
|
40 | case GetTime:
|
41 | {
|
42 |
|
43 | NOP();
|
44 | Diff = (((sekunde*256)+UsedTimer))-(*Data); //- (*Data);
|
45 | printf("%d\n",Diff);
|
46 | Diff = Diff;
|
47 | if(Diff >= Value)
|
48 | {
|
49 | RetVal = TimeReady;
|
50 | }
|
51 | else
|
52 | {
|
53 | RetVal = TimeIsRunning;
|
54 | };
|
55 | };//case
|
56 | };//Command
|
57 | return RetVal;
|
58 | };
|
Nun habe ich das Problem, das die Funktion nur mit dem printf
funktioniert, wenn ich es herrausnehme dann macht er es im ca. 1/4
sekunden takt.
die aufrufe für die Funktion sind einmal
delay1_4(StartNeuTime,&TimeBig,0);
zum Starten und
if((delay1_4(GetTime,&TimeBig,5000)) == TimeReady)
{
....
};
zum abfragen.
Kann mir keinen reim drauf machen, einer von euche eine Idee???
Gruß Stefan