Subversion Repositories BL-Ctrl

Rev

Rev 2 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1 ingob 1
/*############################################################################
2
Slaveadr = 0x52 = Vorne, 0x54 = Hinten, 0x56 = Rechts, 0x58 = Links
3
############################################################################*/
4
 
5
#include <avr/io.h>
6
#include <util/twi.h>
7
#include "main.h"
8
 
9
unsigned char I2C_RXBuffer;
10
unsigned char Byte_Counter=0;
11
 
12
//############################################################################
13
//I2C (TWI) Interface Init
14
void InitIC2_Slave(uint8_t adr)
15
//############################################################################
16
{
17
    TWAR = adr + (2*MOTORADRESSE); // Eigene Adresse setzen 
18
    TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWIE) | (1<<TWEA);
19
}
20
 
21
//############################################################################
22
//ISR, die bei einem Ereignis auf dem Bus ausgelöst wird. Im Register TWSR befindet
23
//sich dann ein Statuscode, anhand dessen die Situation festgestellt werden kann.
24
ISR (TWI_vect)
25
//############################################################################
26
{  
27
    switch (TWSR & 0xF8)
28
        {  
29
        case SR_SLA_ACK:  
30
            TWCR |= (1<<TWINT);
31
            Byte_Counter=0;
32
            return;
33
        // Daten Empfangen
34
        case SR_PREV_ACK:
35
            I2C_RXBuffer = TWDR;
36
            I2C_Timeout = 500;
37
            TWCR |= (1<<TWINT);
38
            return;
39
        // Daten Senden
40
        case SW_SLA_ACK:  
41
            if (Byte_Counter==0)
42
                {
43
                TWDR = Mittelstrom;
44
                Byte_Counter++;
45
                }
46
            else
47
                {
48
                TWDR = MaxPWM;
49
                }
50
            TWCR |= (1<<TWINT);
51
            return;
52
        // Daten Senden
53
        case SW_DATA_ACK:
54
            if (Byte_Counter==0)
55
                {
56
                TWDR = Mittelstrom;
57
                Byte_Counter++;
58
                }
59
            else
60
                {
61
                TWDR = MaxPWM;
62
                }
63
            TWCR |= (1<<TWINT);
64
            return;
65
        // Bus-Fehler zurücksetzen
66
        case TWI_BUS_ERR_2:
67
            TWCR |=(1<<TWSTO) | (1<<TWINT);
68
        // Bus-Fehler zurücksetzen   
69
        case TWI_BUS_ERR_1:
70
            TWCR |=(1<<TWSTO) | (1<<TWINT);
71
        }
72
    TWCR =(1<<TWEA) | (1<<TWINT) | (1<<TWEN) | (1<<TWIE); // TWI Reset
73
}
74
 
75