Code:
unsigned volatile char adresse, daten;
void twi_slave(void)
{
TWAR = 0x40;
TWRC = (1<<TWEA) | (1<<TWEN) | (1<<TWIE);
TWSR = 0;
};
ISR(TWI_vect)
{
daten = TWDR;
TWRC |= (1<<TWINT);
TWRC = (1<<TWEA) | (1<<TWEN) | (1<<TWSTO);
if (TWSR &0b11111000 == 0x80)
{
if (daten == 0x04)
{PORTB |= (1<<PORTB1);}
else
{PORTB &= ~(1<<PORTB1);}
}
TWRC |= 0b1000000;
};
int main(void)
{
sei();
twi_slave();
DDRB |= (1<<PORTB1);
PORTB &= ~(PORTB1);
while(1)
{}
}
Und mein Mastercode(Alles etwas unübersichtlich, und Beta):
Code:
#include <avr/io.h> // I/O Port definitions
#include <avr/interrupt.h> // Interrupt macros
#define F_CPU 16000000UL //CPU Tackt
unsigned volatile char daten, error;
uint8_t adresse;
void twi_init(void);
int twi_senden(uint8_t adresse, char daten);
int main(void)
{
twi_init();
adresse = 0x40;
daten = 0x04;
while(1)
{
twi_senden(adresse, daten);
};
}
void twi_init(void)
{
DDRC &= !((1<<DD0) | (DD1));
PORTC = (1<<DD0) | (1<<DD1);
TWSR = 0x00; //Prescaler
TWBR = 12; //TWI 400khz
};
int twi_senden(uint8_t adresse, char daten)
{
TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN); //TWI aktivieren und Start condition auslösen
while(!(TWCR & (1<<TWINT))); //Warten auf Start condition
if((TWSR & 0xF8) != 0x08) return 0;
TWDR = adresse & (0xFE); //Adresse mit Schreibbit(xxxxxxx0) in Register
TWCR = (1<<TWINT) | (1<<TWEN); //senden
if((TWSR & 0xF8) != 0x18) return 0;
while(!(TWCR & (1<<TWINT))); //warten auf ACK oder NACK
TWDR = daten; //Byte in Datenregister laden
TWCR = (1<<TWINT) | (1<<TWEN); //senden
while (!(TWCR & (1<<TWINT))); //warten auf ACK oder NACK
if ((TWSR & 0xF8) != 0x28) return 0;
TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO); //STOP Conditions auslösen
return 1;
};
Lesezeichen