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







Zitieren

Lesezeichen