1 | #include <avr/io.h>
|
2 | #include <util/delay.h>
|
3 | #include <avr/interrupt.h>
|
4 | //#include <lcd-routines.h>
|
5 | #include "uart.h"
|
6 |
|
7 |
|
8 | #define UART_BAUD_RATE 19200
|
9 |
|
10 | // Defines der einzelnen Ports
|
11 | // Buttons defines
|
12 | #define BTN_PORT PORTB
|
13 | #define BTN_DDR DDRB
|
14 | #define BTN_SECOND_UP PB5
|
15 | #define BTN_SECOND_DOWN PB4
|
16 | #define BTN_MINUTE_UP PB3
|
17 | #define BTN_MINUTE_DOWN PB2
|
18 | #define BTN_START PB1
|
19 | #define BTN_STOP PB0
|
20 | // Summer und Relais
|
21 | #define OUT_POPRT PORTD
|
22 | #define OUT_DDR DDRD
|
23 | #define OUT_SUMMER1 PD5
|
24 | #define OUT_SUMMER2 PD6
|
25 | #define OUT_RELAIS PD7
|
26 | #define TEST_BLINC PD6
|
27 | #define TEST_POWER PD5
|
28 | #define TEST_SWITCH_LED PD4
|
29 | #define TEST_BTN PD3
|
30 | #define TEST_BTN2 PD2
|
31 | #define TEST_LED2 PD1
|
32 |
|
33 | #define debounce( port, pin ) \
|
34 | ({ \
|
35 | static uint8_t flag = 0; /* new variable on every macro usage */ \
|
36 | uint8_t i = 0; \
|
37 | \
|
38 | if( flag ){ /* check for key release: */ \
|
39 | for(;;){ /* loop ... */ \
|
40 | if( !(port & 1<<pin) ){ /* ... until key pressed or ... */ \
|
41 | i = 0; /* 0 = bounce */ \
|
42 | break; \
|
43 | } \
|
44 | _delay_us( 98 ); /* * 256 = 25ms */ \
|
45 | if( --i == 0 ){ /* ... until key >25ms released */ \
|
46 | flag = 0; /* clear press flag */ \
|
47 | i = 0; /* 0 = key release debounced */ \
|
48 | break; \
|
49 | } \
|
50 | } \
|
51 | }else{ /* else check for key press: */ \
|
52 | for(;;){ /* loop ... */ \
|
53 | if( (port & 1<<pin) ){ /* ... until key released or ... */ \
|
54 | i = 0; /* 0 = bounce */ \
|
55 | break; \
|
56 | } \
|
57 | _delay_us( 98 ); /* * 256 = 25ms */ \
|
58 | if( --i == 0 ){ /* ... until key >25ms pressed */ \
|
59 | flag = 1; /* set press flag */ \
|
60 | i = 1; /* 1 = key press debounced */ \
|
61 | break; \
|
62 | } \
|
63 | } \
|
64 | } \
|
65 | i; /* return value of Macro */ \
|
66 | })
|
67 |
|
68 | ISR(TIMER0_OVF_vect)
|
69 | {
|
70 | TCNT0 = 00;
|
71 | OUT_POPRT ^= (1 << TEST_BLINC);
|
72 | }
|
73 |
|
74 | ISR(TIMER1_COMPA_vect)
|
75 | {
|
76 | //Auflösung 1 Sekunde
|
77 | TCNT1 = 0;
|
78 | OUT_POPRT ^= (1 << OUT_RELAIS);
|
79 | }
|
80 |
|
81 | void init(void)
|
82 | {
|
83 | TIMSK |= (1<<TOIE0);
|
84 | TCCR0 |= (1<<CS02) | (1<<CS00);
|
85 | TCNT0 = 00;
|
86 |
|
87 | //TCCR1B = (1 << WGM12) | (1 << CS12);
|
88 | //OCR1A = 62500;
|
89 |
|
90 | //TIMSK = (1 << OCIE1A) | (1 << TOIE0);
|
91 | TIMSK = (1 << TOIE0);
|
92 |
|
93 | uart_init( UART_BAUD_SELECT(UART_BAUD_RATE,F_CPU) );
|
94 | uart_puts("Starting\r\n");
|
95 | }
|
96 |
|
97 | int main(void)
|
98 | {
|
99 | init();
|
100 | sei();
|
101 |
|
102 | OUT_DDR |= ((1 << OUT_RELAIS) | (1 << TEST_BLINC) | (1 << TEST_POWER) | (1 << TEST_SWITCH_LED) | (1 << TEST_LED2));
|
103 | OUT_DDR |= ((1 << OUT_RELAIS) | (1 << TEST_BLINC) | (1 << TEST_POWER) | (1 << TEST_SWITCH_LED));
|
104 | //OUT_DDR &= ~((1 << TEST_BTN) | (1 << TEST_BTN2));
|
105 | //PORTD |= ((1 << TEST_BTN) | (1 << TEST_BTN2));
|
106 |
|
107 | BTN_DDR &= ~((1 << BTN_START) | (1 << BTN_STOP) | (1 << BTN_SECOND_UP) | (1 << BTN_SECOND_DOWN) | (1 << BTN_MINUTE_UP) | (1 << BTN_MINUTE_DOWN));
|
108 | BTN_PORT |= ((1 << BTN_START) | (1 << BTN_STOP) | (1 << BTN_SECOND_UP) | (1 << BTN_SECOND_DOWN) | (1 << BTN_MINUTE_UP) | (1 << BTN_MINUTE_DOWN));
|
109 |
|
110 | PORTD |= ((1 << TEST_POWER));
|
111 |
|
112 | while(1)
|
113 | {
|
114 | if (debounce(PINB, BTN_MINUTE_DOWN))
|
115 | {
|
116 | uart_puts("MIN_DOWN\r\n");
|
117 | }
|
118 |
|
119 | if (debounce(PINB, BTN_MINUTE_UP))
|
120 | {
|
121 | uart_puts("MIN_UP\r\n");
|
122 | }
|
123 |
|
124 | if (debounce(PINB, BTN_SECOND_DOWN))
|
125 | {
|
126 | uart_puts("SECOND_DOWN\r\n");
|
127 | }
|
128 |
|
129 | if (debounce(PINB, BTN_SECOND_UP))
|
130 | {
|
131 | uart_puts("SECOND_UP\r\n");
|
132 | }
|
133 |
|
134 | if (debounce(PINB, BTN_START))
|
135 | {
|
136 | uart_puts("START\r\n");
|
137 | }
|
138 |
|
139 | if (debounce(PINB, BTN_STOP))
|
140 | {
|
141 | uart_puts("STOP\r\n");
|
142 | }
|
143 |
|
144 | }
|
145 | }
|