MiniEVB Boards – ein Überblick

Über den Beitrag

Die MiniEVB Boards unterscheiden sich vor allem in der Ausführung ihres zugrundeliegenden Mikrocontrollers LGT8F328P. Hinzu kommen unterschiedliche Board-Layouts, die dem Arduino Nano oder Pro Mini nachempfunden sind. Beides zusammen bestimmt, welche Port Pins und Funktionen vorhanden sind und über welche Board Pins ihr sie erreicht. Und da das durchaus verwirrend ist, habe ich dem Thema einen ganzen Beitrag gewidmet. Außerdem gehe ich auf den Stromverbrauch der verschiedenen Boards im Wach- sowie im Schlafmodus ein.

Wie ihr LGT8F328P Boards programmiert und wie sie sich von ATmega328P Boards unterscheiden, hatte ich in meinem letzten Beitrag am Beispiel der LQFP32 Boards beschrieben. 

Auf diese Themen gehe ich ein:

Zur Ansteuerung der MiniEVB Boards verwende ich, wie schon im letzten Beitrag, das großartige Boardpaket lgt8fx von David Buezas.

Überblick

Der LGT8F328P ist in den Bauformen QFP48L, QFP32L und SSOP20 verfügbar (klickt auf das Bild, um es zu vergrößern):

LGT8F328P als QFP48L, QFP32L und SSOP20 (aus Datenblatt)
LGT8F328P als QFP48L, QFP32L und SSOP20 (aus Datenblatt)

Bevor wir weiter in die Details gehen, möchte ich noch ein paar Begriffe definieren, damit wir dieselbe Sprache sprechen:

  • Als Port Pins bezeichne ich die Portein-/Portausgänge, wie z.B. PB0, PD7 usw.
  • IC Pins sind die physikalisch vorhandenen Pins des LGT8F328P Chips.
  • Board Pins sind die ausgeführten Pins der MiniEVB Boards, also die Kontakte, die ihr über die Pinleisten erreicht.

Der Begriff „Port Pin“ ist eigentlich nicht besonders gut, da ein Port Pin an sich kein Pin ist. Besser wäre vielleicht „GPIO“ (General Purpose Input Output). Das ist allerdings in der Arduino / AVR Welt eher unüblich. Egal, Hauptsache ihr wisst, was gemeint ist.

Die Bauform des ICs bestimmt, welche Port Pins des LGT8F328P als IC Pins ausgeführt sind und welche Funktionen ihnen zugeordnet wurden. Dann wird es ein wenig unübersichtlich:

  • Der QFPL32 IC führt die beiden Port Pins PD1 und PF1 auf demselben IC Pin aus (obwohl das aus dem Pinout Diagramm des Datenblatts nicht hervorgeht). Dasselbe gilt für PD2 und PF2. 
  • Der SSOP20 IC hat noch mehr doppelt belegte IC Pins, einer ist sogar dreifach belegt (PD3, PD4, PF4).
  • Auf den MiniEVB Boards wiederum werden nicht alle eigentlich vorhandenen IC Pins als Board Pins ausgeführt.

Die folgende Tabelle fasst zusammen, welche Port Pins auf den MiniEVBs als Board Pins ausgeführt sind, für welche das nicht der Fall ist und welche sich einen IC bzw. Board Pin teilen.

Ausführung der Port Pins auf verschiedenen MiniEVB Boards
Einfarbig: Eindeutiger Board Pin vorhanden, farbig/grau: mehrfach genutzter Board Pin vorhanden, grau: kein Pin vorhanden

Daraus ergibt sich:

Verfügbare Pins der MiniEVB Boards im Vergleich zum Arduino Nano
Verfügbare Pins der MiniEVB Boards im Vergleich zum Arduino Nano

Hinweise zu Zählung:

  • Da die analogen Pins auch als digitale Pins nutzbar sind (Ausnahme: A6/A7 am originalen Nano), habe ich sie als digitale Pins mitgezählt. Es handelt sich also um die maximal verfügbare Anzahl digitaler Pins.
  • Pins, die nur einmal am LGT8F328P vorhanden sind, aber mehrfach am Board ausgeführt werden, habe ich nur einmal berücksichtigt.
  • Mehrfach belegte Board Pins habe ich nur einfach gezählt.

LQFP48 MiniEVB („Nano Style“)

Wir schauen uns die Boards im Detail an und beginnen mit dem „Nano Style“ LQFP48 MiniEVB.

Der LGT8F328P besitzt im Vergleich zum ATmega328P die zusätzlichen Ports E und F und den Pin PC7. Das macht insgesamt 40 Port Pins, die alle auf dem QFP48L IC ausgeführt sind. PB6 und PB7 werden auf dem LQFP48 MiniEVB für den externen Oszillator verwendet. Sie sind deshalb nicht über Board Pins erreichbar. PC6 ist die Resetfunktion zugeordnet, was gewisse Einschränkungen mit sich bringt.

Pinout LGT8F328P LQFP48 MiniEVB
Pinout LGT8F328P LQFP48 MiniEVB

