Arduino Pro Mini mit Arduino Uno oder Nano über ISP Schnittstelle Programmieren

1. Das Ziel

1.1. Vorwort

Leider ist mir der Flash Speicher im ATtiny84, der im TinyTx4 verbaut ist ausgegangen. Die China Klone des Arduino Pro-Mini sind kostengünstig (ca. 1.70 EUR / St. inklusive Versandkosten, Stand Juli 2017), relativ klein und mit einem AtMega328P ausgestattet. Aufgrund der weiten Verbreitung des Prozessors und der hohen Zahl verfügbarer Software-Pakete und -Module ist der Pro Mini die erste Wahl bei der Entwicklung eines TX Nodes. Wenn es schnell gehen muss. Die Umrüstung meiner Skteche von Attiny84 auf ATMega328P gestaltete sich problemlos.

1.2. Umbau des Arduino Pro Mini für Langzeitbatteriebetrieb

den Umbau für einen Batteriebetrieb des Pro Mini mit extrem niedrigem Stromverbrauch habe ich hier beschrieben:

Mini – Low Cost – TX Node auf Basis des ATMEGA328P (Teil 1)

Nicht alle Module haben das gleiche Layout, das heisst der Umbau gestaltet sich auf so manchem Modul schwieriger als auf anderen. Eine ruhige Hand und ein gutes Auge (Lupe) sind allemal erforderlich.

1.3. Verwendung des PRO-Mini in einem Low-Power TX Node

Der TX Node soll direkt von einer 3V Lithium Knopfzelle betrieben werden, wobei der Energieverbrauch des TX Nodes so niedrig sein soll dass die Batterie mindestens 3 Jahre hält.

Der Pro-Mini kommt mit externem 8 MHz Resonator und einem 3.3V LDO. Um ihn bis herunter auf 1.8V betreiben zu können, muss der Prozessor  bei 1MHz getaktet werden. Dies spart ausserdem Energie, wie ich in einem anderen Blog bereits beschrieben  habe.  Wie das beim ATtiny84 geht, habe ich in diesem Beitrag bereits beschrieben. Beim AtMega328 geht das genauso, nur muss ich noch verifizieren dass der Energiebedarf ähnlich wie beim Attiny84 mit sinkender Versorgungsspannung sinkt. Der ATMega328 verhält sich genauso wie der AtTiny, die Messdaten sind nahezu identisch.

1.4. Programmieren des Pro-Mini über ISP Schnittstelle

Da der Prozessor aus Kostengründen mit internem 8MHz Oszillator auf 1 MHz getaktet werden soll, spare ich mir das Herumgetue mit einem für diese Betriebsart kompatiblen Bootloader, auch wenn ein solcher zu existieren scheint. Stattdessen kommt ein ISP („In System Programmer“) zum Einsatz, der sich schnell und unkompliziert mit einem Arduino UNO oder Nano einrichten lässt  (Link).

Dies bringt mir etwas mehr Flash Speicherplatz und ausserdem gewinne ich 2 Digitale I/O Pins, da D0 und D1 jetzt für das serielle Interface frei sind. Ausserdem braucht man für das native serielle Interface weniger Flashspeicher gegenüber der „SoftwareSerial“ Variante.

Bei meinen Bemühungen habe mich an diesem ausgezeichneten Post orientiert:

https://www.iot-experiments.com/arduino-pro-mini-1mhz-1-8v/

2. Hardware vorbereiten

Die Beschreibung meines ISP Adapters spare ich mir hier, im wesentlichen benutze ich dazu eine ZIF-Fassung (Textool) auf einer separaten Lochrasterplatine. Beschreibungen selbst gemachter Adapterkabel gibt es im Netz wie Sand im Meer.

Aufpassen muss man nur bei der Versorgungsspannung. Wenn diese vom Programmer kommt, sollte man

  1. alle anderen Versorgungen vorsichtshalber abklemmmen.
  2. aufpassen, dass die Spannung 3.3V und nicht 5V beträgt. So manche angeschlossene Peripherie verträgt das nicht (z.B. ein RFM69 Funkmodul)!

Wenn die Versorgung extern eingespeist werden soll, muss man sicher stellen, dass der Programmer keine Spannung am VCC Pin über den ISP Adapter liefert (abklemmen!).

3. Fuses mit avrdude programmieren

3.1. avrdude einrichten

Windows 10:

Damit avrdude ohne Probleme in der Konsole gestartet werden kann, sollte man einen Pfad zu avrdude in den „Environment Variables“ eintragen:
Rechts-Klick auf Start -> System -> About-> System Info ->Advanced System Settings -> Advanced -> Environment Variables

Unter „User Variables for <User>“ (oben) die Variable „Path“ editieren und den Pfad zu avrdude.exe hinzufügen. In meinem Fall ist das

C:\Users\<user>\AppData\Local\Arduino15\packages\arduino\tools\avrdude\6.3.0-arduino9\bin

Zusätzlich habe ich eine variable „AVRPATH“ erzeugt (Klick auf „New…„) die auf das avrdude Verzeichnis zeigt: 

C:\Users\<user>\AppData\Local\Arduino15\packages\arduino\tools\avrdude\6.3.0-arduino9

3.2. Fuses auslesen

Windows10:

Konsole (Command Prompt) öffnen. Nachfolgende Eingabe mit Enter bestätigen.

avrdude_2

Option -c wählt den verwendeten  ISP Programmer aus. „-c stk500v1“ wird benutzt fuer den „Arduino as ISP“ Programmer, bei mir ist das ein Arduino UNO R3 (China Klon). Das hab ich mir bei der Arduino IDE abgeschaut.

