Elektor-Kurs Mikrocontroller für Einsteiger
Die neue Elektor-Serie "Mikrocontroller
für Einsteiger" begann mit dem Aprilheft. Es treten immer wieder
Leute an Elektor heran, die einen Tipp haben möchten, wie sie am besten
den Einstieg in das Thema finden können. Tatsächlich gibt es so viele
mögliche Zugänge, dass es für die Redaktion und für mich gar nicht so
einfach war, die Richtung zu finden. Am Ende haben wir uns
entschlossen, den Kurs auf Bascom aufzubauen, aber als Hardware einen
Arduino Uno zu wählen, einfach weil er so preiswert ist.
Im Doppelheft Juli/August wird das neue Arduino-Shield von Elektor vorgestellt. Ich hatte
das große Glück, dass ich mir wünschen konnte, was darauf sollte, denn
ich verwende das Shield auch für den Einsteigerkurs: LCD, Poti, Taster, LEDs, also die Dinge, die man fast
immer braucht. So hat man ein kompaktes System, ein Kabel zum USB und
sonst nichts. Jens Nickel beschreibt die Hardware ausgiebig im
Doppelheft, und ich zeige in Mikrocontroller-Kurs die passenden
Bascom-Programme.
In der ersten
Folge ging es ganz einfach los, mit Portausgaben. Und es wurde gezeigt,
wie man in Bascom den Arduino-Bootloader verwenden kann. Der entscheidende Punkt war, dass man für den Uno 115200 Baud
einstellen muss. Bascom verwendet dann den originalen Uno-Bootloader.
Später
habe ich dann auch andere Wege vorgestellt, wie man sein
Programm in den Controller bekommt: Mit einem externen Brenner oder mit
dem angepassten MCS-Bootloader, den ich übrigens besonders gern
verwende. Man muss nur aufpassen, dass man die Bootloader nicht
verwechselt. Den MCS-Bootloader habe ich mit einem Aufkleber auf der
USB-Buchse gekennzeichnet, damit nicht versehentlich versucht wird die
Arduino-IDE mit diesem Bootloader zu nutzen.
Fehlersuche bei Upload-Problemen
Vermutlich
die meisten Anwender sind beim Adruino-Bootloader geblieben, was ja
auch den Vorteil hat, dass man nahtlos zwischen Bascom und Arduino
wechseln kann. In einigen wenigen Fällen sind Probleme aufgetreten, die
manchmal auch von der Arduino-IDE berichtet werden. Irgendwas klemmt
mit dem Upload. Dann kann man folgendes versuchen:
- Nachsehen, ob die Baudrate 115200 noch
eingestellt ist.
- Test, ob die originale Arduino-Software noch hochlädt.
- Eventuell eine andere Timeout-Einstellung im Bascom-Arduino-Bootloader
ausprobieren.
- Auf einen andern USB-Port wechseln.
Manchmal macht
USB 2 oder USB 3 einen Unterschied, an modernen PCs gibt es beide. Manchmal
hilft ein Hub. Und manchmal merkt sich Windows Fehler an einem Port und
verwendet ihn nicht mehr. Das ist mir bei anderen Geräten schon öfter passiert.
Nach dem dritten Neustart von Windows ist dann wieder alles normal. Aber ein
Wechsel des USB-Ports bringt oft eine schnelle Lösung.
Nachtrag: Fehlerbeschreibung von Jürgen
Conrad
Alle Versuche wurden auf 3 verschiedenen Notebooks durchgeführt.
2 XP-Rechner (Acer, Asus und W7-Medion, letzterer verfügt über USB2 und USB3)
Alle Programme aus Elektor (Hefte 4, 5 und 6) lassen sich laden und in Betrieb nehmen.
Die einzige Ausnahme bildet das Programm UNO_Print.BAS.
Bei
einem „Waitms 200“ erfolgt nur beim Medion, sowohl auf USB2 als auch
auf USB3 eine Programmierung und eine erfolgreiche Terminalanzeige.
(Bei 250ms funktioniert das auch auf den beiden anderen Computer)
Wenn
UNO_Print.BAS mit Waitms 200/250ms läuft, kann bei mir auf keinem der
drei Notebooks ein anderes Programm geflasht werden – Bascom hängt sich
auf (mit: Keine Rückmeldung) und muß z.B. mit Taskmanager abgewürgt
werden.
Auch bei einem Neustart von BASCOM gleiches Problem.
Mit
ARDUINO-IDE kann das Programm BLINK (aus: File/Examples/Basics)
geflasht werden. und ARDUINO blinkt. Dann ist wieder mit BASCOM das
Flashen der Programme möglich – und die Programme funktionieren.
Bei einer Einstellung von Waitms von 300 und mehr in UNO_Print.BAS, gibt es mit BASCOM auf allen Notebooks keine Probleme.
Nach Compile von UNO_Print.BAS ist die Baudrate 115200 noch eingestellt – bei Absturz ist keine Kontrolle mehr möglich.
Lösung:
Inzwischen
konnte ich den Fehler nachvollziehen: Immer wenn eine Print-Ausgabe im
Programm enthalten ist klemmt der Arduino-Programmer in Bascom. Es
handelt sich wohl um ein Problem in der Bascom-IDE. (Das hatte ich
leider bisher übersehen, weil ich lieber mit dem MCS-Bootloader
arbeite, wo es dieses Problem nicht gibt.) Nach einigem Rumprobieren
kam folgende Lösung heraus:
1. Die Timeout-Einstellung wird auf 3000 hochgesetzt:
2.
Beim Upload wird dreimal (!!) kurz die Reset-Taste des Uno gedrückt.
Vor dem ersten Reset stehen im Chip-Fenster erstmal drei Fragezeichen
???. Nach dem ersten Reset erhält man hier den Eintrag ATmega328P. Der
Programmer liest also erstmal diese Info. Nach dem zweiten Reset geht
es immer noch nicht weiter. Vielleicht wird da noch etwas anderes
gelesen oder aber der Speicher wird gelöscht. Aber nach dem dritten
Reset geht es dann wie gewohnt weiter.
Das
war's. Dreimal Reset löst das Problem. Oder der MCS-Bootloader, den man
allerdings mit einem externen Brenner reinladen muss.
Nachtrag 2 von
Jürgen Conrad: Froher Hoffnung habe ich sofort die Änderung auf Timeout
3000 vorgenommen. Auch den Link genau studiert. Die Programmierung
von UNO_Print.BAS mit Waitms 200 geht problemlos. Ausgabe auf
Terminalfenster ok. Während des Laufes von UNO_Print.BAS mit 200 ms
kann das Programm LEDblink.bas wieder nicht geflasht werden. Bascom
hängt sich auf (mit: Keine Rückmeldung), wird mit Arduino
wieder „entsperrt“. Erhöhe ich Waitms jedoch auf 300 ms funktioniert
alles wieder. Timeout 3000, $crystal = 16000000, $baud = 9600, sofern
sich das Programm Bascom nicht aufhängt, stets kontrolliert. Ich habe
BASCOM-AVR IDE free (2.0.7.5), neu installiert. USB-Treiber für Arduino
(Ver. 1.5.6-r2) neu eingespielt.
Bestätigung
von B. Kainka: Auch das konnte ich nachvollziehen. Mit einer Pause von
300 ms kommt man ohne die Reset-Taste aus. Wenn das Programm aber
schneller sendet muss man wie beschrieben dreimal Reset drücken.
Franzis-Arduino-Upgrade
In
meiner Schublade lag noch (etwas verstaubt) der Arduino-Nachbau von
Franzis mit dem Mega168. Ein Test, ob man den auch in Bascom verwenden kann
verlief negativ. Zwar habe ich den Programmer auf 19200 Baud umgestellt, aber es
wollte nicht funktionieren.
Dann habe ich einen Mega328 in die Fassung gesteckt und mit dem originalen
Uno-Bootlader versehen. Und tatsächlich wird die Platine nun von der
Arduino-IDE als Uno akzeptiert. Der Unterschied ist ja nur, dass auf die
Franzis-Platine noch der FT232R für die USB-Verbindung sorgt. Ob das
einen Unterschied zum USB-Controller auf dem originalen Uno macht? Tut es
nicht! In Bascom treten die gleichen Upload-Probleme auf, wenn ein zuvor
geladenes Programm eine Printausgabe enthielt. Und auch hier löst dreimal Reset
das Problem.
Dies und das
In der
dritten Folge des Kurses gab es beim Beispielprogramm UNO_Print.bas einen
kleinen Formatierungsfehler im Heft, der dazu führte, dass die Zeile $crystal =
16000000 unvollständig war. Wer das Programm aus dem Heft abtippen wollte
konnte darüber stolpern.
'-------------------------------------------------------------------------------
'UNO_Print.BAS
'-------------------------------------------------------------------------------
$regfile = "m328pdef.dat" 'ATmega328p
$crystal = 16000000 '16 MHz
$baud = 9600
Dim N As Byte
Do
Print N;
Print " Uno"
Waitms 200
N = N + 1
Loop
Allerdings dienen die abgedruckten Programme nur der schnellen
Übersicht. Auf der Elektor-Homepage kann man sich die Programmdateien
laden. Vor allem in den späteren Folgen mit immer längeren Programmen
werden nur noch die entscheidenden Teile der Programme abgedruckt. Dann
sollte man grundsätzlich auf die Dateien zurückgreifen.
http://www.elektor-magazine.com/de/zeitschrift/alle-elektor-ausgaben.html
Das Elektor-Forum enthält das Thema "Bascom-AVR-Kurs", wo weitere Details zum Kurs gesammelt werden:
http://forum.elektor.com/viewforum.php?f=659855
Das
Bild ganz oben zeigt den Uno mit dem Elektor-Shield in einem
einfachen Gehäuse, das mir mein Freund Rainer mit seinem 3D-Drucker
gedruckt hat. Ich verwende es gern im Labor, um den Uno besser zu
schützen. Die Druckdateien findet man in Elektor-Labs:
www.elektor-labs.com/project/3d-printed-arduino-housing.14102.html
Das
Extension-Shield hat sich auch für weitere Projekte bewährt. Inzwischen
wurde bei Elektor das SDR-Shield entwickelt. Bei der Pin-Belegung habe
ich darauf geachtet, dass das Display mit verwendet werden kann, ebenso
wie die Taster und das Poti auf dem Shield. Damit mutiert der
Arduino zum kompletten Kurzwellen-Empfänger. (vgl. Elektor SDR
Reloaded (4) Stand-Alone-Lösungen, https://www.elektormagazine.de/magazine/elektor-201611/39893)
Nachtrag zur Folge 3: Lesen der internen Referenz beim Mega328
Das
ursprüngliche Programm sollte durch Messen der internen 1,1-V-Referenz
die eigene Betriebsspannung ermitteln, was auch gut funktioniert hat.
'----------------------------------------
'UNO_AD3.BAS Vcc / 1.1 V
'----------------------------------------
$regfile = "m328pdef.dat"
$crystal = 16000000
$baud = 9600
Dim D As Word
Dim U As Single
Config Adc = Single , Prescaler = 64 , Reference = Avcc
Do
D = Getadc(14) 'Ref 1.1 V
U = 1023 / D
U = U * 1.1
Print "Vcc = ";
Print U ; " V"
Waitms 1000
Loop
Fritz
Prenninger stellte folgendes Problem mit dem Lesen der internen
Referenz (ADC14) fest: Wenn im gleichen Programm ADC0 gelesen wird
ändert sich der gelesene Wert aus ADC14.
'----------------------------------------
'UNO_AD3_1a.BAS Vcc / 1.1
V
'----------------------------------------
$regfile =
"m328pdef.dat"
$crystal = 16000000
$baud = 9600
Dim D As
Word
Dim U As Single
Dim E As Word
Dim V As Single
Config
Adc = Single , Prescaler = 64 , Reference = Avcc ' 5,0V
Do
'E = Getadc(0)
V = E * 5.0
V = V / 1023
Print V ; " V"
Waitms 3000
D = Getadc(14) 'Ref 1.1 V
U = 1023 / D
U = U * 1.1
Print "Vcc = ";
Print U ; " V"
Waitms 1000
Loop
Etwas
rumprobiert, das Problem konnte ich bestätigen. Zuerst hatte ich einen
Rechenfehler in Bascom in Verdacht. Deshalb habe ich die Einstellungen
für Hwstack, Swstack usw. eingefügt. Keine Änderung. Dann fiel
auf, dass auch bei der funktionierenden Variante der erste Wert noch
nicht korrekt ist. Neue Theorie: Das Messen von Kanal 14 schaltet die
Referenz erst ein, andere Kanäle schalten sie wieder aus. Und es wird
jedesmal etwas Zeit benötigt, bis die Referenz voll da ist. Von so
einer Einschwingzeit steht auch etwas im Datenblatt. Also muss man in
diesem Fall den Kanal AD14 zweimal messen, einmal zum Einschalten
der Referenz und dann nach einer kurzen Pause für die eigentliche
Messung. Jetzt funktioniert es korrekt.
'----------------------------------------
'UNO_AD3b.BAS Vcc / 1.1 V
'----------------------------------------
$regfile = "m328pdef.dat"
$crystal = 16000000
$baud = 9600
$hwstack = 32
$swstack = 64
$framesize = 64
Dim D As Word
Dim E As Word
Dim U As Single
Dim V As Single
Config Adc = Single , Prescaler = 64 , Reference = Avcc ' 5,0V
Do
E = Getadc(0) 'int Ref off
V = E * 5.0
V = V / 1023
Print V ; " V"
Waitms 3000
D = Getadc(14) 'Ref on
Waitms 100
D = Getadc(14) 'Ref 1.1 V
U = 1023 / D
U = U * 1.1
Print "Vcc = ";
Print U ; " V"
Waitms 1000
Loop