Interessant ist, dass der QFP48L einen Ausgang für den Output Compare Match des Timer3 besitzt, nämlich OC3A. Diesen könnt ihr für PWM Signale nutzen, ohne einen der I/O Pins damit zu blockieren. Durch geeignete Programmierung des Timer3 könnt ihr OC3A aber auch wie einen zusätzlichen digitalen Output Pin nutzen. Dazu kommen wir noch.

Resetpin als I/O Pin nutzen (alle MiniEVB Boards)

Wenn euch die Pins nicht reichen, dann könnt ihr den Reset Pin sehr einfach zum I/O Pin umfunktionieren. Macht das aber nur, wenn ihr wisst, was ihr da tut! Folgendes ist zu beachten:

  • Habt ihr den Reset Pin zum I/O Pin gemacht, könnt ihr eure Sketche danach nur noch per LArduinoISP hochladen, oder:
  • Ihr macht den Reset Pin wieder zum Reset Pin, indem ihr den Bootloader brennt. Dazu müsst ihr aber auch wieder den Umweg über LArduinoISP gehen.
  • Der Reset Pin wird, unabhängig von euren Einstellungen, während des Bootens als Reset Input konfiguriert. D. h. selbst wenn ihr ihn als I/O Pin nutzt, dürft ihr ihn beim Booten nicht auf GND ziehen. Solltet ihr das dennoch tun, bleibt der LGT8F328P im Reset Modus hängen.

Falls ihr, trotz dieser Einschränkungen, immer noch probieren wollt, den Reset Pin umzufunktionieren, dann könntet ihr jetzt eine LED an den Reset Pin hängen und den folgenden Sketch hochladen:

void setup(){ 
    PMX2 |= (1<<WCE); // change enable 
    PMX2 |= (1<<C6EN); // enable PC6 (RST) as I/O Pin
    pinMode(28, OUTPUT); // RST = 28 for QFP48L, RST = 27 for QFP32L / SSOP20
} 

void loop() {
    digitalWrite(28, HIGH);
    delay(200);
    digitalWrite(28, LOW);
    delay(200);   
} 

Zeile 2 setzt das Change Enable Bit WCE im I/O Reset Register PMX2. Erst danach können Änderungen im Register vorgenommen werden. In Zeile 3 wird das Bit C6EN gesetzt, was den Reset Pin zum normalen I/O macht. So einfach ist das.

SWC und SWD als I/O Pins nutzen (alle MiniEVB Boards)

Auch die für die Programmierung per LArduinoISP benötigten Pins SWC und SWD können als normale I/O Pins genutzt werden. Dazu müsst ihr keine besonderen Einstellungen vornehmen. Allerdings gibt es einen Punkt beim Upload per LArduinoISP zu beachten. Das funktioniert nämlich so ohne Weiteres nur einmal. Wenn ihr einen Sketch auf den MiniEVB geladen habt, der SWD oder SWC als normalen I/O Pin nutzt, bekommt ihr beim nächsten Uploadversuch per LArduinoISP eine Fehlermeldung. Abhilfe: Haltet die Resettaste des zu programmierenden Boards während des Uploads gedrückt.

Alternative Output Pins benutzen (alle MiniEVB Boards)

Das LQFP48 MiniEVB Board besitzt nicht nur viele I/O-Pins, es lassen sich zudem viele Funktionen an alternative Pins verlegen. Das gilt für RX, TX, SS und die meisten PWM-Kanäle. Die alternativen PWM-Ausgänge habe ich im Pinout Diagramm mit einem Sternchen gekennzeichnet.

Um die alternativen Ausgänge zu nutzen, müsst ihr lediglich das Change Enable Bit in PMX0 setzen und danach das für die Funktion zuständige Bit in PMX0 oder PMX1.

Die folgende Tabelle gibt einen Überblick über die Bits und ihre Wirkung hinsichtlich der Ausgänge:

Festlegung der PWM Output Pins über PMX0 und PMX1
Festlegung der PWM Output Pins

Ein Beispiel

Der folgende Sketch erzeugt ein PWM-Signal an PB3 (D11), dem Standard OC2A Ausgang. Entkommentiert ihr die Zeilen 5 bis 7 und kommentiert ihr Zeile 8 aus, dann erhaltet ihr das PWM Signal am alternativen Ausgang PF6 (D38).

void setup(){
  noInterrupts();
  TCCR2A = (1<<COM2A0);
  TCCR2B = (1<<CS20);
//  PMX0 = (1<<WCE);
//  PMX1 = (1<<C2AF6);
//  DDRF = (1<<DDF6);
  DDRB = (1<<DDB3);
  OCR2A = 85;
  interrupts();
}
void loop(){}

OC0A Alternativen

OC0A ist ein Sonderfall, da ihr die Ausgabe von PD6 (D6) nach PC0 (A0) verlegen könnt oder an PC0 (A0) und PE4 (D31). Hier ein Beispiel für die Ausgabe an PC0:

void setup(){
  noInterrupts();
  TCCR0A = (1<<COM0A0);
  TCCR0B = (1<<CS00); // Normal mode
  PMX0 = (1<<WCE);  // Change enable
  PMX0 = (1<<C0AC0);  // OC0A output at PC0 (= A0/14)
  DDRC = (1<<DDC0); // Set PC0 to output
  OCR0A = 85;
  interrupts();
}

