Subversion Repositories BL-Ctrl

Rev

Go to most recent revision | Details | 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
{
24 ingob 17
    TWAR = adr + (2*MotorAdresse); // Eigene Adresse setzen 
1 ingob 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:
89 hbuss 35
                        GRN_OFF;
1 ingob 36
            I2C_RXBuffer = TWDR;
37
            I2C_Timeout = 500;
38
            TWCR |= (1<<TWINT);
89 hbuss 39
                        GRN_ON;
1 ingob 40
            return;
41
        // Daten Senden
42
        case SW_SLA_ACK:  
43
            if (Byte_Counter==0)
44
                {
45
                TWDR = Mittelstrom;
46
                Byte_Counter++;
47
                }
48
            else
49
                {
50
                TWDR = MaxPWM;
51
                }
52
            TWCR |= (1<<TWINT);
53
            return;
54
        // Daten Senden
55
        case SW_DATA_ACK:
56
            if (Byte_Counter==0)
57
                {
58
                TWDR = Mittelstrom;
59
                Byte_Counter++;
60
                }
61
            else
62
                {
63
                TWDR = MaxPWM;
64
                }
65
            TWCR |= (1<<TWINT);
66
            return;
67
        // Bus-Fehler zurücksetzen
68
        case TWI_BUS_ERR_2:
69
            TWCR |=(1<<TWSTO) | (1<<TWINT);
70
        // Bus-Fehler zurücksetzen   
71
        case TWI_BUS_ERR_1:
72
            TWCR |=(1<<TWSTO) | (1<<TWINT);
73
        }
74
    TWCR =(1<<TWEA) | (1<<TWINT) | (1<<TWEN) | (1<<TWIE); // TWI Reset
75
}
76
 
77