Zeitsteuerung
Fork of timer0 by
timer0.cpp@2:f63678f5ed05, 2016-03-10 (annotated)
- Committer:
- rs27
- Date:
- Thu Mar 10 20:34:59 2016 +0000
- Revision:
- 2:f63678f5ed05
- Parent:
- 1:3ab9e5cd87e7
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
rs27 | 0:8d3e2b74d1d5 | 1 | #include "mbed.h" |
rs27 | 0:8d3e2b74d1d5 | 2 | #include "timer0.h" |
rs27 | 0:8d3e2b74d1d5 | 3 | |
rs27 | 0:8d3e2b74d1d5 | 4 | |
rs27 | 0:8d3e2b74d1d5 | 5 | //-------------------------------------------------------- |
rs27 | 0:8d3e2b74d1d5 | 6 | // Construktor initialisiert den Timer |
rs27 | 0:8d3e2b74d1d5 | 7 | timer0::timer0() |
rs27 | 0:8d3e2b74d1d5 | 8 | { |
rs27 | 0:8d3e2b74d1d5 | 9 | uint8_t i; |
rs27 | 0:8d3e2b74d1d5 | 10 | |
rs27 | 0:8d3e2b74d1d5 | 11 | ms = 0; |
rs27 | 0:8d3e2b74d1d5 | 12 | sec = 0; |
rs27 | 1:3ab9e5cd87e7 | 13 | min = 0; |
rs27 | 1:3ab9e5cd87e7 | 14 | hours = 0; |
rs27 | 1:3ab9e5cd87e7 | 15 | |
rs27 | 0:8d3e2b74d1d5 | 16 | // Initialize countdown timers |
rs27 | 0:8d3e2b74d1d5 | 17 | for (i=0; i < TIMER0_NUM_COUNTDOWNTIMERS; i++) |
rs27 | 0:8d3e2b74d1d5 | 18 | CountDownTimers[i].status = 0xFF; |
rs27 | 0:8d3e2b74d1d5 | 19 | |
rs27 | 0:8d3e2b74d1d5 | 20 | ticker.attach_us(this, &timer0::func, 1000); |
rs27 | 0:8d3e2b74d1d5 | 21 | } |
rs27 | 0:8d3e2b74d1d5 | 22 | |
rs27 | 0:8d3e2b74d1d5 | 23 | //-------------------------------------------------------- |
rs27 | 1:3ab9e5cd87e7 | 24 | // Interruptroutine wird jede 1000µs aufgerufen, da das Senden von |
rs27 | 1:3ab9e5cd87e7 | 25 | // einem Zeichen ca. 100µs Zeit beansprucht |
rs27 | 1:3ab9e5cd87e7 | 26 | |
rs27 | 0:8d3e2b74d1d5 | 27 | void timer0::func(void) |
rs27 | 0:8d3e2b74d1d5 | 28 | { |
rs27 | 0:8d3e2b74d1d5 | 29 | uint8_t i; |
rs27 | 0:8d3e2b74d1d5 | 30 | |
rs27 | 0:8d3e2b74d1d5 | 31 | // Zeitbasis für Systemzeit |
rs27 | 0:8d3e2b74d1d5 | 32 | // ----- count down timers in ms ------------------------------------------------- |
rs27 | 0:8d3e2b74d1d5 | 33 | for (i=0; i<TIMER0_NUM_COUNTDOWNTIMERS; i++) |
rs27 | 0:8d3e2b74d1d5 | 34 | { |
rs27 | 0:8d3e2b74d1d5 | 35 | if (CountDownTimers[i].status == 1) |
rs27 | 0:8d3e2b74d1d5 | 36 | { // ms |
rs27 | 0:8d3e2b74d1d5 | 37 | if (CountDownTimers[i].count_timer > 0) |
rs27 | 0:8d3e2b74d1d5 | 38 | CountDownTimers[i].count_timer -- ; |
rs27 | 0:8d3e2b74d1d5 | 39 | if (CountDownTimers[i].count_timer == 0) |
rs27 | 0:8d3e2b74d1d5 | 40 | CountDownTimers[i].status = 0; |
rs27 | 0:8d3e2b74d1d5 | 41 | } |
rs27 | 0:8d3e2b74d1d5 | 42 | } |
rs27 | 0:8d3e2b74d1d5 | 43 | |
rs27 | 0:8d3e2b74d1d5 | 44 | if (ms < 1000) |
rs27 | 0:8d3e2b74d1d5 | 45 | { |
rs27 | 0:8d3e2b74d1d5 | 46 | ms++; |
rs27 | 0:8d3e2b74d1d5 | 47 | } |
rs27 | 0:8d3e2b74d1d5 | 48 | else |
rs27 | 0:8d3e2b74d1d5 | 49 | { |
rs27 | 0:8d3e2b74d1d5 | 50 | ms = 0; |
rs27 | 0:8d3e2b74d1d5 | 51 | |
rs27 | 0:8d3e2b74d1d5 | 52 | seconds++; |
rs27 | 0:8d3e2b74d1d5 | 53 | set_time(seconds); |
rs27 | 0:8d3e2b74d1d5 | 54 | |
rs27 | 2:f63678f5ed05 | 55 | // ----- count down timers in seconds ------------------------------------------------- |
rs27 | 2:f63678f5ed05 | 56 | |
rs27 | 0:8d3e2b74d1d5 | 57 | for (i=0; i<TIMER0_NUM_COUNTDOWNTIMERS; i++) |
rs27 | 0:8d3e2b74d1d5 | 58 | { |
rs27 | 0:8d3e2b74d1d5 | 59 | if (CountDownTimers[i].status == 2) |
rs27 | 0:8d3e2b74d1d5 | 60 | { // sekunden |
rs27 | 0:8d3e2b74d1d5 | 61 | if (CountDownTimers[i].count_timer > 0) |
rs27 | 0:8d3e2b74d1d5 | 62 | CountDownTimers[i].count_timer -- ; |
rs27 | 0:8d3e2b74d1d5 | 63 | if (CountDownTimers[i].count_timer == 0) |
rs27 | 0:8d3e2b74d1d5 | 64 | CountDownTimers[i].status = 0; |
rs27 | 0:8d3e2b74d1d5 | 65 | } |
rs27 | 0:8d3e2b74d1d5 | 66 | } |
rs27 | 0:8d3e2b74d1d5 | 67 | |
rs27 | 0:8d3e2b74d1d5 | 68 | if (sec < 60) |
rs27 | 0:8d3e2b74d1d5 | 69 | { |
rs27 | 0:8d3e2b74d1d5 | 70 | sec++; |
rs27 | 0:8d3e2b74d1d5 | 71 | } |
rs27 | 0:8d3e2b74d1d5 | 72 | else |
rs27 | 0:8d3e2b74d1d5 | 73 | { |
rs27 | 0:8d3e2b74d1d5 | 74 | sec = 0; |
rs27 | 2:f63678f5ed05 | 75 | |
rs27 | 2:f63678f5ed05 | 76 | // ----- count down timers in minuts ------------------------------------------------- |
rs27 | 2:f63678f5ed05 | 77 | |
rs27 | 2:f63678f5ed05 | 78 | for (i=0; i<TIMER0_NUM_COUNTDOWNTIMERS; i++) |
rs27 | 2:f63678f5ed05 | 79 | { |
rs27 | 2:f63678f5ed05 | 80 | if (CountDownTimers[i].status == 3) |
rs27 | 2:f63678f5ed05 | 81 | { // sekunden |
rs27 | 2:f63678f5ed05 | 82 | if (CountDownTimers[i].count_timer > 0) |
rs27 | 2:f63678f5ed05 | 83 | CountDownTimers[i].count_timer -- ; |
rs27 | 2:f63678f5ed05 | 84 | if (CountDownTimers[i].count_timer == 0) |
rs27 | 2:f63678f5ed05 | 85 | CountDownTimers[i].status = 0; |
rs27 | 2:f63678f5ed05 | 86 | } |
rs27 | 2:f63678f5ed05 | 87 | } |
rs27 | 2:f63678f5ed05 | 88 | |
rs27 | 1:3ab9e5cd87e7 | 89 | if (min < 60) min++; |
rs27 | 1:3ab9e5cd87e7 | 90 | else |
rs27 | 1:3ab9e5cd87e7 | 91 | { |
rs27 | 1:3ab9e5cd87e7 | 92 | min = 0; |
rs27 | 1:3ab9e5cd87e7 | 93 | if (hours < 24) hours++; |
rs27 | 1:3ab9e5cd87e7 | 94 | else hours = 0; |
rs27 | 1:3ab9e5cd87e7 | 95 | } |
rs27 | 0:8d3e2b74d1d5 | 96 | } |
rs27 | 0:8d3e2b74d1d5 | 97 | } |
rs27 | 0:8d3e2b74d1d5 | 98 | |
rs27 | 0:8d3e2b74d1d5 | 99 | } |
rs27 | 0:8d3e2b74d1d5 | 100 | |
rs27 | 1:3ab9e5cd87e7 | 101 | |
rs27 | 1:3ab9e5cd87e7 | 102 | //-------------------------------------------------------- |
rs27 | 1:3ab9e5cd87e7 | 103 | // Abfrage der Softwareuhr |
rs27 | 1:3ab9e5cd87e7 | 104 | // |
rs27 | 1:3ab9e5cd87e7 | 105 | // die Stunden, Minuten und Sekungen werden in einem Array zurückgegeben |
rs27 | 1:3ab9e5cd87e7 | 106 | // die millisekunden sind separat |
rs27 | 1:3ab9e5cd87e7 | 107 | |
rs27 | 1:3ab9e5cd87e7 | 108 | void timer0::get_time_stamp(uint8_t *tarray,uint16_t *millis) |
rs27 | 1:3ab9e5cd87e7 | 109 | { |
rs27 | 1:3ab9e5cd87e7 | 110 | *millis = ms; |
rs27 | 1:3ab9e5cd87e7 | 111 | *tarray = hours; |
rs27 | 1:3ab9e5cd87e7 | 112 | tarray++; |
rs27 | 1:3ab9e5cd87e7 | 113 | *tarray = min; |
rs27 | 1:3ab9e5cd87e7 | 114 | tarray++; |
rs27 | 1:3ab9e5cd87e7 | 115 | *tarray = sec; |
rs27 | 1:3ab9e5cd87e7 | 116 | } |
rs27 | 1:3ab9e5cd87e7 | 117 | |
rs27 | 0:8d3e2b74d1d5 | 118 | //-------------------------------------------------------- |
rs27 | 0:8d3e2b74d1d5 | 119 | // Abfrage nach freiem Timer |
rs27 | 0:8d3e2b74d1d5 | 120 | // |
rs27 | 0:8d3e2b74d1d5 | 121 | // wenn alle Timer belegt sind wird 0xFF zurückgegebne |
rs27 | 0:8d3e2b74d1d5 | 122 | |
rs27 | 0:8d3e2b74d1d5 | 123 | uint8_t timer0::AllocateCountdownTimer (void) |
rs27 | 0:8d3e2b74d1d5 | 124 | { |
rs27 | 0:8d3e2b74d1d5 | 125 | uint8_t i; |
rs27 | 0:8d3e2b74d1d5 | 126 | |
rs27 | 0:8d3e2b74d1d5 | 127 | for (i=0; i<TIMER0_NUM_COUNTDOWNTIMERS; i++) |
rs27 | 0:8d3e2b74d1d5 | 128 | if (CountDownTimers[i].status == 0xFF) |
rs27 | 0:8d3e2b74d1d5 | 129 | { |
rs27 | 0:8d3e2b74d1d5 | 130 | CountDownTimers[i].status = 0x00; // Timer reserviert, nicht gestartet |
rs27 | 0:8d3e2b74d1d5 | 131 | // printf_P(PSTR("\rallocate timer [%03d] %d\n"),i,ListPointer); |
rs27 | 0:8d3e2b74d1d5 | 132 | |
rs27 | 0:8d3e2b74d1d5 | 133 | return i; |
rs27 | 0:8d3e2b74d1d5 | 134 | } |
rs27 | 0:8d3e2b74d1d5 | 135 | |
rs27 | 0:8d3e2b74d1d5 | 136 | return 0xFF; |
rs27 | 0:8d3e2b74d1d5 | 137 | } |
rs27 | 0:8d3e2b74d1d5 | 138 | |
rs27 | 0:8d3e2b74d1d5 | 139 | //-------------------------------------------------------- |
rs27 | 0:8d3e2b74d1d5 | 140 | // Timer wieder freigeben |
rs27 | 0:8d3e2b74d1d5 | 141 | void timer0::RemoveCountdownTimer(uint8_t timer) |
rs27 | 0:8d3e2b74d1d5 | 142 | { |
rs27 | 0:8d3e2b74d1d5 | 143 | CountDownTimers[timer].status = 0xFF; |
rs27 | 0:8d3e2b74d1d5 | 144 | } |
rs27 | 0:8d3e2b74d1d5 | 145 | |
rs27 | 0:8d3e2b74d1d5 | 146 | //-------------------------------------------------------- |
rs27 | 0:8d3e2b74d1d5 | 147 | // Abfrage ob Timer 0 erreicht hat |
rs27 | 0:8d3e2b74d1d5 | 148 | uint8_t timer0::GetTimerStatus(uint8_t timer) |
rs27 | 0:8d3e2b74d1d5 | 149 | { |
rs27 | 0:8d3e2b74d1d5 | 150 | return CountDownTimers[timer].status; |
rs27 | 0:8d3e2b74d1d5 | 151 | } |
rs27 | 0:8d3e2b74d1d5 | 152 | |
rs27 | 0:8d3e2b74d1d5 | 153 | //-------------------------------------------------------- |
rs27 | 0:8d3e2b74d1d5 | 154 | // Abfrage der verbleibenden Zeit |
rs27 | 0:8d3e2b74d1d5 | 155 | uint16_t timer0::GetTimerZeit(uint8_t timer) |
rs27 | 0:8d3e2b74d1d5 | 156 | { |
rs27 | 0:8d3e2b74d1d5 | 157 | return CountDownTimers[timer].count_timer; |
rs27 | 0:8d3e2b74d1d5 | 158 | } |
rs27 | 0:8d3e2b74d1d5 | 159 | |
rs27 | 0:8d3e2b74d1d5 | 160 | //-------------------------------------------------------- |
rs27 | 0:8d3e2b74d1d5 | 161 | // Timer aktivieren |
rs27 | 0:8d3e2b74d1d5 | 162 | void timer0::SetCountdownTimer(unsigned char timer, unsigned char status, unsigned short value) |
rs27 | 0:8d3e2b74d1d5 | 163 | { |
rs27 | 0:8d3e2b74d1d5 | 164 | CountDownTimers[timer].count_timer = value; |
rs27 | 0:8d3e2b74d1d5 | 165 | CountDownTimers[timer].status = status; |
rs27 | 0:8d3e2b74d1d5 | 166 | } |
rs27 | 0:8d3e2b74d1d5 | 167 | |
rs27 | 0:8d3e2b74d1d5 | 168 | //-------------------------------------------------------- |
rs27 | 0:8d3e2b74d1d5 | 169 | // Zeitstempel setzen |
rs27 | 0:8d3e2b74d1d5 | 170 | void timer0::Set_t(uint8_t * data) |
rs27 | 0:8d3e2b74d1d5 | 171 | { |
rs27 | 0:8d3e2b74d1d5 | 172 | char buffer[40]; |
rs27 | 0:8d3e2b74d1d5 | 173 | |
rs27 | 0:8d3e2b74d1d5 | 174 | t.tm_sec = data[0]; // Sekunden 0-59 |
rs27 | 0:8d3e2b74d1d5 | 175 | t.tm_min = data[1]; // Minuten 0-59 |
rs27 | 0:8d3e2b74d1d5 | 176 | t.tm_hour = data[2]; // Stunden 0-23 |
rs27 | 0:8d3e2b74d1d5 | 177 | t.tm_mday = data[3]; // Tag 1-31 |
rs27 | 0:8d3e2b74d1d5 | 178 | t.tm_mon = data[4] - 1; // Monat 0-11 0 = Januar |
rs27 | 0:8d3e2b74d1d5 | 179 | t.tm_year = data[5]; // Jahr year since 1900 |
rs27 | 0:8d3e2b74d1d5 | 180 | |
rs27 | 0:8d3e2b74d1d5 | 181 | seconds = mktime(&t); |
rs27 | 0:8d3e2b74d1d5 | 182 | set_time(seconds); |
rs27 | 0:8d3e2b74d1d5 | 183 | |
rs27 | 0:8d3e2b74d1d5 | 184 | strftime(buffer, 40, "%a,%d.%m.%Y %H:%M:%S", localtime(&seconds)); |
rs27 | 0:8d3e2b74d1d5 | 185 | // pc.printf("\ntimer0::set_t = %s", buffer); |
rs27 | 0:8d3e2b74d1d5 | 186 | } |