Hab ich schon mehrmals getan, aber zwischen der grauen Theorie und dem eigentlich programmieren liegen für mich dann doch schon Welten....aber ich versuch mich durchzubeißen.

Hier jetzt der I2Ccode für den Master:
Code:
#include "i2cbus.h"


void i2c_send_init (void)
{
	/*setting for 10Mhz and SCL 100kHz -> TWBR factor = 42
	SCL = CPU/(16+2*TWBR*4)*/
	TWBR = 0x2A;
}

void i2c_receive_init (void){
	/*Hier wird der Empfang für den Atmega als Slave deklariert. DAzu muss TWAR gesetzt werden*/
	TWAR = 0x02; //Adresse des Slaves ist 0x02
	
	//Dazu muss noch TWEN gesetzt werden, um TWI zu erlaubgen
	TWCR = (1<<TWEA)|(1<<TWEN);
}

unsigned char i2c_send_start (void)
{
	/*writing a one to TWINT clears it, TWSTA=Start, TWEN=TWI-enable*/
	TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN);
	/*wait, until start condition has been sent --> ACK*/
	while (!(TWCR & (1<<TWINT)));
	return TWSR;
}


void i2c_send_stop (void)
{
	/*writing a one to TWINT clears it, TWSTO=Stop, TWEN=TWI-enable*/
	TWCR = (1<<TWINT) | (1<<TWSTO) | (1<<TWEN);	
}


unsigned char i2c_send_add_rw (unsigned char address, unsigned char rw)
{
	/*address can be 0 .. 3; rw=0 --> write, rw=1 --> read*/
	unsigned char addr_byte = 0;
	/*shift address one bit left*/
	addr_byte = address << 1;
	/*set RW-Bit, if necessary*/
	addr_byte |= rw;
	/*0b10100xxx --> address of EEPROM*/
	addr_byte |= 0xA0;
	/*TWDR contains byte to send*/
	TWDR = addr_byte;
	/*send content of TWDR*/
	TWCR = (1<<TWINT) | (1<<TWEN);
	
	/*wait, until address has been sent --> ACK*/
	while (!(TWCR & (1<<TWINT)));
	
	return TWSR;
}


unsigned char i2c_send_byte (unsigned char byte)
{
	/*TWDR contains byte to send*/
	TWDR = byte;
	/*send content of TWDR*/
	TWCR = (1<<TWINT) | (1<<TWEN);
	
	/*wait, until byte has been sent --> ACK*/
	while (!(TWCR & (1<<TWINT)));
	
	return TWSR;
}


unsigned char i2c_read_byte (void)
{
	/*send content of TWDR; TWEA = enable ACK*/
	TWCR = (1<<TWINT) | (1<<TWEA) | (1<<TWEN);
	/*wait, until byte has been received --> ACK*/
	while (!(TWCR & (1<<TWINT)));
	return TWDR;
}

void i2c_send (unsigned char deviceadd, unsigned char value)
{
	/*initialization*/
	i2c_send_init ();
	PORTB |= (1<<PB1);
	/*start condition*/
	i2c_send_start ();

	/*send device address an R/W*/
	i2c_send_add_rw (deviceadd, 0);
	
	i2c_send_byte (value);

	/*send stop condition*/
	i2c_send_stop ();
	PORTB |= (1<<PB2);
}

unsigned char i2c_receive (void)
{
	unsigned char value = 0;
	/*initialization*/
	i2c_receive_init ();

	value = i2c_read_byte ();

	return value;
}
das ganze wird dann aufgerufen über
Code:
#include <avr/io.h>
#include <avr/interrupt.h>
#include "i2c/i2cbus.h"
#include <compat/twi.h>




void main(void){
	DDRD = 0x00; //PORTD als Eingang
	PORTD = 0xFF; // Pull-Up Widerstände an Port D aktiviert -> Schalter als Active-Low ausführen
	
	unsigned char goal1 = 23;
	timer_init();
	
	
	for(;;){

		if (!(PIND & (1 << PD7))){
			
			goal1++;
			i2c_send(0x02, goal1);
		}

		
	}
}
//end of bedienfeld.c