|
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 0-1: Klasse Peripherie, für die die Methoden in COACHBASIS und PeripherieBASIS festgelegt wurden.
- 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
- 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.
- Schreiben Sie dann die Klasse COACH mit der Methode start(), die diese Konfiguration vornimmt.
- 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 0-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"
|
|