Tipps zum Softwareumzug vom UNO auf ATmega328P gesucht

Hallo Gemeinde,

die Überschrift besagt eigentlich schon alles :slight_smile:

Ich möchte irgendwann wenn ich mit dem Testen der Sketche auf einem UNO mal fertig bin mit der Software auf einen nackten ATmega328P-PU umziehen.

Hierzu hätte ich gerne vorab ein paar Tipps damit der Umzug später problemloser machbar ist.

Der nackte ATmega328P-PU soll auf eine Platine zusammen mit einem 6-poligen ISP-Header (oder ist 10-polig besser) und einem 16 MHz Quarz.
Dazu kommt dann noch ein 5V Regler (7805) für den ATmega und einem 3,3V Regler (bitte Typvorschlag-kein SMD) für div. Peripherie (I < 100mA).

Wie kann ich den Sketch für den UNO anpassen damit ich möglichst einfach alle zum Testen enthaltenen Ausgaben über “Serial.print(…);” für den nackten ATmega abschalten kann (bedingte Kompilierung).

Als Programmer habe ich einen DIAMEX ALL-AVR (AVR-Programmer | ALL-AVR)
Was ist bei dessen Verwendung zu beachten und was ist in der IDE einzustellen?
Gibt es irgendwelche Fallstricke über die man gerne stolpert wenn man sowas zum ersten mal macht?

Etwas Brainstorming würde mir bereits helfen.
Es muss erst mal keine Schritt für Schritt Anleitung sein, obwohl das natürlch optimal wäre :slight_smile:

Herzlichen Dank für eure Hilfe im Voraus.
Viele Grüße und ein schönes WE
Peter

Wie kann ich den Sketch für den UNO anpassen damit ich möglichst einfach alle zum Testen enthaltenen Ausgaben über "Serial.print(...);" für den nackten ATmega abschalten kann (bedingte Kompilierung).

Am einfachsten geht es so:

#define DEBUG

#if DEBUG
    #define debugPrint(text) Serial.print(text)
    #define debugPrintln(text) Serial.println(text)
#else
    #define debugPrint(text)
        #define debugPrintln(text)
#endif

Dann verwendest du statt Serial.print() überall debugPrint(). Wenn jetzt DEBUG nicht gesetzt ist, ersetzt das der Präprozessor durch "nichts", d.h. es an der Stelle steht nichts mehr im Code.

Damit sparst du dir an allen Stellen einzeln Compile-Schalter zu setzen.

Auch das Serial.begin() bzw andere eventuelle Serial.xx() Funktionen müssen in die

if DEBUG - #endif Ummantelung.

Das "#if DEBUG - #endif" kann überall verwendet werden, auch in Funktionen wie setup() oder loop(), Du könntest auch jede einzelnen Seriel.print() in die #if DEBUG - #endif einkapseln aber der Ratschlag von Serenifly ist einfacher.

Grüße Uwe

Danke für die schnellen Antworten!!

Ich versuche das gerade umzusetzen und bekomme jetzt die Fehlermeldung 'debugPrint' was not declared in this scope

Folglich habe ich etwas missverstanden oder falsch umgesetzt. ich habe:

#if DEBUG
    #define debugPrint(text) Serial.print(text)
    #define debugPrintln(text) Serial.println(text)
#else
    #define debugPrint(text)
        #define debugPrintln(text)
#endif

als oberste Zeilen in meinen Sketch gepackt.

Dann habe ich über über Suchen und Ersetzen im gesamten Sketch aus Serial.printlndebugPrintlngemacht und aus Serial.printdebugPrint gemacht. Die Fehlermeldung kommt jetzt z.B. bei der Zeile    debugPrint(inStr[0][pv_i],HEX);

Sorry, mein Fehler. Dass muss so heißen:

#define DEBUG

#ifdef DEBUG
        #define debugPrint(text) Serial.print(text)
    #define debugPrintln(text) Serial.println(text)
#else
    #define debugPrint(text)
        #define debugPrintln(text)
#endif

void setup() 
{
#ifdef DEBUG
  Serial.begin(9600);
#endif
}

void loop() 
{
  debugPrintln("test");
  delay(1000);
}

ifdef Duh!

