Hallo Forum,

von einemAtmega16 möchte ich mit I2C Bus ein hartcodiertes Bitmuster auf einen anderen Atmega16 senden und mit LED auf PortB anzeigen lassen.

Die Hardware des Slave ist ein RN-Control, am PortB stecken mit Flachbandkabel 8 x (LED + 470 Ohm) zur Anzeige des empfangenen Bitmusters.
Die Hardware des Masters ist ein selbstgelötetes Brett mit LEDs und Schaltern, welches sich bereits vor Wochen als funktionstüchtig erwiesen hat.

Beide Controller laufen mit dem internen 1 Mhz Takt.

In der Software des Masters als auch in der des Slaves ist gekennzeichnet, bis wohin das Programm ausgeführt wird. VERHART HIER ist durch Versuchte mit LED-Ausgabe ermittelt und ist die einzige Änderung der Originalprogramme, AVR-Studio 4.18.

Das Datenblatt des Atmega16 und das Tutorial TWI auf RN-Wissen habe ich durchgelesen.

Welche Fehler habe stecken in den Programmen?
Hat vielleicht jemand ein „Hallo Welt“-Programm zum weiterlernen?

Danke für die Antworten.

slave:
Code:
#include <avr/io.h>
#define F_CPU        1000000UL
#include <util/delay.h>
#include <stdlib.h>
#include <avr/interrupt.h>




int main(void) {

DDRB = 0xff;

//Einschaltkontrolle  VERHARRT HIER slave
PORTB = ~192;
_delay_ms(1000);

char add = 10;

while(1){

    //Adresse
    TWAR = add;

    //Receive Start
    TWCR = (1<<TWEA)|(1<<TWEN);

             

    TWCR = (1<<TWINT) | (1<<TWEN);
    while (!(TWCR & (1<<TWINT))){};
                                      
    //Daten übertragen

        PORTB = TWDR;
        TWCR = (1<<TWINT) | (1<<TWEN);

        while (!(TWCR & (1<<TWINT))){};  
        if ((TWSR & 0xF8) != 0x60) {  //0x60: Own SLA+W has been received; ACK has been returned
            //Fehler
			PORTB = 0x0f;
        
    }


}
}
master:
Code:
#include <avr/io.h>
#define F_CPU        1000000UL
#include <util/delay.h>
#include <stdlib.h>
#include <avr/interrupt.h>



int main(void) {



//Einschaltkontrolle
DDRC |= 0xf0;
PORTC = ~192;
_delay_ms(1000);

unsigned char add = 10;

while(1){


    //Send Start
    TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
    while (!(TWCR & (1<<TWINT))) {}
             
    //Adresse übertragen
    TWDR = add;
    TWCR = (1<<TWINT) | (1<<TWEN);
    while (!(TWCR & (1<<TWINT))){};
                                      
    //Daten übertragen: n-Bytes werden aus Array entnommen

        TWDR = 0b00111100;
        TWCR = (1<<TWINT) | (1<<TWEN);

        while (!(TWCR & (1<<TWINT))){};  
        if ((TWSR & 0xF8) != 0x28) {  //0x28: Data byte has been transmitted, ACK has been received
            //Fehler
			PORTC = ~128; // VERHARRT HIER master     
    }

    //Stop-Bedingung senden
    TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO);
}
}