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
kramann.info
© Guido Kramann

Login: Passwort:




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 0-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 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 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 0-3: Quellcode Slave