Ich habe das bei mir mit mehr Stufen drin. Also #define DEBUG 2 z.B. Dann muss es #if sein. Hatte ich beim kopieren und abändern übersehen :(

Das geht dann aber immer noch nicht mit zwei Argumenten. War mir nicht ganz klar, da ich Modifizierer wie HEX dabei nicht verwende.

Dafür kann man es dann so machen:

#ifdef DEBUG
        #define debugPrint(text) Serial.print(text)
    #define debugPrintln(text) Serial.println(text)
        #define debugPrint2(text, arg) Serial.print(text, arg)
    #define debugPrintln2(text, arg) Serial.println(text, arg)
#else
    #define debugPrint(text)
        #define debugPrintln(text)
        #define debugPrint2(text, arg)
        #define debugPrintln2(text, arg)
#endif

Dann geht das auch. Gerade ausprobiert :)

Vielleicht kennt noch jemand eine schönere Lösung. Funktionen überladen geht halt bei Makros nicht. Daher müssen die Unterschiedliche Namen haben

Danke nochmal an euch alle !!

Der letze Beitrag von @Serenifly mit "#ifdef DEBUG" und den beiden ".print" Versionen funktioniert --- FREU :) "eine schönere Lösung" muss nicht sein, wichtig ist dass es funktioniert. Auch @uwefed's Vorschlag hat geholfen "Serial.begin(115200);" bedingt abzuschalten. Ich glaube einiges über die bedingte Kompilierung gelernt zu haben und auch künftig anwenden zu können.

Was würde ich nur ohne die Hilfe dieses Forums machen, ich wäre wahrscheinlich noch bei den ersten 50 Zeilen meines Sketches und hätte wohl längst die Lust daran verloren. So sind es nun schon fast 2000 Zeilen und 50.256 Bytes Binäre Sketchgröße mit Debugausgabe ( 37 kB ohne).

Nun fehlen "nur" noch ein paar Handlingstipps zum Umgang mit dem "nackten" ATmega328P.

Gruß, Peter

ein paar Handlingstipps

Wenn du beim UNO auch ohne debugPrint Ausgaben klar kommst, sollte auch auf dem "nackten" atmega328p alles klar gehen.

Ansonsten: auf deiner platine auch Pins für Rx, Tx, GND , 5V vorsehen und dir einen einfachen USB-> TTL -UART Wandler besorgen. Und einen Reset-Taster auf die Platine. Dann hast du alles was du am UNO brauchst, gewohnt bist, und kannst evtl. sogar den atmega328p mit bootloader versehen und über den USB-Seriell laden. (Geschmackssache)

Die RX und TX Pins am "nackten" ATmega328P werde ich wohl nicht nutzen. Das Teil soll in seine "Blackbox" und dort seine Arbeit verrichten. Messwerte von Temperatur, Luftfeuchte, Druck ect. sammeln und nach Aufforderung senden. RF433 Sender und Empfänger über die "VirtualWire" Lib.

Die Hardware serielle Schnittstelle des ATmega328P und alle Ausgaben dorthin werden abgeschaltet. Ich weiß doch jetzt dank eurer Hilfe wie das geht. :)

Einen Reset Taster wollte ich mir auch ersparen. Wenn ich den Reset-Pin richtig beschalte klappt das auch wenn ich das Teil im Notfall kurz stromlos mache.

Inzwischen bin ich auch vom ISP-Header weg. Werde den 328P in einem passend verdrahteten Sockel programmieren und dann in seine "Blackbox" umstecken.

Gruß Peter

p.s. Die Blackbox wird ein IP65 Gehäuse und dann kommt das Ganze , geschützt vor direkter Sonneneinstrahlung und Regen, in den Garten. Ein Teil der Sensoren wird außerhalb des Gehäuses montiert und über Kabel angeschlossen. Bin schon gespannt wie stabil das Ganze bei Wind und Wetter und bei Temperaturen von -20°C bis +40°C läuft.

peter_de: Nun fehlen "nur" noch ein paar Handlingstipps zum Umgang mit dem "nackten" ATmega328P. Gruß, Peter

Nicht draufsetzen, vor allen Dingen nicht nackt, Das tut teuflisch weh. 28 Drähtchen sind deutlich zuwenig für ein Nadelbett. ;) ;) ;) ;)

