1 | #include <avr/io.h>
|
2 | #include <avr/interrupt.h>
|
3 | #include <stdint.h>
|
4 |
|
5 |
|
6 | #define F_CPU 3686411UL // processor clock frequency
|
7 |
|
8 | #include <util/delay.h>
|
9 | #define USART_BAUDRATE 19200UL
|
10 | #define BAUD_PRESCALE (((F_CPU / (USART_BAUDRATE * 16UL))) - 1)
|
11 |
|
12 |
|
13 |
|
14 |
|
15 |
|
16 | #define debounce( port, pin ) \
|
17 | ({ \
|
18 | static uint8_t flag = 0; /* new variable on every macro usage */ \
|
19 | uint8_t i = 0; \
|
20 | \
|
21 | if( flag ){ /* check for key release: */ \
|
22 | for(;;){ /* loop ... */ \
|
23 | if( !(port & 1<<pin) ){ /* ... until key pressed or ... */ \
|
24 | i = 0; /* 0 = bounce */ \
|
25 | break; \
|
26 | } \
|
27 | _delay_us( 98 ); /* * 256 = 25ms */ \
|
28 | if( --i == 0 ){ /* ... until key >25ms released */ \
|
29 | flag = 0; /* clear press flag */ \
|
30 | i = 0; /* 0 = key release debounced */ \
|
31 | break; \
|
32 | } \
|
33 | } \
|
34 | }else{ /* else check for key press: */ \
|
35 | for(;;){ /* loop ... */ \
|
36 | if( (port & 1<<pin) ){ /* ... until key released or ... */ \
|
37 | i = 0; /* 0 = bounce */ \
|
38 | break; \
|
39 | } \
|
40 | _delay_us( 98 ); /* * 256 = 25ms */ \
|
41 | if( --i == 0 ){ /* ... until key >25ms pressed */ \
|
42 | flag = 1; /* set press flag */ \
|
43 | i = 1; /* 1 = key press debounced */ \
|
44 | break; \
|
45 | } \
|
46 | } \
|
47 | } \
|
48 | i; /* return value of Macro */ \
|
49 | })
|
50 |
|
51 |
|
52 |
|
53 | //############################################################################
|
54 | //Routine für die Serielle Ausgabe
|
55 | int uart_putchar (char c){
|
56 | if (c == '\n')
|
57 | uart_putchar('\r');
|
58 | //Warten solange bis Zeichen gesendet wurde
|
59 | while(!(UCSRA & (1<<UDRE)));
|
60 | //Ausgabe des Zeichens
|
61 | UDR = c;
|
62 | return (0);
|
63 | };
|
64 | //############################################################################
|
65 | //Routine für die Serielle Ausgabe
|
66 | int uart_getchar (void){
|
67 | while(!(UCSRA & (1<<RXC)));
|
68 | return(UDR);
|
69 | };
|
70 | //############################################################################
|
71 |
|
72 |
|
73 |
|
74 |
|
75 |
|
76 | void uart_send_char(uint8_t byte) {
|
77 | while ((UCSRA & (1 << UDRE)) == 0);
|
78 | UDR = byte;
|
79 | }
|
80 |
|
81 |
|
82 | void uart_send_string(char * str) {
|
83 | while (*str) { // keep going until NULL terminator found
|
84 | uart_send_char(*str++);
|
85 | }
|
86 | }
|
87 |
|
88 |
|
89 | void long_delay(uint16_t ms) {
|
90 | for(; ms>0; ms--) _delay_ms(1);
|
91 | }
|
92 |
|
93 | int main (void)
|
94 | {
|
95 | UCSRB |= (1 << RXEN) | (1 << TXEN); // Turn on the transmission and reception circuitry
|
96 | UCSRC |= (1 << URSEL) | (1 << UCSZ0) | (1 << UCSZ1); // Use 8-bit character sizes
|
97 |
|
98 | UBRRL = BAUD_PRESCALE; // Load lower 8-bits of the baud rate value into the low byte of the UBRR register
|
99 | UBRRH = (BAUD_PRESCALE >> 8); // Load upper 8-bits of the baud rate value into the high byte of the UBRR register
|
100 |
|
101 | UCSRB |= (1 << RXCIE); // Enable the USART Recieve Complete interrupt (USART_RXC)
|
102 | sei(); // Enable the Global Interrupt Enable flag so that interrupts can be processed
|
103 |
|
104 | DDRB = 0x0F; // PC0..PC7 as output
|
105 |
|
106 | PORTB = 0x00; // all PORTC output pins Off
|
107 |
|
108 |
|
109 | //DDRA = 0x00; //all A port pins as input
|
110 | DDRD = 0b11100000;
|
111 |
|
112 | PORTD=(1<<PD5)|(1<<PD6)|(1<<PD7); //Enable internal Pull-Up resistors
|
113 |
|
114 | fdevopen (uart_putchar, uart_getchar);
|
115 |
|
116 |
|
117 | for (;;) // Loop forever
|
118 | {
|
119 | if( debounce( PIND, PD7 ) )
|
120 | {
|
121 | PORTB = PORTB ^ (1 << PB0);
|
122 |
|
123 | uart_send_string("ATA");
|
124 | long_delay(500);
|
125 | UDR = 0x0D;
|
126 | }
|
127 |
|
128 | //printf("ATA\r\n");
|
129 | //long_delay(1000); // Eine Sekunde warten...
|
130 | // Do nothing - echoing is handled by the ISR instead of in the main loop
|
131 |
|
132 | }
|
133 |
|
134 | }
|
135 |
|
136 | ISR(USART_RXC_vect)
|
137 | {
|
138 | char ReceivedByte;
|
139 | ReceivedByte = UDR; // Fetch the recieved byte value into the variable "ByteReceived"
|
140 | // UDR = ReceivedByte; // Echo back the received byte back to the computer
|
141 | // UDR='S';
|
142 | }
|