Archive for the ‘Embedded Systems’ Category.

Atari Joystick mit DB9 Anschluss an PC per USB anschliessen

Um klassische Joysticks nach Atari Standard mit DB9 Anschluß an moderne PCs anschließen zu können, benötigt man Adapter.
Solche gibt es als freie Designs zum Nachbauen, aber selten fertig zu kaufen. Sie enthalten meist einen kleinen Microcontroller, häufig AVR oder PIC, etwas “Hühnerfutter” drumrum und stellen PC seitig eine HID konforme Schnittstelle bereit.

Bei Ebay und anderen Shops tauchen ab und an fertig kaufbare Geräte auf. Diese braucht man in der Regel nur anschließen und gängige Betriebssysteme listen danach einen neuen Joystickanschluß auf.

Ich besitze aktuelle mehrere solcher Adapter. Bei einem konnte ich über eine in der Firmware hinterlegte URL auch eine Bezugsquelle in Kanada ausmachen. Zwar nicht die günstigste Variante, aber immerhin eine Möglichkeit, einen solchen Adapter zu beschaffen. Meinen hatte ich bei Ebay gefunden.

URL: http://www.retronicdesign.com/

Auszug aus meinem Linux Kernel Log beim Einstecken:

[ 5870.324066] usb 1-5.1.3: new low-speed USB device number 9 using xhci_hcd
[ 5870.453974] usb 1-5.1.3: New USB device found, idVendor=1781, idProduct=0a99
[ 5870.453980] usb 1-5.1.3: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[ 5870.453982] usb 1-5.1.3: Product: Retro Joystick Adapter v2.0
[ 5870.453984] usb 1-5.1.3: Manufacturer: retronicdesign.com
[ 5870.453986] usb 1-5.1.3: SerialNumber: 3292
[ 5870.462639] input: retronicdesign.com Retro Joystick Adapter v2.0 as /devices/pci0000:00/0000:00:14.0/usb1/1-5/1-5.1/1-5.1.3/1-5.1.3:1.0/0003:1781:0A99.0008/input/input17
[ 5870.520437] hid-generic 0003:1781:0A99.0008: input,hidraw5: USB HID v1.01 Joystick [retronicdesign.com Retro Joystick Adapter v2.0] on usb-0000:00:14.0-5.1.3/input0

ATtiny85 per Drahtverhau ausgelesen

Ich habe heute mal endlich ein wenig in meiner Bastelkiste gewühlt. Bis heute war ich mir nicht sicher, ob man AVRs wirklich mit wenig Aufwand direkt im Steckbrett programmieren kann. Ich habe es einfach mal selbst ausprobiert und einen ATtiny85 mit ganzen 8 Pins mehr oder minder direkt mit meinem mySmartUSB light Programmiergerät verbunden.

Ich habe den 6 auf 10Pin Adapter missbraucht, um einfach Steckbrücken mit Buchsen auf die Pins zu stecken. Dabei habe ich mich an ein Schemabild aus dem Netz gehalten und dabei eine möglichst ähnliche Farbcodierung verwendet. Auf meinem Steckbrett musste ich dann nur die Buchsen auf Pins abbilden und gemäß Datenblatt die Pins am Microcontroller mit den jeweiligen Signalen verbinden.

Danach habe ich einfach mal per avrdude Inhalte gelesen und geschrieben. Flash und Fuses funktionierten prächtig, beim EEPROM hatte ich mein Problem. Eventuell kommt mir da die EESAVE Fuse ins Gehege. Ich plane am langen Wochenende (morgen habe ich Urlaub) ein Testprogramm für den ATtiny85 zu schreiben, bei dem ich mal im EEPROM per Programm schreibe und lese.

Insgesamt, ja, es funktioniert. Ich konnte den Chip im Steckbrett ohne spezielle Hardware auslesen und programmieren.

ATtiny85 mit fliegender Verdrahtung im Steckbrett

ATtiny85 mit fliegender Verdrahtung im Steckbrett

Arduino Sketch zum Auslesen des EEPROM Inhaltes

Um mein mySmartUSB light Programmiergerät zu verifizieren, habe ich folgenden Arduino Sketch ausprobiert. Der Arduino zeigt damit seinen EEPROM Inhalt in HEX Notation in der seriellen Konsole an.

/* Display EEPROM contents from Arduino UNO
 * (c) 2014 by Matthias Arndt
 */
#include <EEPROM.h>

void setup()
{
  uint16_t addr = 0;
  uint8_t c;
  uint8_t nl = 0;

  Serial.begin(9600);
  Serial.print("Arduino EEPROM contents:\n\n");

  while(addr < 1024)
  {
    c = (EEPROM.read(addr) & 0xFF);

    addr++;

    Serial.print(c, HEX);
    Serial.print(' ');

    if(nl < 31)
    {
      nl++;
    }
    else
    {
      Serial.print('\n');
      nl = 0;
    }

  }

}

