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:
master: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; } } }
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); } }
Lesezeichen