kramann.info
© Guido Kramann

Login: Passwort:










10.2.4 Zwei Byte vom Slave an den Master senden:

MASTER             SLAVE
------             -----
START
WARTEN
ADRESSE und Lesewunsch schreiben
WARTEN
AKTION mit ACKNOWLEDGE
                   WENN INTERRUPT-FLAG DANN
                       DATEN schreiben
                       AKTION
                       WARTEN
WARTEN
DATENREGISTER auslesen
AKTION
                   WENN INTERRUPT-FLAG DANN
                       DATEN schreiben
                       AKTION
                       WARTEN
WARTEN
DATENREGISTER auslesen
STOP
                       STOP 

Code 10.2.4-1: Zwei 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 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_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 mit Acknowledge
               TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWEA);
//Warten
            while (!(TWCR & (1<<TWINT)));
//empfangenes Byte speichern.
            byte1 = TWDR;
//Daten empfangen auslösen
            TWCR = (1<<TWINT) | (1<<TWEN);
//Warten
            while (!(TWCR & (1<<TWINT)));
//empfangenes Byte speichern.
            byte2 = TWDR;
            zahl = 0;
            if(byte1==1) zahl+=1;
            if(byte2==1) zahl+=2;
//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 10.2.4-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;
    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))
        {
//mit Ack
            TWDR = byte1;
             TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWEA);
            while (!(TWCR & (1<<TWINT)));
//ohne Ack:
            TWDR = byte2;
              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;
            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 10.2.4-3: Quellcode Slave