diff --git a/20191212/aufgabe-2.c b/20191212/aufgabe-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..5b0cb23fdd5ee15a4403808c18d2104ed49caf3f
--- /dev/null
+++ b/20191212/aufgabe-2.c
@@ -0,0 +1,62 @@
+#include <gtk/gtk.h>
+
+#define WIDTH 320
+#define HEIGHT 240
+
+double t = 0.0;
+double dt = 0.2;
+
+int r = 5;
+
+double x = 10;
+double y = 200;
+double vx = 20;
+double vy = -60;
+double g = 9.81;
+
+gboolean draw (GtkWidget *widget, cairo_t *c, gpointer data)
+{
+  GdkRGBA blue = { 0.0, 0.5, 1.0, 1.0 };
+
+  gdk_cairo_set_source_rgba (c, &blue);
+  cairo_arc (c, x, y, r, 0, 2 * G_PI);
+  cairo_fill (c);
+
+  return FALSE;
+}
+
+gboolean timer (GtkWidget *widget)
+{
+  t += dt;
+  x += vx * dt;
+  y += vy * dt;
+  vx = vx;
+  vy = 0.5 * g * (t * t);
+  if (y + r >= HEIGHT)
+    vy = -vy * 0.9;
+  if (x + r >= WIDTH)
+    vx = -vx * 0.9;
+  if (x - r <= 0)
+    vx = -vx * 0.9;
+  gtk_widget_queue_draw_area (widget, 0, 0, WIDTH, HEIGHT);
+  g_timeout_add (50, (GSourceFunc) timer, widget);
+  return FALSE;
+}
+
+int main (int argc, char **argv)
+{
+  gtk_init (&argc, &argv);
+
+  GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+  gtk_widget_show (window);
+  gtk_window_set_title (GTK_WINDOW (window), "Hello");
+  g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);
+
+  GtkWidget *drawing_area = gtk_drawing_area_new ();
+  gtk_widget_show (drawing_area);
+  gtk_container_add (GTK_CONTAINER (window), drawing_area);
+  gtk_widget_set_size_request (drawing_area, WIDTH, HEIGHT);
+
+  gtk_main ();
+  return 0;
+}
diff --git a/20191212/hp-uebung-20191212.pdf b/20191212/hp-uebung-20191212.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..2888f67433125420b003af45b31c55ea65dc4ee0
Binary files /dev/null and b/20191212/hp-uebung-20191212.pdf differ
diff --git a/20191212/hp-uebung-20191212.tex b/20191212/hp-uebung-20191212.tex
new file mode 100644
index 0000000000000000000000000000000000000000..bf99681d8f579298f3b337f2060fac229be36bd4
--- /dev/null
+++ b/20191212/hp-uebung-20191212.tex
@@ -0,0 +1,193 @@
+% hp-uebung-20191212.pdf - Exercises on Low-Level Programming
+% Copyright (C) 2013, 2015, 2016, 2017, 2018, 2019  Peter Gerwinski
+%
+% This document is free software: you can redistribute it and/or
+% modify it either under the terms of the Creative Commons
+% Attribution-ShareAlike 3.0 License, or under the terms of the
+% GNU General Public License as published by the Free Software
+% Foundation, either version 3 of the License, or (at your option)
+% any later version.
+%
+% This document is distributed in the hope that it will be useful,
+% but WITHOUT ANY WARRANTY; without even the implied warranty of
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+% GNU General Public License for more details.
+%
+% You should have received a copy of the GNU General Public License
+% along with this document.  If not, see <http://www.gnu.org/licenses/>.
+%
+% You should have received a copy of the Creative Commons
+% Attribution-ShareAlike 3.0 Unported License along with this
+% document.  If not, see <http://creativecommons.org/licenses/>.
+
+% README: Kondensator, hüpfender Ball
+
+\documentclass[a4paper]{article}
+
+\usepackage{pgscript}
+
+\begin{document}
+
+%  \thispagestyle{empty}
+
+  \section*{Hardwarenahe Programmierung\\
+            Übungsaufgaben -- 12.\ Dezember 2019}
+
+  Diese Übung enthält Punkteangaben wie in einer Klausur.
+  Um zu "`bestehen"', müssen Sie innerhalb von 70 Minuten
+  unter Verwendung ausschließlich zugelassener Hilfsmittel
+  12 Punkte (von insgesamt \totalpoints) erreichen.
+
+  \exercise{Kondensator}
+
+  Ein Kondensator der Kapazität $C = 100\,\mu{\rm F}$
+  ist auf die Spannung $U_0 = 5\,{\rm V}$ aufgeladen
+  und wird über einen Widerstand $R = 33\,{\rm k}\Omega$ entladen.
+
+  \begin{enumerate}[(a)]
+    \item
+      Schreiben Sie ein C-Programm, das
+      den zeitlichen Spannungsverlauf in einer Tabelle darstellt.
+      \points{5}
+    \item
+      Schreiben Sie ein C-Programm, das ermittelt,
+      wie lange es dauert, bis die Spannung unter $0.1\,{\rm V}$ gefallen ist.
+      \points{4}
+    \item
+      Vergleichen Sie die berechneten Werte mit der exakten theoretischen Entladekurve:
+      \begin{math}
+        U(t) = U_0 \cdot e^{-\frac{t}{RC}}
+      \end{math}\\
+      \points{3}
+  \end{enumerate}
+
+  Hinweise:
+  \begin{itemize}
+    \item
+      Für die Simulation zerlegen wir den Entladevorgang in kurze Zeitintervalle $dt$.
+      Innerhalb jedes Zeitintervalls betrachten wir den Strom $I$ als konstant
+      und berechnen, wieviel Ladung $Q$ innerhalb des Zeitintervalls
+      aus dem Kondensator herausfließt.
+      Aus der neuen Ladung berechnen wir die Spannung am Ende des Zeitintervalls.
+    \item
+      Für den Vergleich mit der exakten theoretischen Entladekurve
+      benötigen Sie die Exponentialfunktion \lstinline{exp()}.
+      Diese finden Sie in der Mathematik-Bibliothek:
+      \lstinline{#include <math.h>} im Quelltext,
+      beim \lstinline[style=cmd]{gcc}-Aufruf \lstinline[style=cmd]{-lm} mit angeben.
+    \item
+      $Q = C \cdot U$,\quad $U = R \cdot I$,\quad $I = \frac{dQ}{dt}$
+  \end{itemize}
+
+  \exercise{Fehlerhaftes Programm: Hüpfender Ball}
+
+  Das auf der nächsten Seite abgedruckte GTK+-Programm
+  (Datei: \gitfile{hp}{20191212}{aufgabe-2.c}) soll einen
+  hüpfenden Ball darstellen, ist jedoch fehlerhaft.
+
+  \begin{enumerate}[\quad(a)]
+    \item
+      Warum sieht man lediglich ein leeres Fenster?
+      Welchen Befehl muß man ergänzen, um diesen Fehler zu beheben?
+      \points{3}
+    \item
+      Nach der Fehlerbehebung in Aufgabenteil (a)
+      zeigt das Programm einen unbeweglichen Ball.
+      Welchen Befehl muß man ergänzen, um diesen Fehler zu beheben, und warum?
+      \points{2}
+    \item
+      Erklären Sie das merkwürdige Hüpfverhalten des Balls.
+      Wie kommt es zustande?
+      Was an diesem Verhalten ist korrekt, und was ist fehlerhaft? \points{5}
+    \item
+      Welche Befehle muß man in welcher Weise ändern,
+      um ein realistischeres Hüpf-Verhalten zu bekommen? \points{2}
+  \end{enumerate}
+
+  Hinweis: Das Hinzuziehen von Beispiel-Programmen aus der Vorlesung
+  ist ausdrücklich erlaubt -- auch in der Klausur.
+
+  Allgemeiner Hinweis:
+  Wenn Sie die Übungsaufgaben zu dieser Lehrveranstaltung
+  als PDF-Datei betrachten und darin auf die Dateinamen klicken,
+  können Sie die Beispiel-Programme direkt herunterladen.
+  Dadurch vermeiden Sie Übertragungsfehler.
+
+  \bigskip
+
+  \begin{flushright}
+    \textit{Viel Erfolg!}
+  \end{flushright}
+
+  \clearpage
+
+  \vbox to \textheight{\vspace*{-0.5cm}\begin{lstlisting}
+    #include <gtk/gtk.h>
+
+    #define WIDTH 320
+    #define HEIGHT 240
+
+    double t = 0.0;
+    double dt = 0.2;
+
+    int r = 5;
+
+    double x = 10;
+    double y = 200;
+    double vx = 20;
+    double vy = -60;
+    double g = 9.81;
+
+    gboolean draw (GtkWidget *widget, cairo_t *c, gpointer data)
+    {
+      GdkRGBA blue = { 0.0, 0.5, 1.0, 1.0 };
+
+      gdk_cairo_set_source_rgba (c, &blue);
+      cairo_arc (c, x, y, r, 0, 2 * G_PI);
+      cairo_fill (c);
+
+      return FALSE;
+    }
+
+    gboolean timer (GtkWidget *widget)
+    {
+      t += dt;
+      x += vx * dt;
+      y += vy * dt;
+      vx = vx;
+      vy = 0.5 * g * (t * t);
+      if (y + r >= HEIGHT)
+        vy = -vy * 0.9;
+      if (x + r >= WIDTH)
+        vx = -vx * 0.9;
+      if (x - r <= 0)
+        vx = -vx * 0.9;
+      gtk_widget_queue_draw_area (widget, 0, 0, WIDTH, HEIGHT);
+      g_timeout_add (50, (GSourceFunc) timer, widget);
+      return FALSE;
+    }
+
+    int main (int argc, char **argv)
+    {
+      gtk_init (&argc, &argv);
+
+      GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+      gtk_widget_show (window);
+      gtk_window_set_title (GTK_WINDOW (window), "Hello");
+      g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);
+
+      GtkWidget *drawing_area = gtk_drawing_area_new ();
+      gtk_widget_show (drawing_area);
+      gtk_container_add (GTK_CONTAINER (window), drawing_area);
+      gtk_widget_set_size_request (drawing_area, WIDTH, HEIGHT);
+
+      gtk_main ();
+      return 0;
+    }
+  \end{lstlisting}\vss}
+
+  \makeatletter
+    \immediate\write\@mainaux{\string\gdef\string\totalpoints{\arabic{points}}}
+  \makeatother
+
+\end{document}