Hi Leutz,
ich hab da ein Problem mit der TWI Kommunikation!
Meine 2 Atmega32 sind über 2 Kabel verbunden(SDA - SDA / SCL -SCL)
diese jeweils über nen 10KOhm zu VCC. Desweiteren hängt an jedem der µC an PortB 0 eine LED + Widerstand gegen GND.
Hier der Mastercode:
Code:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>

unsigned volatile char slave_adresse, daten, error;

int twi_start(void);
int twi_adresse(void);
int twi_daten(void);
void twi_stop(void);

int main(void)
	{
	DDRB = 0x00;
	TWAR = 0x01;
	TWBR = 0xC;
	slave_adresse = 0x02;
	daten = 0x03;
	for(;;)
		{
		error = twi_start();
		error = twi_adresse();
		error = twi_daten();
		if(error == 1)
			{
			PORTB = (1<<PB0);
			}
		else
			{
			PORTB &= ~(1<<PB0);
			}
		}
	}
	
	
int twi_start(void)
	{
	TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
	while (!(TWCR & (1<<TWINT)));
	if ((TWSR & 0xF8) == 0x08)
		{
		return 0;
		}
	else
		{
		return 1;
		}
	}
	
int twi_adresse(void)
	{
	TWDR = slave_adresse;
	TWCR = (1<<TWINT)|(1<<TWEN);
	while(!(TWCR & (1<<TWINT)));
	if ((TWSR & 0xF8) == 0x18)
		{
		return 0;
		}
	else
		{
		return 1;
		}		
	}
	
int twi_daten(void)
	{
	TWDR = daten;
	TWCR = (1<<TWINT)|(1<<TWEN);
	while(!(TWCR & (1<<TWINT)))
	if ((TWSR & 0xF8) == 0x28)
		{
		return 0;
		}
	else
		{
		return 1;
		}		
	}
	
void twi_stop(void)
	{
	TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO);
	}
und hier der Slavecode:
Code:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>

unsigned volatile char slave_adresse, daten;


int main(void)
	{
	sei();
	DDRB = 0xFF;
	PORTB &= ~(1<<PB0);
	TWAR = 0x02;
	TWBR = 0xC;
	TWCR = (1<<TWEA)|(1<<TWEN);
	TWSR &= 0b11111100;
	for(;;)
		{
		if(daten == 0x03)
			{
			PORTB = (1<<PB0);
			}
		else
			{
			PORTB &= ~(1<<PB0);
			}
		}
	}
	
SIGNAL (SIG_2WIRE_SERIAL)
	{
	if((TWSR & 0b11111000) == 0x80)
		{
		daten = TWDR;
		}
	TWCR |= (1<<TWINT);
	}
ich hoffe jemand blickt den Code und kann mir helfen! Helft mir!
Gruß Michi