Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen RevisionVorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
projektiteration2 [2019/01/29 17:27] – [2. Iteration, Test] huwiprojektiteration2 [2019/07/27 16:57] (aktuell) – [Weiter im Projekt] huwi
Zeile 2: Zeile 2:
 In der zweiten Projektiteration realisieren wir schrittweise den Wecker. Wie gehabt notieren wir zuerst alle Programmschritte als Kommentar im Quellcode In der zweiten Projektiteration realisieren wir schrittweise den Wecker. Wie gehabt notieren wir zuerst alle Programmschritte als Kommentar im Quellcode
  
-<code c>+><code c>
 //---------------------------------------------------------------------- //----------------------------------------------------------------------
 // Titel     : Entwurf für den myAVR C++ Wecker www.avr-cpp.de // Titel     : Entwurf für den myAVR C++ Wecker www.avr-cpp.de
Zeile 15: Zeile 15:
 Jede identifizierte Komponente repräsentiert ein Objekt, für welches wir hoffentlich eine fertige Treiberklasse vorfinden. Jede identifizierte Komponente repräsentiert ein Objekt, für welches wir hoffentlich eine fertige Treiberklasse vorfinden.
  
-<code c>+><code c>
 // Schaltung : PortD = LCD, PortB.0 = Taste, PortB.1 = LCD-Backlight // Schaltung : PortD = LCD, PortB.0 = Taste, PortB.1 = LCD-Backlight
 //             PortB.2 = Speaker, PortC.0 = Lichtsensor //             PortB.2 = Speaker, PortC.0 = Lichtsensor
Zeile 45: Zeile 45:
 Der Systemstart sollte schon ein bisschen sexy sein. Neben der Initialisierung der Geräte zeigen wir eine kleine Begrüßung für den Nutzer an und empfangen diesen mit ein paar netten Tönen. So etwas ist nicht nur Spielerei sondern signalisiert dem Anwender akustisch und optisch das Hochfahren und die Arbeitsbereitschaft des Systems. Der Systemstart sollte schon ein bisschen sexy sein. Neben der Initialisierung der Geräte zeigen wir eine kleine Begrüßung für den Nutzer an und empfangen diesen mit ein paar netten Tönen. So etwas ist nicht nur Spielerei sondern signalisiert dem Anwender akustisch und optisch das Hochfahren und die Arbeitsbereitschaft des Systems.
  
-<code c>+><code c>
  // wird einmalig beim Einschalten des Systems ausgeführt      // wird einmalig beim Einschalten des Systems ausgeführt    
  public: void onStart()  public: void onStart()
Zeile 76: Zeile 76:
 Die zeitunkritischen Aufgaben mit niedriger Priorität, also jene, die auch mal eine Sekunde Verzögerung haben dürfen ohne dass die Funktion des Systems beeinträchtigt wird, bringen wir in //onWork// unter. Wir erinnern uns, diese Methode wird zyklisch aus der //mainloop// des Framework aufgerufen. Die zeitunkritischen Aufgaben mit niedriger Priorität, also jene, die auch mal eine Sekunde Verzögerung haben dürfen ohne dass die Funktion des Systems beeinträchtigt wird, bringen wir in //onWork// unter. Wir erinnern uns, diese Methode wird zyklisch aus der //mainloop// des Framework aufgerufen.
  
-<code c>+><code c>
  // wird wiedeholend aus der "MainLoop" des AppKernel aufgerufen  // wird wiedeholend aus der "MainLoop" des AppKernel aufgerufen
  // hier alles was Zeit hat verarbeiten  // hier alles was Zeit hat verarbeiten
Zeile 115: Zeile 115:
 Die Aufgaben, welche in einem regelmäßigen zeitgenauen Zyklus ausgeführt werden sollen, bringen wir in einem geeigneten Timerereignis unter. Der Wecker soll sekundengenau das Wecksignal starten. Die Aufgaben, welche in einem regelmäßigen zeitgenauen Zyklus ausgeführt werden sollen, bringen wir in einem geeigneten Timerereignis unter. Der Wecker soll sekundengenau das Wecksignal starten.
  