void loop(){}

Und so sieht ein Sketch für die gleichzeitige Ausgabe an beiden alternativen Pins aus:

void setup(){
  noInterrupts();
  TCCR0A = (1<<COM0A0);
  TCCR0B = (1<<OC0AS)| (1<<CS00);  // Normal Mode, Output at PE4 (31)
  PMX0 = (1<<WCE);  // Change enable
  PMX0 = (1<<C0AC0); // OC0A output at PC0 (= A0/14)
  DDRC = (1<<DDC0); // Set PC0 to output
  DDRE = (1<<DDE4); // Set PE4 to output 
  OCR0A = 85;
  interrupts();
}

void loop(){}

Einziger Unterschied: Im zweiten Sketch wurde zusätzlich das OC0A Select Bit OC0AS im Timer Counter 0 Control Register B (TCCR0B) gesetzt und PE4 als Output eingestellt.

Wer keine Lust hat, sich die ganzen Bits und Register für die PWM Programmierung aus Tabellen herauszusuchen, dem empfehle ich das Tool Arduino Web Timers. Es erlaubt euch, die Timer und PWM Einstellungen aus Auswahlen „zusammenzuklicken“ und gibt euch den fertigen Code aus. Das Tool funktioniert sowohl für den LGT8F328P wie für den ATmega328P und ATmega328PB.

OC3A als Output Pin (nur LQFP48 MiniEVB)

Manchmal ist es der eine Pin, der einem fehlt, um sein Projekt umsetzen zu können. Falls das bei euch so sein sollte, dann könnt ihr den Ausgang OC3A zu einem digitalen Output Pin umfunktionieren. Um ihn auf HIGH zu setzen, erzeugt ihr ein PWM Signal mit 100 % Duty Cycle. Für LOW ist der Duty Cycle entsprechend 0 %.  Hier ein Blink-Sketch für OC3A:

void setup(){
  noInterrupts();
  TCCR3A = (1<<COM3A1); // Clear OC3A on compare match
  TCCR3B = (1<<WGM32) | (1<<CS30); // Top = OCR3A / no prescaler
  PMX0 = (1<<WCE); // change enable 
  PMX1 = (1<< C3AC); // Output at AC0P (OCR3A)
  OCR3A = 0; // OC3A will be cleared / set immediately
  interrupts();
}

void loop(){
    setOCR3A(HIGH);
    delay(500);
    setOCR3A(LOW);
    delay(500);
}

void setOCR3A(bool setOn){
    noInterrupts();
    if(setOn){
        TCCR3A = (1<<COM3A1) | (1<<COM3A0); // Set OC3A on compare match
    }
    else{
        TCCR3A = (1<<COM3A1); // Clear OC3A on compare match
    }
    interrupts();
}

80 mA Output (alle MiniEVB Boards)

Das LQFP48 MiniEVB Board hat alle sechs 80 mA Ausgänge ausgeführt. Der folgende Sketch zeigt am Beispiel von Ausgang PF2 / Pin 34, wie ihr die 80 mA Funktion aktiviert:

/*
       HDR      Port/Pin     Arduino Pin
       HDR0       PD5            5
       HDR1       PD6            6
       HDR2       PF1           33
       HDR3       PF2           34
       HDR4       PE4           36
       HDR5       PF5           32 
*/

void setup(){    
/* example for activating PF2/34 for high current */
    HDR |= (1<<HDR3);
    pinMode(34, OUTPUT);
}
  
void loop(){
    digitalWrite(34, HIGH);
    delay(500);
    digitalWrite(34, LOW);
    delay(500); 
}

Aber seit hier besonders vorsichtig bei den Boards (zu denen wir noch kommen), die zwei Port Pins an einem IC Pin ausführen – ihr könntet einen Kurzschluss verursachen.

Analoge Differenzmessungen (alle Mini EVB Boards)

Ein Vorteil der MiniEVB Boards gegenüber den AVR basierten Arduinos ist die Möglichkeit Differenzmessungen durchzuführen und die Messwerte zu verstärken. Mit dem LQFP48 MiniEVB könnt ihr die folgenden Pinkombinationen für Differenzmessungen einsetzen:

Pin Kombinationen für die analoge Differenzmessung
Pin Kombis für die analoge Differenzmessung (Copyright D. Buezas)

Die Grafik habe ich der Dokumentation der differential_amplifier Bibliothek entnommen (hier). Wie ihr die Bibliothek einsetzt, habe ich hier beschrieben und möchte das an dieser Stelle nicht wiederholen. 

LGT8F328P LQFP32 MiniEVB („Nano Style“)

LGT8F328P LQFP32 MiniEVB Boards im „Nano Style“

Den „Nano Style“ LQFP32 MiniEVB gibt es derzeit in zwei Ausfertigungen. Das grüne Board hat einen Micro-USB Anschluss, besitzt keinen externen Oszillator und nutzt den HT42B534-2 als USB-zu-TTL Chip. Das lilafarbene Board hat einen USB-C-Anschluss, einen 16 MHz Oszillator und nutzt den CH9340C USB-zu-TTL Chip. Beide Varianten haben dieselbe Pinbelegung. Die Pinbezeichnungen und ihre Positionen an den langen Seiten entsprechen denen des Arduino Nano.

