Debugger für Arduino UNO

  • Hallo allerseits,


    hat jemand Interesse an einen solchen Debugger? Der besteht aus zwei Rechnern. In dem einen kann man sein Programm testen. Dazu kann man beliebig viele Haltepunkte setzen. Bei jedem Haltepunkt kann man bis zu 4 beliebige Parameter darstellen. Wird ein Haltepunkt erreicht, wird das Programm gestoppt und die Parameter an einem zweiten Rechner (UNO) übergeben. Wenn man sich die Parameter angesehen hat, gibt der Haltepunkt das zu untersuchende Programm wieder frei.

    Der zweite Rechner stellt die Parameter auf einer 4-Stelligen Anzeige nacheinander dar. Durch Tastendruck wechselt die Anzeige.

    Zur Datenübertragung wird nur ein Digitaler Port benötigt.

  • Nicht dass das missverstanden wird. Ich will das nicht verkaufen, sondern bei Interesse stelle ich die Programme und die Bauanleitung ein.

  • Hallo Hans-Ulrich,

    verstehe ich das richtig du benutzt einen zweiten UNO als Debug-Anzeige für den ersten, und die beiden "reden" über einen einzigen I/O-Pin miteinander?

    Das klingt interessant. Bei meinen bisherigen Microcontroller-Projekten (Atmels auf Lochraster sowie einige Arduino Nano v3), habe ich bei Bedarf immer alles über die UART rausgehauen. Ein Debugger durch den man durchsteppen kann, das hätte was, da bekunde ich mal ganz offiziell Interesse.

    Für mich brauchst du dich jetzt aber nicht überschlagen, die Hausbaustelle hat mich ab Samstag wieder fest im Griff nach einem Monat voller Geburtstage.


    Ich sag jetzt schon mal Danke für deine Arbeit und wünsche dir (wie damals beim "WDR Computerclub") daß du am Ende noch :thumbup: kB übrig hast!


    Detlev

  • Hallo Detlev,


    wie versprochen die Beschreibung des Debuggers:


    Die verwendeten Programme können hier geladen werden: Programme Debugger


    Der Debugger besteht aus zwei Teilen, einen Sender und einen Empfänger.


    Der Sender ist ein Arduino UNO. Auf diesen läuft das zu überprüfende Programm. In diesem Programm kann man beliebig viele Haltepunkte setzen. Bei Erreichen eines Haltepunktes wird das zu untersuchende Programm gestoppt und bis zu 4 Parameter an den Empfänger gesendet.

    Durch den Sender kann bestimmt werden, wann das zu untersuchende Programm wieder weiter läuft.


    Der Empfänger ist ebenfalls ein Arduino UNO. Dieser steuert eine 4-Stellige 7-Segment Anzeige an. Außerdem befindet sich dort ein Taster. Nach Übermittlung der Daten wird der erste Parameter angezeigt. Nach einem Tastendruck wechselt die Anzeige auf den zweiten Parameter usw.

    Nach dem vierten Parameter erlischt die Anzeige. Ein weiterer Tastendruck startet das zu untersuchende Programm wieder.


    Während der Datenübertragung leuchtet jeweils ein Segment A. Bei der ersten Ziffer das rechte, bei der zweiten das nächste Segment A usw.

    Bei kleinen Ziffern geht das sehr schnell. Bei 9999 dauert es in etwa eine Sekunde.


    Aufgebaut sieht der Empfänger bei mir so aus:


    [IMG:http://www.huk-2.de/debugger/uno.jpg]


    Die Anschlüsse sind wie folgt verschaltet:


    Digital 0 = Daten

    Digital 2 = 1 KOhm Segment A

    Digital 3 = 1 KOhm Segment B

    Digital 4 = 1 KOhm Segment C

    Digital 5 = 1 KOhm Segment D

    Digital 6 = 1 KOhm Segment E

    Digital 7 = 1 KOhm Segment F

    Digital 8 = 1 KOhm Segment G

    Digital 9 = Taster gegen GND

    Digital 10 = Digit 4

    Digital 11 = Digit 3

    Digital 12 = Digit 2

    Digital 13 = Digit 1


    Die Lage der Segmente ist im Kopf des Programmes beschrieben. Das Programm für den Empfänger ist debug_empfaenger_V2.ino.


    Bei Digital 0 (Daten) ist noch folgendes zu beachten:

    An diesen Pin müssen zwei Widerstände angeschlossen werden. Ein Widerstand (6,8 KOhm, ist nicht kritisch) an GDN. Es kann sein, dass sowohl das Daten-Pin beim Sender und Empfänger auf Eingang geschaltet sind. Dann tritt ein nicht definierter Zustand ein der zu Funktionsstörungen führen kann.


    Der zweite Widerstand (270 Ohm) liegt in Reihe zwischen den beiden Daten-Pin. Ich kann nicht ausschließen, dass kurzeitig beide Daten-Pin auf Ausgang geschaltet sind und unterschiedliches Potenzial führen. Das kann zu Zerstörung der Ausgänge führen.


    Digit 1 ist die linke Ziffer. Als Anzeige wurde ein LTC-4727 (gemeinsame Katode) verwendet. Die Begrenzungswiderstände betragen jeweils 1 KOhm. Das reicht für die verwendete Anzeige vollkommen aus.


    Das Programmpaket für den Sender besteht aus drei Programmen:


    debug_sender_v2.ino -> Hier kann das zu überprüfende Programm rein geschrieben werden.

    programm.ino -> Dieses Programm läuft nach erreichen eines Haltepunktes im Hintergrund und erledigt den Datenaustausch.

    up1.h -> In diesen Programm werden die für Programm.ino benötigten Variablen deklariert.


    Alle drei Programme müssen sich im gleichen Ordner befinden. Gestartet wird der Sender mit debug_sender_v2.ino. Das Programm kann beliebig umbenannt werden. Sinnvollerweise nach dem Start mit „Speichern unter“. Dann wird automatisch ein neuer Ordner angelegt. In ihm befinden sich dann gleich alle drei Programme.


    Nach dem Start sollte sich folgendes Bild zeigen:


    [IMG:http://www.huk-2.de/debugger/debug_sender.jpg]

    Wichtig, dass alle drei Programm zu sehen sind.


    Auch beim Sender sollte das Daten-Pin mit einen 6,8 KOhm Widerstand gegen GND gezogen werden. Im Prinzip ist es egal, welches Port man wählt. Es muss dann nur in up.h (int deb_daten=13;) geändert werden.

    Die 13 habe ich gewählt, weil eine LED auf dem Bord mit diesem Pin verbunden ist. Man kann dann sehen, ob gesendet wird.


    Zur Funktion müssen beide Bords mit dem GND, so wie die Daten-Pin über den Widerstand (270 Ohm) verbunden sein.

    Beim Übertragen der Programme muss die Datenleitung getrennt sein. Mache ich das nicht, kann ich den Rechner neu starten. Er erkennt die USB Schnittstelle nicht mehr.


    Es ist günstig, gleich am Anfang einen Haltepunkt zu setzen. Das ermöglicht, das zu untersuchende Programm definiert zu starten.

    Verwendet man mehrere HP macht es Sinn, als erstes Parameter die Nummer des HP zu übertragen.


    Der Datenaustausch erfolgt nach folgendem Muster:


    Am Anfang ist der Daten-Pin des Empfängers auf Eingang geschaltet.


    Nach erreichen eines Haltepunktes wird der Pin des Senders auf Ausgang geschaltet. Es wird ein Start-Bit gesendet. Dann erfolgt das Senden des ersten Datenpaketes als Mäander.


    Nach dem ersten Datenpaket kommt eine Pause. Diese wird vom Empfänger erkannt und die nachfolgenden Daten dem zweiten Parameter zugeordnet.


    Die Übertragung des zweiten Parameters beginnt wieder mit einen Start-Bit. Das ist nötig, da sonst eine Null nicht übertragen werden kann.


    Nach Übertragung des 4. Paketes schaltet das Daten-Pin des Senders auf Eingang, dass des Empfängers auf Ausgang (LOW),


    Nach der Darstellung der Ziffern und dem Start mit dem Taster, wird ein HIGH vom Empfänger gesendet und danach das Daten-Pin wieder auf Eingang geschaltet.


    Das gesendete HIGH ist für den Sender das Signal, das zu untersuchende Programm wieder frei zu geben und das Spiel beginnt wieder von vorn.


    Implementiert man den Sender auf einen anderen Typ des Arduino kann die Pausenerkennung kritisch sein (while (zw3 < 100);.). Dann muss man die 100 ändern. Ist die Ziffer zu klein, wird das erste Parameter entweder als 0 oder 1 dargestellt, unabhängig was gesendet wurde.

    Ist sie zu groß, kommen nur undefinierte Werte an. Diese Zeile existiert 4 mal.


    Ich hoffe das war jetzt nicht zu großes Kauderwelsch. Bei Fragen fragen . . .


    Auch wenn ich auf dem Gebiet der Programmierung (Assembler, Maschine) jahrelang (lang ist es her) gearbeitet habe, ist diese Art für mich Neuland. Für Ratschläge bin ich dankbar. Es würde mich auch interessieren, wenn es jemand zum Laufen gebracht hat und es anwendet.


  • Hallo Hans-Ulrich,

    deiner Beschreibung kann ich gut folgen, vielen Dank dafür!

    7-Segment-Anzeigen, ja da weiß man was man hat, klare (Sicht)verhältnisse.

    Irgendwo hab ich noch 10 Stück aus alter Zeit. Irgendwo...

    Als Arduino Lehrmeister tauge ich nicht wirklich, ich hangel mich an Beispielen entlang und mach meinen Balkon dazu, mit "debug" per serial.println("abc");

    Da können dir andere sicher mehr erzählen.

    Ich glaube wenn ich es einsetze würde ich sofort der Versuchung erliegen ein (mehrzeiliges) LCD dafür zu benutzen. Die gibt es als Arduino-Shield mit ein paar Tastern für kleines Geld.

    Vor einem Jahr habe ich damit was gemacht, das hatte sich dann aber erledigt weil das Problem nicht mehr bestand. Da gibt es eine Lib bei der muss man nur als Parameter übergeben welche I/O-Pins man nutzt. Dann noch einmal die Anzahl der Zeichen pro Zeile und die Anzahl der Zeilen, der Rest fällt einem vom Himmel in die Hände.

    Aber zuerst ist das Haus dran, sonst krieg ich Ärger ;-)


    Viele Grüße

    Detlev


  • Hallo Detlev,


    das mit den LCD-Anzeigen kommt vielleicht mal später. Jetzt versuche ich mich erst mal in die Programmiersprache einzuarbeiten. Da kommt es mir in erster Linie darauf an, jeden einzelnen Schritt zu verstehen. Auch wenn die von mir verwendete Lösung in den einen oder anderen Schritt umständlich ist, ich weiß genau was dabei passiert.

    Ich habe die Zeit, den Weg so zu gehen. Außerdem macht es mir mehr Spaß, selber etwas in die Reihe zu bekommen. Sicherlich werde ich mich auch in der Zukunft mit solchen Anzeigen und dem I2C Protokoll beschäftigen. Aber eins nach dem anderen.

  • Hallo allerseits,


    es hat mir keine Ruhe gelassen und so ist die Version 3 vom Debugger entstanden. Der Unterschied ist die verwendete Anzeige. In dem Fall eine LCD 1602A 16x2. Angesteuert über ein I2C Modul.

    Der Anschluss des Moduls:

    GND -> GND ; VCC -> 5V ; SDA -> A4 (Daten) ; SCL -> A5 (Takt)

    Ansonsten alles wie in der Version 2.

    Die Programme können hier geladen werden: Programme Debugger V3


    [IMG:http://www.huk-2.de/debugger/debugger_v3.jpg]

  • Hallo Hans-Ulrich,

    jetzt hab ich aber ein wenig ein schlechtes Gewissen weil ich dir diesen Floh ins Ohr gesetzt habe...

    Das Display läuft über I2C? Das ist ja dann extrem sparsam in der Verkabelung, was die Nachbausicherheit bestimmt erhöht.

    Hut ab vor deiner Lernkurve!


    Ich könnte momentan gar nichts mit Arduino machen, mein 12 Jahre altes Elektronik-und-Astro-Notebook hat sich verabschiedet.

    Der "jüngere" Nachfolger ist ein 10 Jahre altes T61 Thinkpad (Core 2 Duo) und das muß alles erst eingerichtet werden.


    Viele Grüße

    Detlev

  • Hallo Detlev,


    > jetzt hab ich aber ein wenig ein schlechtes Gewissen weil ich dir diesen Floh ins Ohr gesetzt habe...


    Da mach dir mal keine Sorgen, das war so geplant. Die Anzeigen brauchte ich für mein nächstes Projekt.

    Eigentlich gab es nur ein Problem, dass war eine funktionierende "LiquidCrystal_I2C" zu finden. Es kamen entweder Fehlermeldungen, die ich nicht deuten konnte oder es kam der Fehler "302". Den kenne ich mittlerweile, nur mit dem Beheben ist es nicht so leicht, fast unmöglich. Die Fehlermeldungen kommen ja auch meistens nicht für die Zeile, in der der Fehler steckt.


    > Hut ab vor deiner Lernkurve!


    So toll war das nicht. Auch wenn der Umgang mit C für mich Neuland war (ist), Programmieren war ja mal (vor vielen Jahren) ein Teil meiner Arbeit. Ich weiß nicht, wie viele tausende Programmzeilen ich geschrieben habe. Nur waren die auf Maschinenebene.

    Aber wenn man das lehrbuchmäßig gemacht hat, dann gab es da auch nur Folgen, Alternativen und Zyklen. Das habe ich auch in C wiedergefunden. Auch die Programmierung in Ebenen ließ sich realisieren (Ablaufsteuerung, Hauptprogramme, Unterprogramme). Ich musste das nur alles wieder im Gedächtnis suchen . . .