send.c


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
}