Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
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 | } |
