Zeitsteuerung

Dependents:   mini_02

Fork of timer0 by V09

Committer:
rs27
Date:
Thu Mar 10 20:34:59 2016 +0000
Revision:
2:f63678f5ed05
Parent:
1:3ab9e5cd87e7

        

Who changed what in which revision?

UserRevisionLine numberNew 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 }