CANtact USB-DFU won’t start without BOOT jumper

Recently, I thought it would be nice, if the CANtact USB-CAN adapter (which features a STM32F042 Cortex M0-based MCU) could start the USB firmware download procedure without me having to phyiscally place a jumper on the board’s BOOT pin (see also: GitHub issue #9). That way one wouldn’t have to open up the case every time a new firmware is available.

Commit 59b2813 implements a function jump_to_st_usb_bootloader(); which should do just that and can be invoked via USB. For some reason though, the adapter still won’t register on the PC as a USB DFU device. Instead it reboots into the regular firmware.

Why is that?

Regularly, the MCU maps either the so called „System Memory“ ROM i.e. the USB DFU bootloader at 0x1fffc400 or the regular firmware memory at 0x08000000 to address 0x00000000, depending on whether the jumper on the BOOT pin is present or not. That way stack pointer and vector table are set accordingly and the corresponding reset handler service routine is executed.

The system configuration register SYSCFG->CFGR1 allows to remap those memory areas after startup and I confirmed, that after the corresponding call in line 38 the memory at address 0x00000000 changes and afterwards reflects the ROM content. I also confirmed, that the processor’s stack pointer register is changed to the new value after the call in line 41 and that after line 49 code execution jumps to the ROM address range. Since the bootloader is not Open Source, unfortunately, I was unable to debug the issue any further from that.

What could be the issue?

  • Does the bootloader re-sample the BOOT pin and exit, if it has an unexpected value?
  • Does the bootloader have trouble with settings made to peripheral registers in the regular firmware?
    • I tried to rule this out by invoking jump_to_st_usb_bootloader(); in the main(); before performing any hardware initialization – the issue persists.
  • Is it an exception that triggers the MCU reset or is the reset invoked on purpose?
Veröffentlicht unter Bug reports & Feature requests, CAN | Verschlagwortet mit , , , , , , , | Hinterlasse einen Kommentar

Notes on fxload

To flash firmware into Cypress FX2(LP) microcontrollers, a tool is required. Several exist, fxload being the most widely used. Unfortunately, simply installing fxload via the Debian package is not sufficient to get started. The Debian package is heavily outdated (a version from 2008) and doesn’t seem to work anymore with recent installations of Debian/Linux. I had to dive a little bit into the topic, which is what I would like to summarize here.

fxload is originally a part of the Linux Hotplug Project on SourceForge. That project, however, seems abandoned, the last activity happening in 2013. For some reason I didn’t even manage to clone the CVS(!) reposity.

Fortunately, a git-converted fork of the repo by Github user esden exists. Noteworthy are also accesio’s additions, which enable compilation for MacOS. Most notable though is, that since 2012, fxload has also been added as an example application to the libusb project. In the latter repository it has even been maintained (last commit July 2017).

Compiling fxload from the libusb repository actually appears to results in a working executable. Here’s what you need to do to compile it:

  • git clone
  • cd libusb
  • ./
  • make
  • cd examples/
  • ./fxload
  • cp -av fxload /usr/local/bin/

There’s no need to install the rest of the project. You can just place the generated fxload executable in your /usr/local/bin and you’re all set for development.

Veröffentlicht unter Mikrocontroller | Verschlagwortet mit , , , | Hinterlasse einen Kommentar

New gadgets arrived: Cypress EZ-USB FX2LP Development Board

Today I finally received my new (noname) development board for the Cypress CY7C68013A MCU.

It features the CY7C68013A-56PVXC, a mini-USB port, the AMS1117-3.3 3.3 Volt LDO, a 24 MHz crystal, the Atmel ATMTC169-24C128N EEPROM, two buttons, two jumpers, two LEDs plus power LED and two 2×10 pin 2.54mm headers breaking out the MCU’s pins.

In the coming days I will try to compile a simple LED blinky using SDCC and possibly Wolfgang Wieser’s cycfx2prog or fxload from the Linux Hotplug Project. For both of them Windows ports exist:

Read more about fxload in my next post.

For firmware development there exists a library called fx2lib.

Also interesting to know: The Sigrok FX2lafw firmware enables using this MCU and board as logic analyzer and cheap oscilloscope:

The board isn’t a new product or design, nor is the MCU. But it can still be found in products, e.g. on the Spartan-3E starter kit, where it functions as USB interface respectively CPLD and FPGA programmer.

People have written about the board, e.g.:

Thanks you, Peter! He also has a board schematic on his blog post (I didn’t find a better image quality, sorry, but it’s readable with a little effort):

Missing in this schematic are the LEDs though (on the top right in the first picture), which are:

  • LED D1, connected to PA0, active low
  • LED D2, connected to PA1, active low
  • Jumper J1: Enables 3V3 on D1 and D2
  • Jumper J2: Connected to EEPROM but unclear function:
    • Enable/Disable EEPROM power supply?
    • EEPROM Write-Protection?
    • Select EEPROM memory region?
    • Select EEPROM’s I2C address?
Veröffentlicht unter Mikrocontroller | Hinterlasse einen Kommentar

5V-Netzteil: Stecker durch Kabel ersetzt

In Vorbereitung der Inbetriebnahme der Pintsch Bamag-Alarmlampe (siehe spätere Blog-Posts) kam die Frage auf, woher der steuernde Mikrocontroller seine 5Volt Spannungsversorgung bekommen soll. Die „professionelle“ Lösung wäre ein PCB mit AC/DC-Wandler, z.B. Recom RAC05-05SK. Die einfachere Lösung besteht darin, ein handelsübliches 5VDC-Netzteil so anzupassen, dass es seine 230VAC am Eingang vom Stromanschluss der Alarmlampe beziehen kann.

Zweiteres wurde durchgeführt (und mittlerweile erfolgreich angewandt). Dazu wurde das Netzteil geöffnet, der dankenswerterweise modulare Netzstecker abgeschraubt und stattdessen (dem erwarteten Stromfluss angemessen dick ausgelegte) Adern direkt am Netzteil-PCB angeschlossen. Diese wurden durch die Netzstecker-Öffnungen herausgeführt und letztere mit Heißkleber abgedichtet.

Hier ein paar Bilder vom Netzteil-Umbau:

Zu erkenne ist u.a., dass der Hersteller auf den Verbau einer Sicherung, obwohl im Design vorgesehen, verzichtet hat.

Komponenten u.a.:

Veröffentlicht unter Zerlegen & Reparieren | Hinterlasse einen Kommentar

Contacting Xilinx support is only for „approved“ people

I was surprised to find out, that in order to being able to contact Xilinx’s support, one must not only have a Xilinx account, but also have applied with that account for being able to write to Xilinx support. So, in essence, you can only ask Xilinx questions, if Xilinx grants you the right to ask them 😉 What kind of nonsense is that?

This fact alone is reason enough for me, not to buy their products. Not being able to write them straight away in case there is a problem and risking to not get any support in the end is simply not acceptable.

Praised be Lattice, where everybody can get all the support one needs! 🙂

Veröffentlicht unter FPGA | Hinterlasse einen Kommentar

Inkscape bug #427540 still unfixed

Today I noticed, that although I have a quite recent version of Inscape installed (0.92.2 compiled from commit 5c3e80d, while the currently upstream available version is 0.92.3), bug #42754 – Masked images are missing from PDF exports is still unfixed.

In order to evaluate, whether this problem can be addresse or fixed by me, I cloned Inkscape. Some dependencies must be installed, before Inkscape can be compiled from source.

Veröffentlicht unter Bug reports & Feature requests | Verschlagwortet mit | Hinterlasse einen Kommentar

ISE 14.7: Failed to Create Temporary Project

Ich habe die Xilinx ISE Version 14.7 auf meinem 64Bit-PC unter C:\Programme installiert und will sie ausführen, aber wenn ich „New Project“ anklicke, kommt die Fehlermeldung „Failed to Create Temporary Project“. Was soll das? Die settings64.bat habe ich ausgeführt. Hm… Stellt sich heraus, dass das Leerzeichen im Pfad ein Problem für die Xilinx-Software ist.

Unter Windows ist der Pfad C:\Programme nur ein Alias, der einem im Windows Explorer angezeigt wird. Im Dateisystem heißt der Pfad aber C:\Program Files. Das Leerzeichen darin scheint für die Xilinx ISE ein Problem zu sein. Verschiebt man den Xilinx-Installationsordner einfach „per Hand“ nach C:\, tritt das Problem nicht mehr auf.

Da drängen sich direkt zwei Fragen auf:

  1. What year is it?
  2. Wieso lässt mich das Setup-Programm überhaupt in einen Pfad installieren, aus dem heraus die Software gar nicht funktioniert?

Naja. So ist das eben mit Windows-Software…

Lösung: Xilinx-Ordner nach C:\ in’s Stammverzeichnis verschieben, dann geht’s.

Veröffentlicht unter Bug reports & Feature requests, FPGA | Verschlagwortet mit , , | Hinterlasse einen Kommentar

Fehlerstrom-Messung mit Rogowski-Spule

Haushalts-Stromnetze sind abgesichert durch sog. FI-Schalter (Fehlerstrom-Schutzeinrichtungen). Sie nehmen eine Abwägung vor zwischen den Strömen der stromführenden Leiter in einem Stromkreis und lösen bei Ungleichheiten aus, also wenn die Summe aller Ströme (der zwei oder drei Phasen, je nach Anschlussart) nicht Null ist. Letzteres ist dann der Fall, wenn ein Strom aus dem Stromkreis heraus in die Erde fließt, z.B. wenn der Fön in die Badewanne fällt und der Strom durch Wanne und Abwasserrohr geerdet wird.

Der Fön in der Badewanne ist ein nachvollziehbarer Grund für das Auslösen eines FI-Schalters. Was aber, wenn der FI-Schalter auslöst ohne einen erkennbaren Grund? Vorausgesetzt, der FI-Schalter ist nicht defekt, bedeutet dies, dass in einem der Stromkreise in der Wohnung ein Fehlerstrom fließt. Das ist grundsätzlich bedenklich, da Gefahr für Laib und Leben bestehen könnte.

Wie kann man feststellen, in welchem Stromkreis der Fehlerstrom fließt? Die einfachste Methode ist, den Fehlerstrom mit einem Strom-Messgerät nachzumessen. Normalerweise muss zur Strommessung der stromführende Leiter unterbrochen werden. Im Haushalt ist diese Methode wegen der Gefahr eines Stromschlags nicht zu empfehlen.

Da man nur den Differenzstrom zwischen Hin- und Rückleiter eines Stromnetzes (L- und N-Adern; i.d.R. schwarze und blaue Drahtummantelung) messen möchte, genügt es, diese beiden Leiter mit einem magnetisch-leitfähigen Material, z.B. Ferrit, zu ummanteln. Im Idealfall ist der Strom durch Hin- und Rückleiter gleich groß und es entsteht kein Magnetfeld. Sind die Ströme jedoch ungleich groß, so entsteht gemäß der Lenzschen Regel im Ferrit ein magnetisches Feld, das in erster Näherung proportional zum Differenzstrom = Fehlerstrom ist. Da der Fehlerstrom u.U. durch den PE-Leiter fließt, muss diese Ader bei der Fehlerstrom-Messung außerhalb des Ferrits liegen. Der Vorteil dieser Herangehensweise ist, dass die stromführenden Leiter nicht unterbrochen werden müssen.

Das magnetische Feld in einem Ferrit kann auf verschiedene Arten gemessen werden. Eine ist das Umwickeln des Ferrits mit Kupferlackdraht entsprechend dem Prinzip der Rogowski-Spule. Dies wurde mit einer improvisierten Spule aus einem Common Mode-Filter-Klappferrit mit 42 Windungen Kupferlackdraht getestet:

Klappferrite hat man herumzuliegen, wenn man schon in den 80er- und 90er-Jahren PCs verwendet hat. Diese wurden seinerzeit zu Entstörzwecken um Kabel geklappt.

Mit einem Funktionsgenerator wurden verschiedene Frequenzen mit einer Amplitude von 5V erzeugt und auf einen 270R-Widerstand gelegt, sodass etwa 20mA durch den Widerstand fließen. Die Rogowski-Spule wurde über eines der beiden Kabel zwischen Funktionsgenerator und Widerstand geklappt und am Oszilloskop der Spannungsverlauf über der Spule gemessen.

Bei 50kHz und 5kHz ist eine Spannung messbar, deren Verlauf der Anregung folgt. Bei 500Hz und darunter ist das Signal unterhalb der Messgrenzen des Oszilloskops (<10mV).

Das Signal wurde daraufhin mit dem Operationsverstärker LM358 verstärkt (Widerstände: 12kR und 120kR). Mit diesem lässt sich das Signal soweit verstärken, dass es auch bei 500Hz messbar ist.

Leider hat das Stromnetz hierzulande eine noch kleinere Frequenz von 50Hz, sodass der Aufbau noch weiter verbessert werden muss, um angewandt werden zu können. Denkbar sind z.B. eine Spule mit mehr Windungen zu wickeln oder einen Hall-Sensor zur Messung des Magnetfelds im Ferrit heranzuziehen.

Veröffentlicht unter Technik | Verschlagwortet mit , , , , , , , , , , | Hinterlasse einen Kommentar

Lattice iCEcube2-Abhängigkeiten unter Linux

Wenn man die letzte Version von Lattice Semiconductor’s iCEcube2-IDE (12. September 2017)  verwenden will, wird man bei der Ausführung des Setup-Programms unter Umständen einen „No such file or directory“-Fehler zu sehen bekommen.

Der kommt dadurch zustande, dass einige Bibliotheken, auf die das Programm zurückgreift, auf dem eigenen PC nicht vorhanden sind. Leider gibt das Setup-Programm (nur als x86 32-Bit verfügbar) keine hilfreiche Fehlermeldung dazu aus. Zum Glück lässt sich mit strace relativ schnell herausfinden, welche Bibliotheken fehlen:

apt install libpng12-0:i386 libxrender1:i386 \
  libxrandr2:i386 libxcursor1:i386 \
  libxinerama1:i386 libsm6:i386 \
  libc6:i386 libglib2.0-0:i386 \
Veröffentlicht unter FPGA | Hinterlasse einen Kommentar

PT331C-Fototransistor mit Impedanzwandler betreiben

Der Everlight Opto PT331C ist ein mit 0,36€ (Stand: Oktober 2017 bei Conrad Elektronik) sehr günstiger Fototransistor für nahes UV-, sichtbares und nahes Infrarot-Licht (ca. 200-1200 nm). Das Absorptionsmaximum liegt etwa bei 800-900 nm.

Schließt man eine Spannung in Sperrrichtung des Fototransistors an, so beginnt ein lichtabhängiger Strom durch den Transistor zu fließen. Um den lichtabhängigen Stromfluss als Spannung mit einem A/D-Wandler auslesen zu können, z.B. mit einem Mikrocontroller, schließt man an den Kollektor des Fototransistors (äußerlich an der Abflachung des Gehäuses zu erkennen) den Pluspol der Spannungsquelle und an den Emitter einen Widerstand an, der auf der anderen Seite mit dem Minuspol der Spannungsquelle verbunden ist. Gemäß dem Ohmschen Gesetz ist dann der Spannungsabfall über dem Widerstand proportional zum Stromfluss durch den Fototransistor. Bei einer Spannung von 3.3 Volt hat sich ein Widerstandswert von 12 kOhm als geeignet erwiesen, um Tageslicht zu quantifizieren. Der Widerstand kann aufgrund des geringen Fotostroms allerdings nicht direkt mit dem Eingang des A/D-Wandlers verbunden werden. Ein Impedanzwandler muss zwischengeschaltet werden, um zu vermeiden, dass ein das Messergebnis verfälschend großer Anteil des Stroms in den A/D-Wandler anstatt durch den Messwiderstand fließt. Ein Experiment mit einem LM358 war erfolgreich (siehe Bilder unten). Für zukünftige Anwendung könnte es noch interessant werden, dass Operationsverstärker analoge Eingangswerte grundsätzlich auch mit einem über Widerstände einstellbaren Faktor multiplizieren können – So können auch kleine Eingangswerte in einen messbaren Spannungsbereich verstärkt werden. Außerdem könnte sich zur Steigerung der Signalqualität für zukünftige Experimente ein Eingangs- & Ausgangs-Rail-to-Rail-OPV empfehlen.

Messaufbau: Der Oszilloskop-Tastkopf ist am Ausgang des Operationsverstärkers angeschlossen.

Ausgabe der oben aufgebauten Schaltung am Oszilloskop. Die Schwankung der Lichtintensität mit ca. 100 Hz rührt vermutlich von den Neon-Röhren im Raum her.

Veröffentlicht unter Arduino, Optik, Tagebuch | Verschlagwortet mit , , , | Hinterlasse einen Kommentar