-<code c>+><code c>
  // einmal pro Sekunde nachschauen ob Weckmelodie neu gestartet werden muss       // einmal pro Sekunde nachschauen ob Weckmelodie neu gestartet werden muss     
  public: void onTimer1s()  public: void onTimer1s()
Zeile 129: Zeile 129:
 Aktionen des Anwenders sind unregelmäßig und spontan. Wir reagieren auf solche Umweltereignisse eben genau so, ereignisorientiert. Aktionen des Anwenders sind unregelmäßig und spontan. Wir reagieren auf solche Umweltereignisse eben genau so, ereignisorientiert.
  
-<code c>+><code c>
  // Ereignisbehandlung für Daten vom PC oder Tastenaktivität  // Ereignisbehandlung für Daten vom PC oder Tastenaktivität
  public: void onEvent(const Object& sender, uint8 data)  public: void onEvent(const Object& sender, uint8 data)
Zeile 150: Zeile 150:
 </code> </code>
  
->>>[[komplettPI2E|Der komplette Code der Entwursphase.]]+>[[komplettPI2E|Der komplette Code der Entwursphase.]]
  
 ====== Programmierung ====== ====== Programmierung ======
 Schauen wir noch mal in Ruhe über diesen Entwurf. Auch die Programmierung sollten wir in kurzen Iterationen ausführen und uns immer wieder Zwischenergebnisse anschauen. Schauen wir noch mal in Ruhe über diesen Entwurf. Auch die Programmierung sollten wir in kurzen Iterationen ausführen und uns immer wieder Zwischenergebnisse anschauen.
  
