Ein Byte vom Master an den Slave senden:
MASTER SLAVE ------ ----- START WARTEN ADRESSE und Schreibwunsch schreiben WARTEN WENN INTERRUPT-FLAG DANN AKTION WARTEN DATEN schreiben DATEN senden WARTEN DATENREGISTER auslesen STOP STOP
Code 0-1: Ein Byte vom Master an den Slave senden.
#include<avr/io.h> #include <util/twi.h> #include<avr/interrupt.h> #define TWIM_LESEN 1 #define TWIM_SCHREIBEN 0 int main() { uint8_t zahl = 0; uint8_t akku; DDRB |= 0b00001100; DDRB &= 0b11111100; sei(); cli(); //Initialisierung der Schnittstelle: //Übertragungsrate auf 23040Hz setzen (s.o.) TWBR = 48; TWSR = 1; while(true) { akku = PINB; //Taster 1: von Slave 1 Zahl lesen if( (akku & 0b00000001) > 0 ) { while( (akku & 0b00000001) > 0 ) akku = PINB; //Start TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN); //Warten while (!(TWCR & (1<<TWINT))); //Adresse und Modus (lesen oder schreiben) // TWDR = 1<<1 | TWIM_SCHREIBEN; //schreiben setzen und Adresse==1 auswählen TWDR = 2; //auslösen Adresse und Modus senden TWCR = (1<<TWINT) | (1<<TWEN); //Warten while (!(TWCR & (1<<TWINT))); //zu sendendes Byte eintragen. TWDR = zahl; //Daten senden auslösen TWCR = (1<<TWINT) | (1<<TWEN); //Warten while (!(TWCR & (1<<TWINT))); //STOP TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO); } //Taster 2: an Slave 2 Zahl senden if( (akku & 0b00000010) > 0 ) { while( (akku & 0b00000010) > 0 ) akku = PINB; zahl++; zahl%=4; } //Zahl anzeigen: (0 bis 3 möglich): if(zahl%2>0) PORTB |=0b00000100; else PORTB &=0b11111011; if((zahl/2)%2>0) PORTB |=0b00001000; else PORTB &=0b11110111; } }
Code 0-2: Quellcode Master
#include<avr/io.h> #include <util/twi.h> #include<avr/interrupt.h> #define TWIM_LESEN 1 #define TWIM_SCHREIBEN 0 int main() { uint8_t zahl = 0; DDRB |= 0b00001100; DDRB &= 0b11111100; sei(); cli(); //Initialisierung der Schnittstelle: //Übertragungsrate auf 23040Hz setzen (s.o.) TWBR = 48; TWSR = 1; //Eigene Slave-Ansprechadresse einstellen, Achtung: linkshift nötig! TWAR = (1 << 1); //TWI aktivieren: TWCR = (1<<TWEN)|(1<<TWEA); while(true) { if(TWCR & (1<<TWINT)) { //ohne Ack: TWCR = (1<<TWINT)|(1<<TWEN); while (!(TWCR & (1<<TWINT))); zahl = TWDR; //Stop: TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO)|(1<<TWEA); } //Zahl anzeigen: (0 bis 3 möglich): if(zahl%2>0) PORTB |=0b00000100; else PORTB &=0b11111011; if((zahl/2)%2>0) PORTB |=0b00001000; else PORTB &=0b11110111; } }
Code 0-3: Quellcode Slave