Ich weiß jetzt nicht was ich Dir raten soll. Auf die richtige Position beim Einstecken in den Sockel achten. Beim Arduino muß er kopfstehend (Schriftzug) eingesetzt werden.

Grüße Uwe

michael_x:

ein paar Handlingstipps

Wenn du beim UNO auch ohne debugPrint Ausgaben klar kommst, sollte auch auf dem "nackten" atmega328p alles klar gehen.

Ansonsten: auf deiner platine auch Pins für Rx, Tx, GND , 5V vorsehen und dir einen einfachen USB-> TTL -UART Wandler besorgen. Und einen Reset-Taster auf die Platine. Dann hast du alles was du am UNO brauchst, gewohnt bist, und kannst evtl. sogar den atmega328p mit bootloader versehen und über den USB-Seriell laden. (Geschmackssache)

Wenn man RX und TX zum Updaten vorsehen will braucht man auch den RESET-Pin. Grüße Uwe

peter_de: Einen Reset Taster wollte ich mir auch ersparen. Wenn ich den Reset-Pin richtig beschalte klappt das auch wenn ich das Teil im Notfall kurz stromlos mache.

Du kannst als Resettaster auch ein ReedKontakt vorsehen; dann kannst durch das IP65 Gehäuse mit eimen Magneten resetieren. So könntest Du auch eine einfache 3 Tasten-Tastatur machen die immernoch IP65 ist.

Grüße Uwe

uwefed:

peter_de: Nun fehlen "nur" noch ein paar Handlingstipps zum Umgang mit dem "nackten" ATmega328P. Gruß, Peter

Nicht draufsetzen, vor allen Dingen nicht nackt, Das tut teuflisch weh. 28 Drähtchen sind deutlich zuwenig für ein Nadelbett. ;) ;) ;) ;)

Nach der Aktion hätte er wahrscheinlich eine recht seltsame Programmierung und wäre ein Fall für die Richtbank. :P :P

Mit den Handlingstipps meinet ich z.B: Welches Board und welchen Programmer wähle ich in der IDE aus um den ATmega328P mit meinem im Einganspost genannten DIAMEX ALL-AVR über ISP zu programmieren? Funktioniert das Programmieren eines jungfräulicher ATmega328P überhaupt aus der IDE heraus? Wie sieht die minimale Beschaltung des ATmega328P aus um ISP nutzen zu können? Läuft ein jungfräulicher ATmega328P bei Programmierung über ISP mit dem internen Taktgenerator, oder bekommt er sein Taktsignal über die ISP Schnittstelle, oder benötigt er einen extenen Quarz?

Danke für die Antworten Peter

p.s. Ich möchte den ATmega328P später nicht in seinem Feldgehäuse programmieren können. Wenn es eine Änderung gibt werde ich die im UNO erstellen und testen. Dann den Code in einer Minimalbeschaltung über ISP in einen leeren ATmega328P brennen und den fertigen Chip dann in sein Gehäuse im Garten stecken. So jedenfalls ist mein Plan, wenn das machbar ist.

Du wählst ein Board aus das den gleichen ATmega mit der gleichen Taktfrequenz / Taktquelle wie Dein Eigenbau hat. Sollte keine Entsprechung vorhanden sein mußt Du das File ergänzen. Den Programmierer in der Liste den ISP-Programmierer den Du hast oder dessen Äquivalent.

ääh. Er braucht einen Takt. Jungfreulich ist der interne 1MHz eingestellt und nach dem ersten Programmieren sollte dann die eingestellte Taktquelle der vorhandenen HW entsprechen.

Grüße Uwe

Wenn du den ATmega mit 16 MHz betreibst wie im ersten Post beschrieben, kannst du als Board einfach das UNO auswählen und dein Sketch mit "Upload mit Programmer" programmieren.

Minimalschaltung findest du z.B. hier auf der Seite von Nick Gammon http://www.gammon.com.au/forum/?id=11637 Ich denke ansonsten gibt es nicht viel zu beachten. Evtl. könntest dir auch den externen Quarz sparen, wenn dir der interne Takt von 8 MHz ausreicht.