1 | #include <avr/io.h>
|
2 | #include <avr/interrupt.h>
|
3 |
|
4 | ISR(SIG_USART_RECV);
|
5 | void error(void);
|
6 |
|
7 | int main(void)
|
8 | {
|
9 | MCUCSR |= (1<<JTD);
|
10 | MCUCSR |= (1<<JTD);
|
11 |
|
12 | UBRRH = 0; // Datenrate
|
13 | UBRRL = 0x67; // 9600 Baud
|
14 | UCSRC = (1<<URSEL) | (3<<UCSZ0); // 1 Stop 0 Parity 8 Data
|
15 | UCSRB = (1<<TXEN) | (1<<RXCIE); // UART TX enable, RX Interrupt
|
16 |
|
17 | DDRA = (1<<PA0); // Drill_on
|
18 | DDRB = 0;
|
19 | DDRC = (1<<PC2)|(1<<PC3); // LED0, LED1
|
20 | DDRD = (1<<PD1); // TXD
|
21 |
|
22 | TWBR = 0x80; // TWI Baudrate ca. 2kHz
|
23 | TWCR = (1<<TWEN); // TWI enable
|
24 | TWSR = (1<<TWPS1)|(1<<TWPS0); // prescaler 64
|
25 |
|
26 | UCSRB |= (1<<RXEN); // UART RX enable
|
27 | sei();
|
28 |
|
29 | while(1){} // Hauptprog. Endlosschleife
|
30 | return 0;
|
31 | }
|
32 |
|
33 | void error(void)
|
34 | {
|
35 | DDRD |= (1<<PD3); // Fault LED an
|
36 | UDR = TWSR; // Status an PC senden ("Debug")
|
37 | }
|
38 |
|
39 | ISR(SIG_USART_RECV)
|
40 | {
|
41 | uint8_t data;
|
42 | data = UDR;
|
43 |
|
44 | TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN); // Start condition
|
45 | while(!(TWCR&(1<<TWINT))); // Wait for start sent
|
46 | if((TWSR & 0xf8) != 0x08) error(); // bei TWI Fehler
|
47 |
|
48 | TWDR = 0x40; // slave Adress
|
49 | TWCR = (1<<TWINT)|(1<<TWEN); // start adr transmission
|
50 | while(!(TWCR&(1<<TWINT))); // Wait for adr sent
|
51 | if((TWSR & 0xf8) != 0x18) error(); // bei TWI Fehler
|
52 |
|
53 | TWDR = data; // Daten
|
54 | TWCR = (1<<TWINT)|(1<<TWEN); // start transmission
|
55 | while(!(TWCR&(1<<TWINT))); // Wait for data sent
|
56 | if((TWSR & 0xf8) != 0x28) error(); // bei TWI Fehler
|
57 |
|
58 | TWCR = (1<<TWINT)|(1<<TWSTO)|(1<<TWEN); // STOP
|
59 | }
|