Ups sorry, die ISR muss wohl beim "copy pasten" unter den Tisch gefallen sein. Hier nochmal dem komplette Code Problem wie beschrieben
Code:
#include <avr/interrupt.h>
#include <avr/signal.h>
#include <compat/twi.h>
#include <avr/io.h>
#include <compat/twi.h>
#define F_CPU 16000000
volatile uint8_t rxbuffer[8];
#define rx_PWM_L 2
#define rx_PWM_R 3
#define rx_DIR 1
volatile uint8_t txbuffer[8]
void init_twi_slave (uint8_t adr)
{
TWAR= adr; //Adresse setzen
TWCR|= (1<<TWEA) | (1<<TWEN)|(1<<TWIE);
TWCR &= ~(1<<TWSTA)|(1<<TWSTO);
buffer_adr=0xFF;
sei();
}
int main(void) {
/*******************************************************************************************************************/
/* Initialisierung */
/*******************************************************************************************************************/
//*** Alle Ports an PortD als Ausgang definieren
DDRB = 0xFF;
PORTB = 0x00;
DDRD = 0xFF;
PORTD = 0x00;
DDRC = 0xFF;
PORTC= 0x00;
PORTC &= ~(1<<DDC1);
init_twi_slave(0x60); // Init I2C interface
Delay(1000);
// Diode einmal anblicken ob sie funktioniert
PORTC |= (1<<DDC1);
Delay(400);
PORTC &= ~(1<<DDC1);
Delay(400);
rxbuffer[0]=0;
for(;;){
if (rxbuffer[0]!= 0){
PORTC |= (1<<DDC1);
Delay(2000);
}
}
ISR (TWI_vect) { //ISR, die bei einem Ereignis auf dem Bus ausgelöst wird. Im Register TWSR befindet sich dann
//ein Statuscode, anhand dessen die Situation festgestellt werden kann.
uint8_t data=0;
switch (TWSR) //TWI-Statusregister prüfen und nötige Aktion bestimmen
{
case TW_SR_SLA_ACK: // 0x60 Slave Receiver, wurde adressiert
TWCR = (1<<TWEN)| // TWI Interface enabled
(1<<TWIE)|(1<<TWINT)| // Enable TWI Interupt and clear the flag to send byte
(1<<TWEA)|(0<<TWSTA)|(0<<TWSTO)| // Expect ACK on this transmission
(0<<TWWC); //
buffer_adr=0xFF; //Bufferposition ist undefiniert
break;
case TW_SR_DATA_ACK: // 0x80 Slave Receiver,Daten empfangen
data=TWDR;
if (buffer_adr == 0xFF) //erster Zugriff, Bufferposition setzen
{
buffer_adr= data; //Bufferposition wie adressiert setzen
TWCR = (1<<TWEN)| // TWI Interface enabled
(1<<TWIE)|(1<<TWINT)| // Enable TWI Interupt and clear the flag to send byte
(1<<TWEA)|(0<<TWSTA)|(0<<TWSTO)| // Send ACK after next reception
(0<<TWWC);
}
else //weiterer Zugriff, Daten empfangen
{
rxbuffer[buffer_adr]=data; //Daten in Buffer schreiben
buffer_adr++; //autoincrement Buffer-Adresse
if(buffer_adr<7)
{
//nächstes Byte lesen, ACK danach
TWCR = (1<<TWEN)| // TWI Interface enabled
(1<<TWIE)|(1<<TWINT)| // Enable TWI Interupt and clear the flag to send byte
(1<<TWEA)|(0<<TWSTA)|(0<<TWSTO)| // Send ACK after next reception
(0<<TWWC);
}
else
{
//letztes Byte lesen, dann NACK
TWCR = (1<<TWEN)| // TWI Interface enabled
(1<<TWIE)|(1<<TWINT)| // Enable TWI Interupt and clear the flag to send byte
(0<<TWEA)|(0<<TWSTA)|(0<<TWSTO)|
(0<<TWWC);
}
}
break;
case TW_ST_SLA_ACK:
case TW_ST_DATA_ACK: //0xB0 weitere Daten gefordert
TWDR = txbuffer[buffer_adr];
buffer_adr++;
TWCR = (1<<TWEN)|
(1<<TWIE)|(1<<TWINT)|
(1<<TWEA)|(0<<TWSTA)|(0<<TWSTO)|
(0<<TWWC);
break;
case TW_ST_DATA_NACK: //0xC0 Keine Daten mehr gefordert
case TW_SR_DATA_NACK: //0x88
case TW_ST_LAST_DATA: //0xC8 Last data byte in TWDR has been transmitted (TWEA = “0”); ACK has been received
case TW_SR_STOP: // 0xA0 STOP empfangen
default:
TWCR = (1<<TWEN)|
(1<<TWIE)|(1<<TWINT)|
(1<<TWEA)|(0<<TWSTA)|(0<<TWSTO)|
(0<<TWWC);
//buffer_adr=0xFF; //Bufferposition ist undefiniert
break;
} //end.switch
} //end.twi_ISR
Lesezeichen