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