Guten Tag,

Ich bin zur Zeit dabei einen Atmega644(Master) mit einem Atmega8 (Slave) kommunizieren zu lassen.
Der Mastercode funktioniert soweit(glaube ich), auch die verbindung mit dem Slave funktioniert(Interupt wird aufgerufen).

Dort möchte ich einen bestimmten Wert den ich vom Master erhalte in einer Variable speichern.
Nur leider passiert nichts.
Ausschnitte aus meinem Slavecode:
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;	
};

Ivh versuche folgendes zu lösen
Ich habe 3 Variablen die ich durch den Master im Slave mit bestimmten Werten setzten möchte.
Mit TWI wird ja immer ein Byte gesendet soweit ich das verstanden habe.
Ich möchte aber einen wert von 1000-2000 (also 10Bit) übertragen.
Desweitern muss ich ja entscheiden welche Variable im Slave angepasst wird.


Hat jemand eine Idee wie man das lösen könnte?

Ich denke das auswählen der Variable läst sich mit switch lösen.
Sprich ich gebe jeder Variable eine Nummer und übermittle diese um zu bestimmen welche Variable gesetzt werden soll.
Nur wie übermittle ich den eigentlichen Wert, so das er auch in die richtige Variable geschrieben wird. Mit der zusätzlichen Schwierigkeit das der Wert grösser als 8Bit ist.

Ich bin für jede Hilfe sehr dankbar