2 #include <avr/interrupt.h>
15 SEGA | SEGB | SEGC | SEGD | SEGE | SEGF,
17 SEGA | SEGB | SEGD | SEGE | SEGG,
18 SEGA | SEGB | SEGC | SEGD | SEGG,
19 SEGB | SEGC | SEGF | SEGG,
20 SEGA | SEGC | SEGD | SEGF | SEGG,
21 SEGA | SEGC | SEGD | SEGE | SEGF | SEGG,
23 SEGA | SEGB | SEGC | SEGD | SEGE | SEGF | SEGG,
24 SEGA | SEGB | SEGC | SEGD | SEGF | SEGG,
25 SEGA | SEGB | SEGC | SEGE | SEGF | SEGG,
26 SEGC | SEGD | SEGE | SEGF | SEGG,
27 SEGA | SEGD | SEGE | SEGF,
28 SEGB | SEGC | SEGD | SEGE | SEGG,
29 SEGA | SEGD | SEGE | SEGF | SEGG,
30 SEGA | SEGE | SEGF | SEGG,
33 uint8_t dsp[2] = {0, 0};
50 unsigned long ttimea = 10000;
51 /* Zero-cross detector*/
62 * B0..2 = Pulse sensor
81 * D3 = NTC Op-amp (INT1)
91 unsigned char bindisp(unsigned char num)
115 void display(char num)
117 dsp[0] = font[(num / 10) % 10];
118 dsp[1] = font[num % 10];
121 void disphex(unsigned char num)
123 dsp[0] = font[(num & 0xf0) >> 4];
124 dsp[1] = font[num & 0x0f];
127 unsigned long getticks(void)
129 return(TCNT1 + (((unsigned long)oticks) << 16));
134 static uint16_t last = 0;
137 if(TCNT1 - last > 500) {
144 if(dsp[ledc] & (1 << leda)) {
150 d = 0x10 << (leda - 6);
157 PORTD = (PORTD & 0x0f) | d;
167 if((PIND & 8) && (tlock == 0)) {
172 } else if(tstate == 1) {
173 if(now - tstart > 1000) {
185 ttimea = ((ttimea * 15) + ttime) >> 4;
204 dsp[0] = bindisp((ttimea & 0xff00) >> 8);
205 dsp[1] = bindisp(ttimea & 0x00ff);
208 disphex((ttimea & 0xff000) >> 12);
211 display((ttimea / 100) % 100);
216 display(ttimea / 1000);
252 ttime = now - tstart;
267 if((sstate == 0) & ((PINB & 1) == 0)) {
271 if((sstate == 1) & ((PINB & 1) == 1)) {
272 stime = oticks - stime;
276 if((PINB & 2) == 0) {
278 } else if((PINB & 4) == 0) {
281 } else if(pstate == 1) {
282 if((PINB & 4) == 0) {
288 } else if(pstate == 2) {
289 if((PINB & 2) == 0) {
296 if((PINB & 2) && (PINB & 4))