Pinout LGT8F328P LQFP32 MiniEVB "Nano Style"
Pinout LGT8F328P LQFP32 MiniEVB „Nano Style“

Alles Weitere ergibt sich aus dem Pinout Schema. PF1 und PF2 werden zusammen mit PD1 und PD2 ausgeführt. Dadurch sind OC3A und OC3B nutzbar. Ansonsten fehlt die Ausführung der PORTF Pins. Von PORTE sind nur 5 Pins ausgeführt und PORTC fehlt die Ausführung von PC7. 

Trotz seiner Ähnlichkeit zum Arduino Nano hat das Board fünf zusätzliche digitale Ein-/Ausgänge. Zum einen sind AREF, A6 und A7 digital nutzbar, hinzu kommen die Pins SWC und SWD.

Was ist besser – lila oder grünes Board?

Abgesehen von den farblichen Vorlieben gibt es aus meiner Sicht zwei technische Gesichtspunkte zu berücksichtigen:

  • Der Stromverbrauch des lilafarbenen Boards ist geringer. Weiter unten komme ich dazu im Detail.
  • Für zeitkritische Anwendungen ist der externe Oszillator des lilafarbenen Boards von Vorteil.

Der interne Oszillator des LGT8F328P ist laut Datenblatt auf eine Abweichung von maximal 1 % (10000 ppm) kalibriert. Nähere Angaben über die Bedingungen, wie z. B. die Temperatur, habe ich nicht gefunden. Für externe Oszillatoren werden Frequenzstabilitäten im Bereich 10 – 100 ppm angegeben. Bei 100 ppm Abweichung würde eine „millis() – Uhr“ (siehe z. B. hier) theoretisch 8.6 Sekunden am Tag abweichen.

Ich habe einen Praxistest gemacht, indem ich mit dem lilafarbenen Board die Abweichung einer millis() – Uhr bei Nutzung des internen und des externen Oszillators getestet habe. Ergebnis:

  • intern: 0.42 % (363 Sekunden / Tag)
  • extern: 0.05 % (43 Sekunden / Tag)

Der externe Oszillator ist zwar genauer, die Abweichung aber höher, als es die Frequenzstabilität vermuten ließe. Das liegt daran, dass die Frequenzstabilität lediglich angibt, wie die Frequenz unter bestimmten Bedingungen über einen gewissen Zeitraum von einem Ausgangswert abweichen kann. Sie gibt also nicht die absolute Abweichung an, die von weiteren Parametern abhängt.

Die Messungen habe ich nur einmal durchgeführt. Nehmt die Ergebnisse also als einmaligen Erfahrungswert.

Einen Nachteil hat das lila Board, und zwar lässt es sich aus mir bisher nicht klaren Gründen nicht als LArduinoISP Programmer einsetzen.

LGT8F328P LQFP32 MiniEVB, „Pro Mini Style“

Der LGT8F328 LQFP32 MiniEVB im „Pro Mini Style“ unterscheidet sich von seinem „Nano Style“ Pendant in einigen Aspekten:

  • Die Anordnung der Board Pins ist unterschiedlich.
  • Es fehlt der USB-zu-TTL Adapter.
  • PE6 (AREF) ist nicht als Boardpin ausgeführt.
  • Es gibt das Board wahlweise mit 5V oder 3.3V Spannungsregler
    • das kann für die Ansteuerung von 3.3V Bausteinen sehr hilfreich sein
Pinout LGT8F328P LQFP32 MiniEVB ("Pro Mini Style")
Pinout LGT8F328P LQFP32 MiniEVB („Pro Mini Style“)

Es ist mir ein Rätsel, warum die Designer des „Pro Mini Style“ LQFP32 MiniEVB den Referenzspannungspin nicht ausgeführt haben. Wahrscheinlich wollte man dem originalen Arduino Pro Mini möglichst nahekommen. Aber hier wäre Verbesserungspotential gewesen. Man hätte dafür auf die dreifache Ausführung des Reset Pins oder die fünffache (!) Ausführung von GND verzichten können. Wer geschickt ist, kann einen Anschluss direkt an das Beinchen (Nr. 20) des LGT8F328P löten. Aber eigentlich kauft man ja Boards, um so etwas nicht machen zu müssen. 

LGT8F328P SSOP20 MiniEVB, „Pro Mini Style“

Der LGT8F328P SSOP20 MiniEVB im „Pro Mini Style“ ist ein sehr eigentümliches Board, was aber im Wesentlichen seinem zugrundeliegenden LGT8F328P IC geschuldet ist. Viele Port Pins sind nicht ausgeführt und einige Port Pins teilen sich einen Board Pin.  

Pinout LGT8F328P SSOP20 MiniEVB („Pro Mini Style“)