void loop()
{
  for(;;);
}

mySmartUSB light – Programmiergerät für AVRs im USB Stick Format

mySmartUSB light - Programmiergerät für AVRs

mySmartUSB light - Programmiergerät für AVRs

Irgendwann im letzten Jahr stolperte ich beim Recherchieren über das mySmartUSB light Programmiergerät für AVRs. Laut der Dokumentation und Beschreibung sollte es problemlos auch unter Linux funktionieren.

Bei einem moderaten Preis um 20€ habe ich es mir dann als Ergänzung zu meinem ähnlich preiswerten Pollin Evaluationboard gekauft.

Das Gerät kommt als kleiner USB Stick daher, hat einen Anschluss für das 6polige ISP Kabel und kann kleinere Systeme auch problemlos über USB mit Saft versorgen.

Ausprobiert habe ich den Stick kurzerhand mit meinem Arduinoboard, allerdings nur lesend. Der Arduino bringt den 6poligen Sockel direkt mit, so daß das Programmiergerät direkt passt. Unter Linux wurde mir direkt ein neuer USB COM Port angezeigt und verfügbar gemacht.

Anschließend habe ich AVR8 Burn-O-Mat benutzt, avrdude auf STK500v2 Protokoll und die USB Schnittstelle eingestellt, und es hat auf Anhieb funktioniert, ich konnte den Flashinhalt des Arduinos direkt auslesen. Im Binärvergleich mit dem Arduinoprotokoll und dem Arduino direkt stimmt das FLASH überein, beim Auslesen des EEPROMs gab es Diskrepanzen, das neue Gerät zeigt ein leeres Eeprom, während mit dem Arduinoprotokoll Inhalte übertragen werden. Auch die Fuses konnte ich nur mit dem neuen Gerät und STK500V2 Protokoll korrekt auslesen. Da muss ich in jedem Fall mal mit einem leeren ATmega16 oder dgl experimentieren, vllt. hat das arduino Bootloaderprotokoll Besonderheiten oder meine avrdude Version ist zu alt.

Unter Windows muss man wohl erst einen USB Treiber installieren, aber ich gehe davon aus, daß das Gerät dort genauso und ohne Macken funktioniert.

Für 10polige Sockel gibt es wohl ein offizielles Adapterkabel, bzw ein Wechsler, der von 10 auf 6 und 6 auf 10 Pole umschaltet. Beide Formate sind in jedem Fall von Atmel standardisiert.

In jedem Fall für Embedded Entwickler, die AVRs per ISP programmieren, ein nützliches und preiswertes Gadget für den kleinen Erste Hilfe Koffer.

Mehr zum Gerät, u.a. Downloads unter http://shop.myavr.de/Topseller/mySmartUSB%20light.htm?sp=article.sp.php&artID=200006

AVR, JTAG and externel reset

Today at the office I learned a nice trick that might become handy for other AVR users.

A times a target system with AVR microcontroller exhibits an accessibility problem. The system features an ATmega644PA microcontroller unit which is debugged via JTAG interface. The board can only be flashed via JTAG if the external reset is triggered properly.

In an AVR Studio project the system can be told to enable the external reset over the wiring but access without the project over the Atmel JTAGICE MKII programmer fails. How to place the thing in reset condition so JTAG can take over?

The trick came from one of our electronics gurus who simply asked: “Can’t you short the reset and make it work?” We simply tried and yes this works. Ofcourse the flashed firmware does not boot if RESET is tied to GND but JTAG access works. The device can be flashed, fuses set and read and maybe debugging works too (we didn’t try that).

So basically if you try to access an AVR mcu with JTAG interface and no backup such as SPI, try tying the RESET line to GND. I simply made a little wire bridge shorting pins 6 (RESET) with 2 (GND) on the 10pin JTAG cable. I plug the main cable in the left socket on the programmer cable and put the bridge in the second socket whichs is probably wired in parallel. It worked well for us today!

Mikrocontroller mit ARM Core im DIL Gehäuse

http://www.heise.de/newsticker/meldung/Guenstiger-ARM-Controller-im-DIP-Gehaeuse-1743319.html

Leider ist meine freie Zeit für Hobbies eh schon begrenzt und ich arbeite kaum mehr mit dem, was ich schon an 8051, AVR und R8C im Schrank liegen habe. Ansonsten würde ich mit so einem Käfer mal gerne loslegen. Natürlich ohne einen BASIC Compiler, sondern mit einem GCC.

Zum Ausgleich habe ich den Mikrocontrollerspaß ja im Job. Für mein aktuelles Softwareprojekt bekomme ich hoffentlich auch bald die AVR basierte Hardware auf den Tisch.

Ein DB9 Joystick auf USB Adapter

