id: Msw5YCj3DZzflNZTRLTr8PbUQO721rmpCxZlDqRN createdBy: Mj92OSQdrbcE dateCreated: 1689064662293 name: Komplexaufgabe 0 meta: logo: >- https://raw.githubusercontent.com/edrys-labs/lab-arduino-basics/main/logo.jpeg description: >- Die Studierenden wenden die Kenntnisse zur hardwarenahen Konfiguration und Nutzung von Eingangs-/Ausgangs-Pins an. Dazu wird ein Anwendungsbeispiel aus der Arduino-Welt teilweise auf die Nutzung der avrlibc umgestellt. Im Ergebnis steht eine Applikation die kontinuierlich die Distanz zu einem Hindernis vermisst. selfAssign: true members: teacher: [] student: [] modules: - url: >- https://raw.githubusercontent.com/cross-lab-project/edrys_module-markdown-it/2.0.0/index.html config: > # Komplexaufgabe 0 Liebe Teilnehmerinnen und Teilnehmer, dies ist die erste Komplexaufgabe, die Ihnen Gelegenheit geben soll, sich zusätzlich zu den praktischen Übungen mit den Grundlagen der Programmierung eingebetteter Systeme vertraut zu machen. Wir werden nunmehr jede Woche eine neue Aufgabe für Sie freischalten. Die Aufgaben sind so konzipiert, dass Sie die Lösung selbstständig erarbeiten können. Sollten Sie dennoch Fragen haben, können Sie sich gerne an die Betreuer wenden. Wir haben uns für eine Remote-Lösung entschieden, da die Aufbauten Schritt für Schritt immer aufwändiger werden. Entsprechend erlaubt uns der Webzugriff einen ressourcensparenden und zeiteffizienten Einsatz der Setups. Die Umsetzung dieser Remote-Lösung ist für uns alle neu und wir bitten Sie daher um Verständnis, falls es zu Anfang noch zu Problemen kommen sollte. Noch umfasst unsere Lösung keinen Multi-User-Modus - entsprechend könnten Sie einen Kommilitonen ziemlich ärgern, wenn Sie ihm die Kontrolle entziehen. Prüfen Sie also bitte vorher, ob das Setup gerade von jemand anderem verwendet wird. Die „Station“ merkt sich immer den letzten Stand, verlassen Sie Ihren Arbeitsplatz ordentlich und kopieren sie vor dem verlassen einfach den Original-Code in den Editor ... Wir freuen uns auf Ihr Feedback und Ihre Anregungen. _Ihr CrossLab Team_ > Bei __Problemen und Bugs__ helfen uns Screenshots und auch Kopien der Developer-Konsole, diese öffnet sich in den meisten Browsern durch > die Tasten-Kombination <kdb>Ctrl</kdb>-<kdb>Shift</kdb>-<kdb>i</kdb> ... > Zögern Sie nicht direkt eine Mail an andre.dietrich@informatik.tu-freiberg.de zu schreiben. studentConfig: '' teacherConfig: '' stationConfig: '' showInCustom: lobby width: full height: huge - url: https://cross-lab-project.github.io/edrys_module-editor/index.html config: editorText: | #include <Wire.h> #include <LiquidCrystal_PCF8574.h> int lcdi2c = 0x27; // <- Hart eingecodete Adresse, vgl. Datenblatt LiquidCrystal_PCF8574 lcd(lcdi2c); const int trigPin = 12; const int echoPin = 11; void setup() { lcd.begin(16, 2); lcd.setBacklight(255); lcd.clear(); lcd.setCursor(0, 0); lcd.print("#CrossLab - 2024"); lcd.setCursor(0, 1); lcd.print("Komplexaufgabe 0"); Serial.begin(9600); Serial.print("Los geht's"); // Aufgabe 1: Ersetzen Sie die Konfiguration der // Pins trigPin und echoPin als Aus- bzw. Eingang pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); } void loop() { digitalWrite(trigPin, LOW); delayMicroseconds(5); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); while (digitalRead(echoPin) == LOW); unsigned long start_time = micros(); while (digitalRead(echoPin) == HIGH); unsigned long duration = micros() - start_time; Serial.println(duration); // Aufgabe 3: Berechnen Sie die Entfernung in cm und geben // Sie diese über den seriellen Port und Display aus. // float distance = duration .... // Serial.print(distance); // Serial.println("cm"); // lcd.setCursor(0, 1); // lcd.print(distance); delay(1000); } runCommand: execute language: cpp theme: light showInCustom: station width: full height: huge - url: https://cross-lab-project.github.io/edrys_module-station-stream/index.html stationConfig: video: true audio: false showInCustom: station width: half height: medium - url: https://cross-lab-project.github.io/edrys_module-pyxtermjs/index.html stationConfig: server: http://localhost:5000/pty execute: execute script: > echo $CODE | base64 --decode > Hello.ino arduino-cli sketch new Hello olddir=$(pwd) mv Hello.ino Hello cd Hello arduino-cli board attach -p /dev/ttyACM0 -b arduino:avr:uno cd $olddir arduino-cli compile Hello && arduino-cli upload -p /dev/ttyACM0 Hello && arduino-cli monitor -p /dev/ttyACM0 enable: teacher: true student: true showInCustom: station width: half height: medium - url: >- https://raw.githubusercontent.com/cross-lab-project/edrys_module-markdown-it/2.0.0/index.html config: >- # Komplexaufgabe 0 > Im Rahmen dieser Aufgabe machen Sie sich mit der Remote-Entwicklungsumgebung vertraut und wenden Ihre Kenntnisse zur digitalen I/O Programmierung an. Grundlage ist ein Arduino-Beispielprogramm, dass Sie __in Teilen auf eine `avrlibc` Implementierung__ transformieren. Die Arduino-Implementierung illustriert die erwartete Funktionalität - ein Distanzwert in `cm` wird über den seriellen Port ausgegebenen. Die Vorlage sendet einen Triggerimpuls an den Ultraschallsensor und misst die Zeit bis zum Empfang des Echos. Dieser Trigger ist so konfiguriert, dass zunächst für 5 Mikrosekunden ein `LOW` Pegel anliegt, danach für 10 Mikrosekunden ein `HIGH` Pegel. Wenn der Trigger-Pin dann auf `LOW` gesetzt wird, startet die Messung (vgl [Datenblatt SRF04](https://datasheetspdf.com/pdf-file/523589/ETC/SRF04/1)). Für die Bestimmung der Distanz müssen wir also, wie im Arduino-Code gezeigt, die Laufzeit des Echos erfassen. Dafür können Sie die auch in Ihrer Lösung die `micros()` Funktion verwenden (die wir in einem späteren Projekt auch ersetzen). Der Ultraschallsensor ist an den Pins 12 und 11 angeschlossen. Folgen Sie den Anweisungen im Code und ersetzen Sie die Arduino-Funktionen durch die entsprechenden `avrlibc` Befehle: 0. Aufgabe: Kritisieren Sie die Implementierung des Arduino-Beispiels. Welches Problem tritt ggf. auf? Betrachten Sie dabei insbesondere die Verwendung der `delayMicroseconds()` Funktion. Welche Verbesserungen würden Sie vorschlagen? 1. Aufgabe: Ersetzen Sie die Zeilen 25 und 26 durch `DDRx` Registerkonfigurationen. Ermitteln Sie dafür den zugehörigen für `trigPin` und `echoPin` aus dem Datenblatt des Atmega328p. 2. Aufgabe: Ersetzen Sie die Zeilen 30, 32 und 34 durch eine `PORTx` Registerkonfiguration. Evaluieren Sie in Zeile 37 den Status des `echoPin` mittels `PINx`. 3. Aufgabe: Stellen Sie eine Formel zur Berechnung der Entfernung in cm auf. Fügen Sie diese ein und geben Sie den Wert über den seriellen Port und das Display aus. ### Original Code ``` cpp #include <Wire.h> #include <LiquidCrystal_PCF8574.h> int lcdi2c = 0x27; // <- Hart eingecodete Adresse, vgl. Datenblatt LiquidCrystal_PCF8574 lcd(lcdi2c); const int trigPin = 12; const int echoPin = 11; void setup() { lcd.begin(16, 2); lcd.setBacklight(255); lcd.clear(); lcd.setCursor(0, 0); lcd.print("#CrossLab - 2024"); lcd.setCursor(0, 1); lcd.print("Komplexaufgabe 0"); Serial.begin(9600); Serial.print("Los geht's"); // Aufgabe 1: Ersetzen Sie die Konfiguration der // Pins trigPin und echoPin als Aus- bzw. Eingang pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); } void loop() { digitalWrite(trigPin, LOW); delayMicroseconds(5); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); while (digitalRead(echoPin) == LOW); unsigned long start_time = micros(); while (digitalRead(echoPin) == HIGH); unsigned long duration = micros() - start_time; Serial.println(duration); // Aufgabe 3: Berechnen Sie die Entfernung in cm und geben // Sie diese über den seriellen Port und Display aus. // float distance = duration .... // Serial.print(distance); // Serial.println("cm"); // lcd.setCursor(0, 1); // lcd.print(distance); delay(1000); } ``` studentConfig: '' teacherConfig: '' stationConfig: '' showInCustom: station width: full height: medium