Der folgende Sketch lässt eine LED am Boardpin 3/4 über seine zugrundeliegenden Port Pins PD3, PD4 und PF4 Funktionalität leuchten. Dabei ist zu beachten, dass man bei Doppelt- oder Dreifachbelegung niemals einen der betroffenen Portpins auf OUTPUT / HIGH stellen sollte, während der oder die anderen auf OUTPUT / LOW stehen. Die Folge ist ein Kurzschluss. Günstigstenfalls bleibt nur die LED dunkel.

void setup(){}

void loop(){
    DDRD = (1<<DDD3);
    PORTD |= (1<<PD3);
    delay(200);
    PORTD &= ~(1<<PD3);
    delay(200);

    DDRD = (1<<DDD4);
    PORTD |= (1<<PD4);
    delay(200);
    PORTD &= ~(1<<PD4);
    delay(200);
    DDRD = 0;
    
    DDRF = (1<<DDF4);
    PORTF |= (1<<PF4);
    delay(200);
    PORTF &= ~(1<<PF4);
    delay(200);
    DDRF = 0;

    delay(2000);
}

Ich persönlich sehe keinen Grund, weswegen man das SSOP20 MiniEVB „Pro Mini Style“ Board einsetzen sollte. Wenn es ein Board im Pro Mini Design sein soll, würde meine Wahl immer auf die LQFP32 Variante fallen. Auch der Größenunterschied ist gering. Die SSOP20 Ausführung ist lediglich einen Pin kürzer, also 2.54 Millimeter. 

Stromverbrauch

Stromverbrauch im Wachmodus

Um den Stromverbrauch im Wachmodus zu messen, habe ich zunächst den folgenden Sketch auf die zu testenden Boards geladen:

void setup() {}

void loop() {
  delay(10000);
}

Dabei habe ich die jeweils zugrundeliegende LGT8F328 Variante eingestellt und die Frequenz über den Clock Divider in der Arduino IDE variiert. Dann habe ich das Board vom PC getrennt, es über ein Labornetzteil mit Spannung versorgt und den Strom gemessen.

Für die Stromversorgung ohne Computer gibt es drei Optionen:

  1. Mit einem Stecker über den USB-Anschluss (sofern auf dem Board vorhanden)
    • Nachteil: die Schutzdiode auf dem Board reduziert die Spannung um ca. 0.3 Volt
    • Vorteil: Verpolungsschutz
  2. Über VIN bzw. RAW (Bezeichnung variiert)
    • Nachteil: höhere Spannungen benötigt (min. 6.5 Volt)
    • Vorteil: stabile Versorgung mit 5 Volt, solange die Spannungsquelle mind. 6.5 V liefert
  3. Über VCC bzw. 5V (Bezeichnung variiert).
    • Nachteil: bei Akkubetrieb ändert sich mit dem Ladezustand auch die Betriebsspannung
    • Vorteil: Spannungsversorgung < 5 Volt möglich, z. B. Betrieb mit Li-Ionen Akku.

Da ich den Einfluss der Betriebsspannung auf den Stromverbrauch prüfen wollte, habe ich mich für die Option 3 entschieden. 5 Volt oder 3 Volt kamen als Betriebsspannung zum Einsatz.

Neben dem LGT8F328P verbrauchen auch die LEDs, der Spannungsregler (obwohl „von hinten“ betrieben) und ggf. der USB-zu-TTL Adapter Strom. Um diesen Einfluss zu ermitteln, habe ich einen LQFP32 „Pro Mini“ genommen und die LEDs bzw. die LEDs und den Spannungsregler entfernt.  

Ergebnisse

Zum Teil waren die Ergebnisse recht überraschend:

Stromverbrauch der MiniEVB Boards in Abhängigkeit von Frequenz und Betriebsspannung

Schlussfolgerungen:

  • Durch eine Absenkung der Taktrate könnt ihr den Stromverbrauch signifikant senken.
  • Eine Absenkung der Betriebsspannung von 5 Volt auf 3 Volt bringt bei den (nicht modifizierten) Boards eine Einsparung von 3 bis 4 Milliampere. Eine Ausnahme ist das grüne LQFP32 „Nano Style“, dazu weiter unten mehr.
  • Die Betriebs-LED verbraucht ca. 1.3 Milliampere bei 5 Volt und 0.6 Milliampere bei 3 Volt
  • Der Spannungsregler „frisst“ bei 5 Volt um die 4 Milliampere, bei 3 Volt sind es ca. 2.3 Milliampere.
  • Die Einsparungen durch Absenkung der Betriebsspannung sind im Wesentlichen durch die LEDs und den Spannungsregler bedingt.

Zum Vergleich: ein auf dem ATmega328P / CH340G basierender Arduino Nano (16 MHz / 5 V) verbrauchte 22.3 Milliampere.

Den Strombedarf des grünen LQFP32 „Nano Style“ Boards senken

Der hohe Strombedarf des grünen LQFP32 „Nano Style“ Boards bei 5 Volt sticht ebenso heraus wie die Einsparung von ca. 15.5 Milliampere beim Absenken der Betriebsspannung auf 3 Volt. Diese Phänomene hängen mit dem USB-zu-TTL Chip HT42B534 (Datenblatt hier) zusammen. Eigentlich sollte sich der HT42B534 bei Trennung der USB Verbindung schlafen legen, was er aber offensichtlich zumindest bei 5 V Spannungsversorgung nicht tut. Der CH9340C auf dem lilafarbenen Board macht das besser.