In einer Ausgabe des Load Magazin auf der Xzentrix 2012 sah ich eine Werbeanzeige für diesen Joystickadapter zum selberzusammenbauen. Damit kann man wohl 2 klassische Joysticks mit DB9 Anschluss (C64, Amiga, Atari ST, etc) per USB an der PC anschliessen und verwenden: http://retro-donald.de/sinchai-shop/index.php?main_page=product_info&cPath=1&products_id=137

Die Firmware soll noch ein paar Macken haben und unter Linux oder auf dem Mac nicht 100% tun. Mal schauen, ich notiers mir mal im Hinterkopf und schau in Zukunft nochmal nach. Prinzipiell suche ich genau so ein Teil seit langer Zeit. Ausserdem hatte ich mal überlegt, selber eines mit AVR zu basteln, habe das Projekt aus Zeitmangel aber noch nicht angefangen.

stdint.h and stdbool.h for Keil C51

Interestingly, Keil C51 does not ship with C99 compliant stdint.h and stdbool.h header files.

But there is no need to dispair. The stdint.h from SDCC seems to work ok however I personally would not trust the pointer types and widths. However in a context of a 8051 MCU, I’d rather introduce my own data type for pointers anyway due to the different possible memory spaces. A generic pointer will have to carry section information that has to be evaluated at runtime. A special typed pointer won’t waste as many resources.

The stdbool.h from SDCC can be used as well. Just make sure to be Keil compatible and use the following definitions:

#define _Bool bit
#define BOOL bit
#define bool _Bool
#define __bool_true_false_are_defined 1

DOs and DO NOTs for developing Embedded Systems software

Zum Thema “Was sollte man tun und was nicht, wenn man Software für Embedded Systems entwirft und usitzt?”habe ich mal einen Artikel zusammegestellt. Dieser Artikel ist natürlich subjektiv, ich bin gerne bereit zu diskutieren. Die meisten Aspekte habe ich aber derweil schon aus verschiedenen Onlinequellen bestätigt bekommen.

http://www.final-memory.org/?page_id=2113

Im Prinzip habe ich dort mal zusammengefasst, was ich alles seit der Universität gelernt habe. Teile davon praktisch im Job, viele andere aber auch fortbildungsmäßig aus dem Netz. Im Vordergrund steht vorallem, fiese Fallen von faul programmierten C zu umgehen. Viele der Regeln und Vorschläge sind auch sprachunabhängig und können natürlich auch auf andere Programmiersprachen angewendet werden.

Ich selber habe viele dieser Regeln früher zum Beispiel nicht beherzigt. Wenn ich die Sourcen zu meiner Diplomarbeit ansehe, dann habe ich viele davon eklatant verletzt. Aber irgendwo will man ja auch einen Lerneffekt erkennen.

Als weitergehende Lektüre kann ich auch das “Embedded C Coding Standard” von Michael Barr empfehlen.

Irgendwann schreibe ich vielleicht auch noch einengrößeren zusammenhängenden Artikel oder auch ein kleines Buch. Die Liste kann sicherlich noch erweitert werden.

Code::Blocks als IDE Alternative?

Code::Blocks

Code::Blocks

In den vergangenen Monaten und fast Jahren habe ich eigentlich Eclipse als IDE verwendet. Allerdings hatte ich schon öfters von der Alternative Code::Blocks gelesen und so habe ich diese IDE auch mal ausprobiert. Sie bietet eigentlich nur Vorteile, hat allerdings auch deutliche Einschränkungen. In Summe hat es mich aber schon überzeugt und fürs private Programmieren werde ich in Zukunft für C Projekte auf jeden Fall mit Code::Blocks arbeiten.

Vorteile nach erstem Ausprobieren der Version 8.02

  • in C++ geschrieben und damit deutlich flotter als Eclipse
  • Gute Unterstützung für C und C++
  • eigenes Buildsystem, d.h. Makefiles von Hand schreiben ist nicht mehr immer nötig
  • eingebaute Konfiguration für AVR und SDCC, inklusive Compilersettings
  • konfigurierbare Compiler, insbesonders GCC Derivate
  • schneller Editor
  • Crossplattform, Code::Blocks gibt es auch für Windows

Erkannte Nachteile

  • Vala wird nur über Custom makefiles unterstützt und kein Syntaxhighlighting dafür
  • Editorkomponente ist Scintilla und damit nicht direkt erweiterbar
  • naturgemäß kein so guter Support für Java wie etwa Eclipse
  • keine direkte SVN Integration (jedenfalls nicht unter Linux, für Windows gibt es wohl ein Plugin für TortoiseSVN)

Ich glaub in Summe muss jeder selber entscheiden, ich selbst bin so gut wie überzeugt, allein schon weil ich ja selber bevorzugt mit ANSI C arbeite und zumindest privat nicht alles über SVN ein- und auschecke.