Option -P wählt die serielle Schnittstelle aus, diese muss man vorher herausfinden. Wie das geht hängt vom jeweiligen USB Treiber und vom OS ab. Bei meinem chinesischen UNO ist ein CH340 Chip verbaut. Auf Windows 10 musste ich den Treiber erst im Netz suchen und manuell installieren. Nach Einstecken des UNOs in einen freien USB Schacht wird der UNO erkannt und ist als serieller COM Port im System sichtbar.

Option -b bestimmt die Baud Rate. Diese *muss*  auf 19200 eingestellt werden, anders gehts (bei mir) nicht. Die Baudrate ist im Sketch des Programmers fest eingestellt.

Ergebnis:

avrdude_1

3.3. Fuses berechnen

Fuse Berechnung online. Das hilft die Fuses richtig zu bestimmen. In diesem Fall will ich erst einmal „8 MHz internal Oscillator, BOD disabled“ programmieren. „BOD“ steht für brown out detection, und die *muss* abgeschaltet sein da der ATMega sonst im Schlafmodus mehr Strom verbraucht als ich tolerieren kann/will.

So komme ich auf folgende Werte:

  • LOW Fuse: 0xE2
  • High Fuse: 0xD9
  • Extended fuse: 0xFF

Soll der Pro-Mini mit „1 MHz, internal Oscillator, BOD disabled“ betrieben werden, brenne ich folgende Werte:

  • LOW Fuse: 0x62
  • High Fuse: 0xD9
  • Extended fuse: 0xFF

3.4. Fuses programmieren

In der Konsole gebe ich jetzt, um z.B die LOW Fuse zu brennen diese Optionen ein:

  • -U lfuse:w:0x62:m
  • -U hfuse:w:0xD9:m
  • -U efuse:w:0xFF:m

die gesamte Befehlszeile sieht dann so aus:

avrdude -C %AVRPATH%/etc/avrdude.conf -c stk500v1 -P COM10 -b 19200 -p atmega328p -U lfuse:w:0x62:m -U hfuse:w:0xD9:m -U efuse:w:0xFF:m

4. Arduino IDE einrichten

Solange die Taktfrequenz 8MHz betragen soll, braucht man an der Arduino IDE nichts besonderes einrichten.

Für die 1Mhz Variante muss man die Arduino IDE dazu bringen, beim kompilieren die Option „-DF_CPU=1000000L“ zu verwenden. Dies bewerkstellige ich indem ich die 8 MHz Variante in der Datei boards.txt kopiere und daraus eine eine neue Variante mache. Der Unterschied zum 8 MHz Eintrag ist die Kompilieroption -DF_CPU=1000000L,  der Name des Eintrags „1MHzatmega328Int„, und natuerlich die Bezeichnung des Eintrags im Menu, hier „ATmega328 (3.3V, 1 MHz internal)„. Die Fuses sind optional, da ich diese nicht mit der Arduino IDE programmiere(n will).

Bei mir sieht der Eintrag in der boards.txt so aus:

## Arduino Pro or Pro Mini (3.3V, 1 MHz) w/ ATmega328 internal Osc.
## --------------------------------------------------
pro.menu.cpu.1MHzatmega328Int=ATmega328 (3.3V, 1 MHz internal)

pro.menu.cpu.1MHzatmega328Int.upload.maximum_size=30720
pro.menu.cpu.1MHzatmega328Int.upload.maximum_data_size=2048
pro.menu.cpu.1MHzatmega328Int.upload.speed=57600

pro.menu.cpu.1MHzatmega328Int.bootloader.low_fuses=0x62
pro.menu.cpu.1MHzatmega328Int.bootloader.high_fuses=0xD9
pro.menu.cpu.1MHzatmega328Int.bootloader.extended_fuses=0xFF

pro.menu.cpu.1MHzatmega328Int.build.mcu=atmega328p
pro.menu.cpu.1MHzatmega328Int.build.f_cpu=1000000L

Nach dem Neustart der Arduino IDE wählt man das 1 MHz Pro-Mini Board aus:

ArduinoIDEreworked1

5. Test Sketch hochladen

Für den ersten Test eignet sich der Sketch „Blink.ino“ ganz hervorragend:

  1. Man verifiziert dass ein Sketch kompiliert und hochgeladen werden kann.
  2. Indem man die AN/AUS Frequenz der LED beobachtet, kann man sehr schnell feststellen ob der CPU Takt richtig eingestellt ist.

Ich habe einen Arduino UNO R3 als Programmer umgerüstet, und wie in Punkt 1.3 bereits beschrieben benutze ich den SPI Port des Arduino Pro-Mini zum Programmieren.

Wie in obiger Abbildung zu sehen, wählt man zunaechst das richtige Board aus. In der Abbildung ist dies ein Pro-Mini bei 1 MHz mit abgeschalteter BOD.

ArduinoIDE2Zum Komilieren und Flashen klickt man nun im Menu auf Sketch->Upload using Programmer oder Shift+Ctrl+U (siehe Abbildung). Würde man nur auf den Upload Knopf klicken,  verweigert die IDE das Flashen (bestenfalls) oder aber die IDE meint den Programmer flashen zu müssen, was im schlechtesten Fall sogar gelingt (heisst, der Programmer ist mit dem Sketch geflasht, nicht der Pro-Mini.

Beim ATtiny funktioniert das mit dem Upload Knopf, ich muss mal forschen was man da machen muss dass es beim Pro-Mini auch so funktioniert.

Hinterlasse einen Kommentar