Pull-Down Widerstand für "D-" des HT42B534
Pull-Down Widerstand für „D-“ des HT42B534
Weitere Hilfsmittel, "D-" auf LOW zu ziehen
Weitere Hilfsmittel, „D-“ auf LOW zu ziehen

Das Problem ist allerdings nicht der HT42B534 an sich, sondern wie er auf dem Board verdrahtet ist. Die gute Nachricht: es gibt Abhilfe. Wenn ihr den „D-“ Eingang (physikalischer Pin 2) mindestens während des Starts auf LOW zieht, geht der HT42B534 in den Ruhemodus. Um das zu erreichen, gibt es verschiedene Möglichkeiten.

Wenn ihr eine ruhige Hand habt, dann könnt einen Pull-Down Widerstand direkt and die Pins GND (Nr. 4) und „D-“ (Nr. 2) löten. Programmuploads oder die Kommunikation mit dem seriellen Monitor im normalen USB-Betrieb werden dadurch nicht gestört. Mit einem 10 kΩ Widerstand hat das bei mir problemlos funktioniert.

Wenn euch so ein Eingriff missfällt, dann könnt ihr die Verbindung von „D-“ zu GND auch außerhalb des Boards vor der USB-Buchse vornehmen, z. B. mit folgenden Hilfsmitteln:

  • USB-Breakout Board + Micro-USB zu Micro-USB-Kabel
  • Adapter für Micro-USB auf Schraubklemme
  • Micro-USB-Stecker zum Verlöten

Interessant ist vielleicht noch, dass der Stromverbrauch auch ohne solche Maßnahmen nur auf ca. 22 Milliampere hochgeht, wenn man das Board mit drei Volt startet und dann die Spannung auf fünf Volt erhöht. Eine Erklärung dafür habe ich nicht.

Do-it-yourself LQFP32 LGT8F328P Board

Aber das alles sind Notlösungen. Wenn ihr einen LQFP32 LGT8F328P in batteriebetriebenen Projekten einsetzen wollt, dann greift besser zum lilafarbenen Board, der „Pro Mini Style“ Ausführung oder nehmt den blanken LQFP32 IC. Für letzteren habe ich 1.36 € bezahlt plus 60 Eurocent für eine Adapterplatine. SMDs zu löten ist nicht jedermanns Sache (ich mag es auch nicht besonders), es ist aber nicht so schwer, wie mancher vielleicht denkt.

Stromverbrauch bei Betrieb über VIN / RAW

Der Stromverbrauch der MiniEVB Boards war bei Spannungsversorgung mit 8 Volt über VIN nur geringfügig höher als bei Versorgung mit 5 Volt über VCC. Stichproben mit verschiedenen Boards und Frequenzen ergaben Unterschiede von 0.0 bis 0.3 Milliampere.

Stromverbrauch im Schlafmodus

Zu guter Letzt schauen wir uns noch den Stromverbrauch in den verschiedenen Schlafmodi an. Dafür habe ich die Bibliothek lgt_LowPower von LaZsolt verwendet, die Teil des Boardpaketes lgt8fx ist.

Die Schlafmodi des LGT8F328P unterscheiden sich grundlegend von denen des ATmega328P. Jedoch, um den Nutzern das Leben leichter zu machen, verwendet die lgt_LowPower Bibliothek dieselben Funktionsnamen, wie ihr sie aus der AVR Welt her kennt. Für die Details der Schlafmodi schaut bitte in die Dokumentation auf GitHub.

Mit dem folgenden Sketch habe ich die verschiedenen Schlafmodi eingestellt:

#include "lgt_LowPower.h"

void setup()
{
  // Pin settings for low consumption in sleep mode.
    DDRB  = 0x00;                 // Set all pins to input
    DDRC  = 0x00;
    DDRD  = 0x00;
    DDRE  = 0x00;
    PORTB = 0xFF;                 // Set all input with internal pull up resistors
    PORTC = 0xFF;
    PORTD = 0xFF;
    PORTE = 0xFF;
//    IOCWK = (1<<PORTD4);  // for deepSleep2 mode (level change wake up at D4)
}

void loop() {
    delay(15000); // To get stable power consumption in active mode

//    LowPower.idle(SLEEP_32S,ADC_OFF,TIMER3_OFF,TIMER2_OFF,TIMER1_OFF,TIMER0_OFF,
//    SPI_OFF,USART0_OFF,TWI_OFF,PCIC_OFF,FLASHCTL_OFF);

//    LowPower.adcNoiseReduction(SLEEP_32S, ADC_ON, TIMER2_OFF);

//    LowPower.powerStandby(SLEEP_FOREVER, ADC_OFF, BOD_OFF, TIMER2_OFF);  

//    LowPower.powerExtStandby(SLEEP_FOREVER, ADC_OFF, BOD_OFF, TIMER2_OFF);

     LowPower.powerDown(SLEEP_FOREVER, ADC_OFF, BOD_OFF);

//    LowPower.deepSleep2(SLEEP_FOREVER);

}

 

