kramann.info
© Guido Kramann

Login: Passwort:










COACH2
1 Planung
2 Architektur
3 Anzeige
4 EEPROM
5 I2C
..5.1 MasterSendByte
..5.2 MasterSend2Bytes
..5.3 MasterReceiveByte
..5.4 MasterReceive2Bytes
6 UART
7 DFT
8 FFT
9 Planung2
10 Klassen
..10.1 AnzeigeTaster
..10.2 RS232
..10.3 MotorServo
..10.4 Drehgeber
..10.5 Sensor
..10.6 Funk
11 Adaption
..11.1 Programmiertechnik
..11.2 Evoopt
12 Fuzzy
..12.1 Uebungsaufgabe
..12.2 Fuzzygroesse
..12.3 Fuzzyset
..12.4 Lookuptable
13 Skript
..13.1 Funkkorrektur
..13.2 Skriptsprachen
..13.3 Anforderungen
..13.4 Agentensysteme
..13.5 Implementierung
..13.6 Experimente
14 Gesamtkonzept
..14.1 Skripterweiterung
..14.2 Makroverhalten
67 Echtzeitsysteme
..67.1 Einfuehrung
....67.1.1 Echtzeit
....67.1.2 Korrektheit
....67.1.3 Hardware
....67.1.4 Ziele
....67.1.5 Synchronprogramm
..67.2 Threads
....67.2.1 Java
....67.2.2 Synchronisierung
..67.3 COACH
....67.3.1 Kaskadenregler
....67.3.2 Zeitebene1
....67.3.3 Zeitebene2
....67.3.4 Zeitebene3
....67.3.5 Puck
....67.3.6 Puckschwarm
..67.4 RTAIlab
....67.4.1 Slax
....67.4.1 USB_Stick
....67.4.2 Sinus
..67.5 Semaphor
....67.5.1 Laufkatze
....67.5.2 Java
....67.5.3 Semaphor
..67.6 Audio
....67.6.1 wav
....67.6.2 Linux
..67.7 Lookup
....67.7.1 Fuzzy
....67.7.2 PWM
..67.8 NeuronaleNetze
....67.8.1 Neuron
....67.8.2 Backpropagation
....67.8.3 Umsetzung
....67.8.4 Winkelerkennung
..67.9 Internetprogrammierung
....67.9.1 Codegenerierung
....67.9.2 PHP_Programmierung
....67.9.3 PHP_OOP
....67.9.4 Java
....67.9.5 UDP
..67.10 DFT
..67.11 FFT
..67.12 Zustandsmaschine
..67.13 Fuzzy
....67.13.1 Fuzzylogik
....67.13.2 FuzzyRegler
....67.13.3 Uebung9
....67.13.5 Softwareentwicklung
......67.13.5.1 AgileSoftwareentwicklung
......67.13.5.2 FuzzyRegler
......67.13.5.3 Uebung
....67.13.6 Umsetzung
......67.13.6.1 FuzzyRegler
......67.13.6.2 Simulation
......67.13.6.3 Optimierung
......67.13.6.4 Uebung
....67.13.7 Haengependel
......67.13.7.1 Haengependel
......67.13.7.2 Simulation
......67.13.7.3 FuzzyRegler
......67.13.7.4 Optimierer
......67.13.7.5 Genetisch
....67.13.8 Information
....67.13.9 Energie

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