Elektor-Kurs Mikrocontroller für Einsteiger     


Elektronik-Labor  Projekte  AVR 


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 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 Elektor-Forum enthält bereits das Thema "Bascom-AVR-Kurs", wo in Zukunft weitere Details zum Kurs gesammelt werden sollen:
http://forum.elektor.com/viewforum.php?f=659855


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




Elektronik-Labor  Projekte  AVR