kramann.info
© Guido Kramann

Login: Passwort:










1 Software-Architektur für das Gesamtkonzept

Objektorientierter Ansatz

  • Die einzelnen Peripherien, wie Motortreiber, Servo, Funkmodul, RS232, etc. sollen jeweils durch eine C++ - Klasse repräsentiert werden.
  • Diese Klassen sollen weitestgehend durch die Studierenden selbständig geschrieben werden.
  • Um ein gleichartiges Zusammenspiel der Objekte der Klassen untereinander gewährleisten zu können, werden die Namen und Übergabeparameter der Objektmethoden der Klassen vorab vereinbart.
  • Um die Einhaltung dieser Planvorgaben zu gewährleisten, werden solche Schnittstellen durch Vererbung von abstrakten Klassen umgesetzt.
  • Im folgenden ist für ein Beispiel dargestellt, wie die Programmstruktur dann aussehen kann.
  • Es handelt sich um eine Klasse, die die beiden Taster des Testboards ausliest:
#include <avr/io.h>
class COACHBASIS
{
    public:
        virtual void start(void);
        virtual void stop(void);
};
class PeripherieBASIS
{
    public:
        virtual bool ansteuern(int);
};
class Peripherie : public COACHBASIS, PeripherieBASIS
{
    private:
        unsigned char akku;
    public:
        void start(void)
        {
            DDRB &= 0b11111100;
        }
        void stop(void)
        {
            DDRB &= 0b11111100;
        }
        bool ansteuern(int nr)
        {
            akku = PINB;
            if(nr==0)
                akku &= 0b00000001;
            else
                akku &= 0b00000010;
            if(akku>0)
                return true;
            else
                return false;
        }
};
Peripherie peripherie;
int main(void)
{
    peripherie.start();
    DDRC = 0b11111111;
    while(true)
    {
        if( peripherie.ansteuern(0)==true )
            PORTC = 1;
        else if( peripherie.ansteuern(1)==true )
            PORTC = 2;
        else
            PORTC = 0;
    }
    return 0;
}

Code 1-1: Klasse Peripherie, für die die Methoden in COACHBASIS und PeripherieBASIS festgelegt wurden.

  • Basiskonfiguration
  • Solange noch keine Klassen entwickelt wurden, muß gewährleistet sein, dass nicht durch zufällige Konfigurationen schädliche Konfigurationen entstehen.
  • So darf der Antriebsmotor auch ohne Motortreiber-Ansteuerung nicht laufen, die Anzeige sollte keinen Strom verbrauchen, das Funkmodul sollte inaktiv sein usw.
  • Zusammengefaßt sollte keine Peripherie aktiv sein, zumindest sollte sie nicht unnötig viel Leistung aufnehmen.
  • Dies kann erreicht werden durch eine Klasse, deren Objekt die Basiskonfiguration vornimmt.
  • Da diese Klasse das gesamte AV in einen Anfangszustand versetzt, soll sie einach "COACH" genannt werden.
Wichtiger Hinweis: start() und stop() dürfen andere Peripherie nicht beeinflussen:
  • Die in jeder Peripherie-Klasse zu implementierende Methode start() darf nur diejenigen Pins des Mikrocontroller beeinflussen, die auch wirklich absolut notwendig zur Ansteuerung der betreffenden Peripherie sind.
  • Die Methode stop() soll nur die zuvor in start() manipulierten Pins wieder in ihren Ur-Zustand zurück versetzen.
  • Der Urzustand ist derjenige, der durch die start()-Methode des Objekts vom Typ "COACH" verursacht wird.
  • Sollten beide Zustände miteinander übereinstimmen, sollte dieser trotzdem aktiv in start() und stop() gesetzt werden.
  • Dies soll vermeiden helfen, dass eine Änderung der start()-Methode in "COACH" eine völlige Verwirrung bzgl. der anzustrebenden Zustände in den anderen Peripherien nach sich zieht.
Aufgabe 1.2-1
  1. Analsysieren Sie den Schaltplan der Grundplatine anhand des Layouts und legen Sie fest, welchen Zustand die einzelnen Bits der Ports A, B, C und D haben sollten.
  2. Schreiben Sie dann die Klasse COACH mit der Methode start(), die diese Konfiguration vornimmt.
  3. Tauschen Sie sich untereinander über die Sinnhaftigkeit Ihrer Festlegungen aus, versuchen Sie sich auf ein gemeinsames Konzept zu einigen.
Aufgabe 1.2-2
  • Analysieren Sie das Layout und das Datenblatt für das Anzeigelement.
  • Schreiben Sie eine Klasse "Anzeige" zur Ansteuerung des Anzeigeelements.
  • Sie soll Integerzahlen im Bereich +/-999 darstellen können.
  • Es soll folgende Schnittstellendefinition eingehalten werden und die von "COACHBASIS":
class AnzeigeBASIS
{
    public:
        virtual void zahl(int);
};

Code 1-2: Schnittstellendefinition für "Anzeige"

Hinweise zum Vorgehen zur Lösung der Aufgabe 1.2-2:
  • Erstellen Sie zunächst eine Zuordnungstabelle, anhand der ersichtlich ist, welcher Pin des Mikrocontrollers mit welchem der Anzeige verbunden ist.
  • Erstellen Sie dann mit Hilfe der Datenblätter von ATmega32 und HDSP-B08G (Anzeigeelement), wie die Zuordnung zwischen Port-Bits und 7-Segment-Elementen ist.
  • Beachten Sie: Das Anzeigeelement besteht aus vier 7-Segmentanzeigen. Es kann gleichzeitig immer nur eines eingeschaltet werden über die Auswahl der gemeinsamen Anode.
  • Ist eine Anode ausgewählt, können die sieben Segmente des betreffenden Bausteins gleichzeitig angesteuert werden.
  • Eine vierstellige Zahl wird dadurch sichtbar, dass zyklisch in schnellem Tempo die einzelnen Anzeigeelemente aufgefrischt werden.
Aufgabe 1.2-3
  • Lassen Sie die Klasse "AnzeigeText" von "Anzeige" erben und ergänzen Sie hier eine Methode,
  • mit der Text dargestellt werden kann.
  • Halten Sie folgende Schnittstellendefinition ein:
  • class AnzeigeTextBASIS
  • {
  • public:
  • virtual void text(char*);
  • };
  • Schnittstellendefinition für "AnzeigeText"