PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : I2C Bus mit 2xAtmega16



walterk
10.04.2010, 14:39
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:


#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:


#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);
}
}