hier der Code aus TWI.h:
Code:
#ifndef TWI_H
#define TWI_H

#include <avr/io.h>
#include <stdint.h>

#define SEND 0
#define READ 1

void TWI_init(uint8_t);
uint8_t TWI_start(uint8_t);
void TWI_sendbyte(uint8_t);
uint8_t TWI_readbyte(void);
void TWI_stop(void);

#endif
TWI.c
Code:
#include "TWI.h"


/*  TWI initialisieren  */

void TWI_init(uint8_t ownaddr)
{
	TWAR = ownaddr;
	TWSR &= 0xFC;
	TWBR = 0x0;
}


/*  Start und Slaveaddresse senden  */

uint8_t TWI_start(uint8_t ndevaddr)
{
 	TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN);
	while(!(TWCR & (1<<TWINT)));
 	TWDR = ndevaddr;
	TWCR = (1<<TWINT) | (1<<TWEN);
	while(!(TWCR & (1<<TWINT)));
}


/*  Byte senden  */

void TWI_sendbyte(uint8_t nbyte)
{
	TWDR = nbyte;
	TWCR = (1<<TWINT) | (1<<TWEN);
	while(!(TWCR & (1<<TWINT)));
}


/*  Byte lesen  */

uint8_t TWI_readbyte(void)
{
	TWCR |= (1<<TWINT) | (1<<TWEA);
	while(!(TWCR & (1<<TWINT)));

	return TWDR;
}


/*  Stop senden  */

void TWI_stop(void)
{
	TWCR = (1<<TWINT) | (1<<TWSTO) | (1<<TWEN);
}
sram.h
Code:
#ifndef SRAM_H
#define SRAM_H

#include <inttypes.h>
#include <avr/io.h>

#define 	WE_PIN 		0		//  WriteEnable
#define		WE_PORT		PORTB

#define		CS_PIN		2		//  ChipSelect
#define		CS_PORT		PORTB

#define		LE_PIN		3		//  LatchEnable
#define		LE_PORT		PORTB

#define		ADDR		PORTA		//  Addressport

void sram_write_byte(uint16_t, uint8_t);
uint8_t sram_read_byte(uint16_t);
void Latch(uint8_t);

#endif
sram.c
Code:
#include "sram.h"


/*  Byte in sram speichern  */
void sram_write_byte(uint16_t address, uint8_t data)
{
/*  Addresse anlegen  */
	Latch(address & 0x00FF);
	ADDR = ((address & 0xFF00) >> 8);

/*  Byte anlegen  */
	DDRC |= 0xFC;
	DDRD |= 0x30;
	PORTC = (data & 0xFC);

	PORTD &= ~0x30;
	PORTD |= ((data<<4) & 0x30);

/*  Byte speichern  */
	WE_PORT &= ~(1<<WE_PIN);
	delay(2);
	WE_PORT |= (1<<WE_PIN);
}


/*  Byte aus sram lesen  */
uint8_t sram_read_byte(uint16_t address)
{

/*  Addresse anlegen  */
	Latch(address & 0x00FF);
	ADDR = ((address & 0xFF00) >> 8);

/*  Byte lesen und zurückgeben  */
	DDRC = 0x0;
	DDRD &= ~0x30;
	delay(2);
	return ((PINC & 0xFC) | ((PIND & 0x30)>>4)); 
}

void Latch(uint8_t wert)
{
	ADDR = wert;
	LE_PORT |= (1<<LE_PIN);
	delay(2);
	LE_PORT &= ~(1<<LE_PIN);
}
der Code zum Ansteuern des sram sieht ein wenig komisch aus, weil ich keinen freien Port mehr für die Daten übrig hatte, so habe ich 6Pins vom PortC und 2 Pins vom PortD verwendet, was das ganze komplizierter macht

da ist dies bestimmt auch drin: sram_write_byte(counter, TWI_readbyte());
ja, das wirst du auch finden, aber es erklärt sich doch von fast selbst: es wird eine Funktion namens sram_write_byte aufgerufen, die ein Byte in den sram schreibt, als Argumente gibts einmal eins vom Typ uint16_t, was die Addresse im Ram sein wird und einen 8 Bit-Wert, in dem die Daten stehen