kramann.info
© Guido Kramann

Login: Passwort:










Mikrocontroller
1 Einfuehrung
..1.1 Entwicklungsgeschichtliches
..1.2 Maschinensprache
..1.3 Assemblerbeispiel
..1.4 Sprachwahl
..1.5 Praxis
....1.5.1 Digital_IO
....1.5.2 Byteoperationen
....1.5.3 AVR_Studio
....1.5.4 Testboard
....1.5.5 Aufgaben
....1.5.6 Do_it_yourself
......1.5.6.1 Ampel
......1.5.6.2 Programmierer
..1.6 Literatur
..1.7 Programmierer
....1.7.1 Bauverlauf
....1.7.2 KurzreferenzLow
....1.7.2 Kurzreferenz_16PU
..1.8 Uebung1
..1.9 BoardAtHome
....1.9.1 Software
....1.9.2 Hardware
....1.9.3 Knoppix
....1.9.4 Aufbau
....1.9.5 LED
2 Oszillator
..2.1 Assembler
..2.2 Interner_RC
..2.3 Quarz
..2.4 Taktgenerator
3 DigitalIO
..3.1 Elektrische_Eigenschaften
..3.2 Pullup_Widerstaende
..3.3 Bitmasken_Eingang
..3.4 Bitmasken_Ausgang
..3.5 Tic_Tac_Toe
....3.5.1 DuoLEDs
....3.5.2 Schaltplan
....3.5.3 Spielfeld
....3.5.4 Anwahl
....3.5.5 Kontrolle
..3.6 Laboruebung2
..3.7 Zaehler
4 PWM
..4.1 Prinzip
..4.2 Nutzen
..4.3 Generierung
..4.4 Programmierung
..4.5 Servos
..4.7 Laboruebung3
..4.8 LoesungUE3
..4.9 Uebung6
5 LichtKlangKugeln
..5.1 LED
..5.2 RGB
..5.3 Sensoren
..5.4 lautsprecher
..5.5 tonerzeugung
6 UART
..6.1 Bussysteme
..6.2 UART
..6.3 RS232
..6.4 Hardware
..6.5 Senden
..6.6 Hyperterminal
..6.7 Empfangen
..6.8 Broadcast
..6.9 Uebung4
7 Infrarot
..7.1 schalten
..7.2 seriell
..7.3 Uebung
..7.4 Cloud
8 OOP
..8.1 Ansatz
..8.2 Uebung
..8.3 Statisch
..8.4 Datentypen
..8.5 RS232
....8.5.1 Prozedural
....8.5.2 Analyse
....8.5.3 Umsetzung
....8.5.4 Vererbung
....8.5.5 Statisch
....8.5.6 Performance
..8.6 Fahrzeug
9 ADW
..9.1 ADW
..9.2 Zufallsgenerator
..9.3 Sensoren
..9.4 Musterloesung
10 Cloud
11 SPI
..11.1 Testanordnung
..11.2 Register
..11.3 Test1
..11.4 Test2_Interrupt
..11.5 Test3_2Slaves
..11.6 Laboruebung
12 EEPROM
13 I2C
..13.1 MasterSendByte
..13.2 MasterSend2Bytes
..13.3 MasterReceiveByte
..13.4 MasterReceive2Bytes
14 Anwendungen
..14.1 Mechatroniklabor
....14.1.1 Biegelinie
....14.1.2 Ausbruchsicherung
....14.1.3 Einachser
....14.1.4 AV
....14.1.5 Vierradlenkung
....14.1.6 Kommunikation
..14.2 Sinuserzeugung
....14.2.1 Variante1
....14.2.2 Variante2
....14.2.3 Variante3
....14.2.4 Variante4
..14.3 Laboruebung8
..14.4 Loesung_Ue8
..14.5 SPI_Nachtrag
20 Xubuntu

13.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 13.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 13.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 13.4-3: Quellcode Slave