Meine Testobjekte waren ein LQFP32 MiniEVB Board im „Pro Mini Style“ und mein LQFP32 basiertes Do-It-Yourself Board. Da der Spannungsregler und die LEDs des „Pro Mini Style“ Boards signifikante Stromverbraucher sind, kam hier wieder das modifizierte Board, bei dem ich diese Komponenten entfernt hatte, zum Einsatz. Die Spannungsversorgung mit 5 Volt erfolgte über VCC / GND.

Ergebnisse

Stromverbrauch des LGT8F328P (LQFP32) in verschiedenen Schlafmodi bei 5 Volt.
Stromverbrauch des LGT8F328P (LQFP32) in verschiedenen Schlafmodi bei 5 Volt.
  • LEDs und Spannungsregler verbrauchen ca. 5.5 Milliampere (siehe Normal Mode I vs. Normal Mode II und Deep Sleep I vs. Deep Sleep 2).
  • Alle Pins auf INPUT/HIGH zu setzen (in setup()), bringt eine Ersparnis von 0.6 – 0.7 Milliampere.
  • Im DPS2 Modus, ohne LEDs und Spannungsregler, lässt sich der Stromverbrauch auf 1 Mikroampere reduzieren. Für den DPS2 Modus ist allerdings zu beachten:
    • Wecken führt zum Neustart.
    • Programmuploads auf ein im DPS2 Modus befindliches Board können fehlschlagen. Abhilfe: Kurz vor dem Upload wecken oder resetten.
  • Warum das DIY (Do-it-yourself) Modul noch weniger Strom verbraucht als das „Pro Mini Style“ Board ohne LEDs und Spannungsregler, kann ich nicht mit Bestimmtheit sagen.

Danksagung

Ich bedanke mich bei dbuezas für das Review dieses Artikels!