-<code c>+><code c>
 class Application : public Controller class Application : public Controller
 { {
Zeile 179: Zeile 179:
 Sie können jetzt schon mal den Kompiler anwerfen, um zu schauen, ob alle Komponenten gefunden wurden und ob sich vielleicht doch ein Tippfehler eingeschlichen hat. Bis hier passiert noch nichts Sichtbares bei unserem Wecker. Die folgende Initialisierungssequenz soll der erste Zwischenschritt in der Programmierung sein. Sie können jetzt schon mal den Kompiler anwerfen, um zu schauen, ob alle Komponenten gefunden wurden und ob sich vielleicht doch ein Tippfehler eingeschlichen hat. Bis hier passiert noch nichts Sichtbares bei unserem Wecker. Die folgende Initialisierungssequenz soll der erste Zwischenschritt in der Programmierung sein.
  
-<code c>+><code c>
  // wird einmalig bein Einschalten des Systems ausgeführt      // wird einmalig bein Einschalten des Systems ausgeführt    
  public: void onStart()  public: void onStart()
Zeile 210: Zeile 210:
 Übersetzen Sie das Programm und übertragen Sie dieses auf den Controller. Es sollte jetzt beim Systemstart für drei Sekunden die Begrüßung auf dem Display erscheinen und eine kurze Tonfolge erklingen. Übersetzen Sie das Programm und übertragen Sie dieses auf den Controller. Es sollte jetzt beim Systemstart für drei Sekunden die Begrüßung auf dem Display erscheinen und eine kurze Tonfolge erklingen.
  
-<code c>+><code c>
  
  // wird wiedeholend aus der "MainLoop" des AppKernel aufgerufen  // wird wiedeholend aus der "MainLoop" des AppKernel aufgerufen
Zeile 283: Zeile 283:
 Übersetzen Sie das Programm und übertragen Sie dieses auf den Controller. Es sollte jetzt beim Systemstart für drei Sekunden die Begrüßung auf dem Display erscheinen und eine kurze Tonfolge erklingen. Danach wird die Uhrzeit angezeigt, welche von der Echtzeituhr ausgelesen wurde. Beachten Sie jedoch, dass die Echtzeituhr noch nicht gestellt wurde. Im nächsten Schritt realisieren wir die Weckmelodie. Übersetzen Sie das Programm und übertragen Sie dieses auf den Controller. Es sollte jetzt beim Systemstart für drei Sekunden die Begrüßung auf dem Display erscheinen und eine kurze Tonfolge erklingen. Danach wird die Uhrzeit angezeigt, welche von der Echtzeituhr ausgelesen wurde. Beachten Sie jedoch, dass die Echtzeituhr noch nicht gestellt wurde. Im nächsten Schritt realisieren wir die Weckmelodie.
  
-<code c>+><code c>
  // einmal pro Sekunde nachschauen ob Weckmelodie neu gestartet werden muss       // einmal pro Sekunde nachschauen ob Weckmelodie neu gestartet werden muss     
  public: void onTimer1s()  public: void onTimer1s()
Zeile 300: Zeile 300:
 Der Wecker und die Uhr sind noch nicht gestellt. Es ist so nicht möglich die Weckfunktion zu testen. Ergänzen sie die Initialisierungssequenz vorläufig um folgende Zeilen: Der Wecker und die Uhr sind noch nicht gestellt. Es ist so nicht möglich die Weckfunktion zu testen. Ergänzen sie die Initialisierungssequenz vorläufig um folgende Zeilen:
  
-<code c>+><code c>
  // Echtzeituhr stellen  // Echtzeituhr stellen
  echtzeituhr.setTime("13:44:00T");  echtzeituhr.setTime("13:44:00T");
Zeile 312: Zeile 312:
 Übersetzen Sie das Programm und übertragen Sie dieses auf den Controller. Nach der vorgegeben Zeit sollte jetzt die Weckmelodie erklingen. Jetzt möchten wir den Wecker natürlich noch anhalten. Übersetzen Sie das Programm und übertragen Sie dieses auf den Controller. Nach der vorgegeben Zeit sollte jetzt die Weckmelodie erklingen. Jetzt möchten wir den Wecker natürlich noch anhalten.
  
-<code c>+><code c>
  // Ereignisbehandlung für Daten vom PC oder Tastenaktivität  // Ereignisbehandlung für Daten vom PC oder Tastenaktivität
  public: void onEvent(const Object& sender, uint8 data)  public: void onEvent(const Object& sender, uint8 data)
Zeile 338: Zeile 338:
 Übersetzen Sie das Programm und übertragen Sie dieses auf den Controller. Der Wecker hat jetzt seine komplette Funktionalität. Die Datenübertragung vom PC zum Stellen des Weckers und der Echtzeituhr wurden ebenfalls schon implementiert. Es fehlt nur noch das PC-Programm, um Wecker und Uhr zu stellen und die aktuelle Uhrzeit anzuzeigen. Übersetzen Sie das Programm und übertragen Sie dieses auf den Controller. Der Wecker hat jetzt seine komplette Funktionalität. Die Datenübertragung vom PC zum Stellen des Weckers und der Echtzeituhr wurden ebenfalls schon implementiert. Es fehlt nur noch das PC-Programm, um Wecker und Uhr zu stellen und die aktuelle Uhrzeit anzuzeigen.
  
-[[komplettPI2R|Der komplette Code der realisierten Firmware für das kleine Projekt.]]+>[[komplettPI2R|Der komplette Code der realisierten Firmware für das kleine Projekt.]]
  
  
Zeile 347: Zeile 347:
   * hh:mm:ss**A**, das abschließende **A=Alarm** ist das Kommando mit der gegeben Zeit den Wecker zu stellen   * hh:mm:ss**A**, das abschließende **A=Alarm** ist das Kommando mit der gegeben Zeit den Wecker zu stellen
  
->>><html><iframe width="700" height="480" src="https://www.youtube.com/embed/eG4q4Quahe0" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe></html>+><html><iframe width="700" height="480" src="https://www.youtube.com/embed/eG4q4Quahe0" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe></html> 
 ====== Weiter im Projekt ====== ====== Weiter im Projekt ======
  
Zeile 353: Zeile 354:
  
 [[ein kleines Projekt|zurück zur Projektübersicht]] [[ein kleines Projekt|zurück zur Projektübersicht]]
 +