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 Laboruebung2_alt
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
8 OOP
..8.1 Probleme
..8.2 Konzept
..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 Zaehler
10 Peripherie
..10.1 RS232Menue
..10.2 ASCIIDisplay
..10.3 Tastenmatrix
..10.4 Schrittmotor
..10.5 Zaehler
..10.6 Uebung7
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.2 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 13.2-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 13.2-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 13.2-3: Quellcode Slave