Zwei Byte vom Master an den Slave senden:
MASTER SLAVE ------ ----- START WARTEN ADRESSE und Schreibwunsch schreiben WARTEN WENN INTERRUPT-FLAG DANN AKTION mit Acknowledge WARTEN DATEN schreiben DATEN senden WARTEN DATENREGISTER auslesen AKTION WARTEN DATEN schreiben DATEN senden WARTEN DATENREGISTER auslesen STOP STOP
Code 0-1: Zwei 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 byte1 = 0; uint8_t byte2 = 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))); //1. Byte senden: //zu sendendes Byte eintragen. TWDR = byte1; //Daten senden auslösen TWCR = (1<<TWINT) | (1<<TWEN); //Warten while (!(TWCR & (1<<TWINT))); //2. Byte senden: //zu sendendes Byte eintragen. TWDR = byte2; //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; if(zahl%2==0) byte1=0; if(zahl%2==1) byte1=1; if(zahl/2==0) byte2=0; if(zahl/2==1) byte2=1; } //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; uint8_t byte1 = 0; uint8_t byte2 = 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)) { //Byte 1 empfangen: //mit Ack TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWEA); while (!(TWCR & (1<<TWINT))); byte1 = TWDR; //Byte 2 empfangen: //ohne Ack: TWCR = (1<<TWINT)|(1<<TWEN); while (!(TWCR & (1<<TWINT))); byte2 = TWDR; zahl=0; if(byte1==1) zahl+=1; if(byte2==1) zahl+=2; //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