Hi Leuts,
hab ein neues Problem mit meinem TWI!
An dem einen Board(Master) hängt ne LED an PB0 und ein GP2D12 an PA0 an dem anderen nur eine LED an PB0. Der Master wertet den Sensor aus und schickt je nach dem 0x02 oder 0x03 an den Slave! ADC Wert hab ich einzelnd schon getestet an dem liegt's wahrscheinlich net!

So Master Code:
Code:

#include <avr/io.h> 
#include <avr/interrupt.h> 
#include <avr/signal.h> 

#define ADCchannel_init   DDRA=0x00                 // ADC Port als Eingang deklarieren
#define ADCinit           ADCSRA|=_BV(ADEN)         // Teilt dem Board mit das der jeweilige Port für ADC verwendet wird
#define ADCdisable        ADCSRA &=~_BV(ADEN)       // machs das vorherige wieder rückgänig
#define ADCstart          ADCSRA|=_BV(ADSC)         // startet eine konvertierung auf dem gewünschten Kannal/Pin
#define ADCfree           ADCSRA|=_BV(ADATE)        // schaltet den freilaufenden Modus ein
#define ADCvintern        ADMUX|=_BV(REFS0)     // interne Spannungsversorgung
#define ADCinterrupt_on   ADCSRA|=_BV(ADIE)                // ADC interrupt wird freigeschalten
#define ADCprescaler_2    ADCSRA |=_BV(ADPS0)              // gewünschter Teilungsfaktor/Prescaler 
#define ADCprescaler_4    ADCSRA|=_BV(ADPS1)
#define ADCprescaler_8    ADCSRA=_BV(ADPS1) | _BV(ADPS0)
#define ADCprescaler_16   ADCSRA|=_BV(ADPS2)
#define ADCprescaler_32   ADCSRA=_BV(ADPS2) | _BV(ADPS0)
#define ADCprescaler_64   ADCSRA=_BV(ADPS2) | _BV(ADPS1)
#define ADCprescaler_128  ADCSRA=_BV(ADPS2) | _BV(ADPS1) | _BV(ADPS0)
#define ADCprescaler_reset ADCSRA = ~_BV(ADPS2) & ~_BV(ADPS1) & ~_BV(ADPS0)        
#define ADCchannel_1                                      //gewünschter Kannal z.B bei ATmega32 PINA0 - PINA7
#define ADCchannel_2      ADMUX|=_BV(MUX0)                // bei nicht freilaufen muss ADCchannel_x vor
#define ADCchannel_3      ADMUX|=_BV(MUX1)                // ADCstart kommen dann kann man mit getadc() der 
#define ADCchannel_4      ADMUX= _BV(MUX1) | _BV(MUX0)    // Adcwert des gewählten Kannals auslesen
#define ADCchannel_5      ADMUX|=_BV(MUX2)
#define ADCchannel_6      ADMUX= _BV(MUX2) | _BV(MUX0)
#define ADCchannel_7      ADMUX= _BV(MUX2) | _BV(MUX1)
#define ADCchannel_8      ADMUX= _BV(MUX2) | _BV(MUX1) | _BV(MUX0)
#define ADCchannel_reset  ADMUX= ~_BV(MUX2) & ~_BV(MUX1) & ~_BV(MUX0)


unsigned volatile char slave_adresse, daten, error; 
unsigned volatile int adc_wert;

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

int main(void) 
   { 
   DDRB = 0xFF;
   DDRA = 0x00;
   PORTA = 0xFF;
   TWAR = 0x01; 
   TWBR = 0xC; 
   slave_adresse = 0x02; 
   daten = 0x03; 
   ADCinit;
   ADCprescaler_16;
   for(;;) 
      {
	  ADCchannel_1;
	  ADCstart;
	  adc_wert = getadc();
	  if (adc_wert>204)
	  {
	  PORTB = (1<<PB0);
	  daten = 0x03;
	  }
	  else
	  {
	  PORTB &= ~(1<<PB0);
	  daten = 0x02;
	  }
      twi_start(); 
      twi_adresse(); 
      twi_daten(); 
      twi_stop();  
      } 
   } 
    
    
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); 
   } 
   

int getadc(void)
{
   while (ADCSRA & _BV(ADSC)) {}
   return ADC;
}
und Slave:
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)|(1<<TWIE); 
   TWSR &= 0b11111100; 
   TWCR |= (1<<TWINT); 
   for(;;) 
      { 
      if(daten == 0x03) 
         { 
         PORTB = (1<<PB0); 
         } 
      else 
         { 
         PORTB &= ~(1<<PB0); 
         } 
      } 
   } 
    
SIGNAL (SIG_2WIRE_SERIAL) 
   { 
   if((TWSR & 0b11111000) == 0x80) 
      { 
      daten = TWDR; 
      } 
   else 
      { 
      daten = 0x00; 
      } 
   TWCR |= (1<<TWINT); 
   }
bitte helft mir! sagt mir jeden Fehler den ihr findet! Ich bedanke mich schon im Vorraus!
Gruß Michi