15 thoughts on “MiniEVB Boards – ein Überblick

  1. Auch wieder ein sehr Interessanter Beitrag,
    Nur eins hätte ich… Könntest du das oben genannten Datenblatt wo du die Pinbelegungen raus hast verlinken oder anhängen? Oder mir zusenden, ich finde NICHTS zu den dingern.
    Oder dein Pinbelegungs Bild in einer größeren Variante bereit stelle. Is schon schwierig im Zoom noch was zu lesen. Wir werden ja alle nichtmehr jünger.

  2. Hallo und guten Tag Her Ewald,
    vielen Dank für diese hervorragend gestaltete Seite, sehr informativ und interessant.
    Bin kürzlich über Ihren Beitrag MiniEVB Boards – ein Überblick gestoßen.
    Sehr Interessant, bin ich doch in den Besitz einiger Boards mit folgender (original)
    Aufschrift gekommen:
    Nano3
    Compatible
    BTE21-15A
    LGT8328P
    LQFP32 MiniEVB

    Der Umgang damit (beschreiben) funktioniert eher schlecht als recht.
    Meine Frage an Sie, beantworten Sie grundsätzlich Fragen von Lesern oder eher nicht.
    Ich würde Ihnen gerne schreiben, welche Problemchen ich damit habe.

    Mit freundlichen Grüßen

    Ingo Kristen

    1. Hallo Herr Kristen,
      wenn die Fragen zum Artikel passen, beantworte ich sie gerne, wenn die Beantwortung nicht zu aufwendig wird (und ich die Antwort weiß!). Wenn Sie Probleme mit dem Beschreiben haben, dann passt das thematisch ja perfekt. Von der Beschriftung her scheint es sich ja um ein ganz normales LQFP32 MiniEVB Board zu handeln. Sie können das Problem gerne hier in den Kommentaren beschreiben. Die Kommentarfelder sind allerdings nicht gut geeignet für Code und Bilder. Dann gerne auch an wolfgang.ewald@wolles-elektronikkiste.de.
      VG, Wolfgang

  3. Hallo Wolfgang,
    Du hast beim Pinout des LQFP48 MiniEVB die Pins 33, 34 und 35 als PWM Pins gekennzeichnet.
    Ich habe jetzt 3 dieser Boards probiert, bekomme auf diesen Pins aber kein PWM Signal…

    Gruß
    Herbert

    1. Hallo Herbert,
      hier ein Beispiel für ein PWM Signal an D33 (PF1). 1KHz PWM Frequenz mit 75% DutyCycle:

      void setup(){
        noInterrupts();
        TCCR3A = 
          1 << COM3A1 |
          1 << WGM31;
        TCCR3B = 
          1 << WGM33 |
          1 << WGM32 |
          1 << CS30;
        DDRF = 
          1 << DDF1;
        OCR3A = 24000;
        ICR3 = 32000;
        interrupts();
      }
      void loop(){}
      

      Das Einstellen der Parameter ist immer wieder eine gewisse Herausforderung. Ich empfehle hierfür das Arduino Web Timers Tool. Da klickst du dir sozusagen alles, was du haben willst zusammen. Die Frequenz- und DutyCycle-Einstellungen kannst du in der Grafik einstellen. Für’s Funetuning musst du ggf. nochmal ein wenig rechnen. Hier mit den Einstellungen meines Sketches:

      https://dbuezas.github.io/arduino-web-timers/#mcu=LGT8F328P&timer=3&topValue=ICR3&OCR3A=23861&CompareOutputModeA=clear-on-match%2C+set-at-max&InterruptOnTimerOverflow=off&interruptA=off&ICR3=31927

      Das Tool ist einfach genial.

      VG, Wolfgang

      1. Hallo Wolfgang,
        danke für die schnelle Antwort, da habe ich die Angabe „Pin kann PWM“ wohl falsch ausgelegt… 🙂
        Ich hatte das so verstanden dass ich auf diesen Pins mit „analogWrite“ ein PWM Signal bekomme wie an den anderen PWM Pins auch…

        Gruß
        Herbert

        1. Alles klar. Jeder anlogWrite-Pin „kann“ PWM, aber nicht für jeden PWM Pin ist analogWrite implementiert. Falls du noch zusätzliche analogWrite-Pins benötigst, kannst du dir selbst welche programmieren, z.B. so:

           void setup() {
              TCCR3A = (1 << COM3A1) | (1 << WGM31);
              TCCR3B = (1 << WGM33) | (1 << WGM32) | (1 << CS30);
              DDRF = (1 << DDF1);
              OCR3A = 0;
              ICR3 = 65535;
              myAnalogWrite33(64);
          }
          
          void loop() {}
          
          void myAnalogWrite33(uint8_t value){
              noInterrupts();
              OCR3A = value * 256; 
              interrupts();
          }
          
          1. Noch mal Danke !
            Die analogWrite fähigen PWM Pins reichen mir noch, – wäre nur schöner zu verkabeln gewesen.
            🙂 🙂

            Gruß
            Herbert

  4. Erstmal vielen Dank für die ganzen schön zusammengefassten Informationen über diese Chips bzw. Boards!

    Allerdings sind auf der Zeichnung des LQFP32 „Pro Mini Style“ die beiden unteren Pinreihen spiegelverkehrt beschriftet..
    War schon vorm Verzweifeln, bis ich mal ein Board rumgedreht und die Beschriftung mit der Grafik verglichen habe.. 🙂

    1. Hi,
      vielen Dank für den Hinweis. Wird gleich geändert. Die untere der beiden Reihen ist richtig (A4-A7). Die obere muss gespiegelt werden.
      VG, Wolfgang

  5. Noch Fragen ?

    Ja:

    wie sieht es mit ISR aus ? auch nur 2 Pins ? PCI ?
    kann man Optiboot verwenden, um ca 1.5k mehr Flash zu bekommen ?

    1. Hallo,
      1) Wie beim ATmega328P gibt es die Interrupts INT0 / INT1. Pin Change Interrupts sind an jedem I/O Pin verfügbar. Siehe die Pinout-Diagramme.
      2) Der Arduino Optiboot würde nicht funktionieren. Dass nur knapp 30 KB Flash zur Verfügung stehen hängt mit dem (fehlenden) EEPROM zusammen. Der LGT8F328P hat eigentlich keinen EEPROM, sondern simuliert ihn im Flash. Vorgesehen sind dafür 0, 1, 2, 4 oder 8 KB. Der Flashbedarf für den Flash ist die EEPROM Größe mal 2. Das Boardpaket lgt8fx hat 1 KB EEPROM voreingestellt und damit sind 2 KB Flash weg. Die Kompatibilität stand hier wohl im Vordergrund. Wie man den EEPROM auf null setzt, habe ich noch nicht verstanden, aber nachgefragt, wie bzw. ob es geht. Wenn ich eine Antwort habe, dann gibt es hier ein Update.
      Wenn du dich für die Details interessierst, kannst du hier mal reinschauen:
      https://github.com/dbuezas/lgt8fx/pull/64
      https://github.com/dbuezas/lgt8fx/pull/261

    2. Jetzt habe ich die Antwort. Der Bootloader für den LGT8F328P benötigt < 1 KB. Aber es ist auch 1 KB EEPROM voreingestellt, was 2 KB Flash kostet. Unglücklicherweise befindet sich der für den EEPROM reservierte Speicherplatz am Ende des Flash. Darunter kommt der Bootloader und darunter der für Programme verfügbare Flash. Setzt man den EEPROM auf 0 KB, dann nützt das nichts, weil der Bootloader nicht an das Ende verschoben wird. Er ist immer an derselben Stelle. Schließt sich die Frage an, was passiert, wenn man die EEPROM Größe auf > 1 KB einstellt: Der Bootloader wird überschrieben und muss vor dem nächsten Programmupload neu gebrannt werden.

      Die vollen 32 KB stehen bei Programmierung über ISP (LArduinoISP) zur Verfügung. Allerdings wird beim Upload immer noch max. 29696 Bytes angezeigt, was man aber ebenso ignorieren kann wie die Warnung bei Überschreiten dieser Grenze. Es handelt sich um einen fixen Wert, der den Standard repräsentiert.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert