Ein Byte vom Slave an den Master senden:
MASTER SLAVE ------ ----- START WARTEN ADRESSE und Lesewunsch schreiben WARTEN AKTION WENN INTERRUPT-FLAG DANN DATEN schreiben AKTION WARTEN WARTEN DATENREGISTER auslesen STOP STOP
Code 0-1: Ein Byte vom Slave an den Master 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_LESEN; //schreiben setzen und Adresse==1 auswählen TWDR = 3; //auslösen Adresse und Modus senden TWCR = (1<<TWINT) | (1<<TWEN); //Warten while (!(TWCR & (1<<TWINT))); //Daten empfangen auslösen TWCR = (1<<TWINT) | (1<<TWEN); //Warten while (!(TWCR & (1<<TWINT))); //empfangenes Byte speichern. zahl = TWDR; //STOP TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO); } //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 akku = 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: TWDR = zahl; TWCR = (1<<TWINT)|(1<<TWEN); while (!(TWCR & (1<<TWINT))); //Stop: TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO)|(1<<TWEA); } //Taster 2: zu sendende Zahl einstellen akku = PINB; 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-3: Quellcode Slave