Angetestet: MC9S08JS16L

Die MC9S08JS8/16 Microcontroller haben einen schnellen 8 Bit Core und eine Full Speed USB Schnittstelle und eignet sich gut für kleinere digitale Projekte am USB-Port und Standalone. Auf der Übersichtsseite von Freescale gibt es die Details. Die Typen mit dem "L" am Ende haben einen Bootloader integriert, der bei 3,3 V externer Versorgungsspannung arbeitet, wobei dann am Vusb33-Pin eine externe 3,3 V Spannung erwartet wird, wohingegen die Typen ohne "L" einen Bootloader haben, der mindestens 3,9 V Versorgungsspannung erwarten und den internen 3,3 V Spannungsregler aktivieren, sodaß am Vusb33-Pin dann entsprechend dem Datenblatt noch die Kondensatoren notwendig sind. Da viele externe Chips heutzutage mit 3,3 V laufen und die digitalen IO-Pins des Microcontrollers mit der Versorgungsspannung laufen, habe ich einen externen 3,3 V Spannungsregler eingesetzt und den MC9S08JS16L zum Testen verwendet. Habe leider keinen Händler gefunden, der den vorrätig gehabt hätte, Farnell und Digikey hatten nur die nicht-L-Version, aber konnte ich problemlos bei Freescale per "Buy Direct" bestellen und war drei Tage später da. Kostet zwischen 0,91 Euro und 1,19 Euro, je nach Stückzahl.

Den Chip gibt es im QFN und SOIC Gehäuse. Ich habe die SOIC-Bauform gekauft, auf einen Adapter aufgelötet und dann auf einem Steckboard getestet:

Links ist ein 4 MHz Quarzoszillator zu sehen, rechts daneben ein Pegelkonverter (da ich hier nur einen 5V Oszillator herumliegen hatte) und links unten ein LDO 3,3 V Spannungswandler, der über eine 200 mA selbstrückstellende Sicherung an den 5 V des USB-Ports hängt. An den Versorgungspins sind jeweils möglichst direkt 100 nF Abblock-Kondensatoren angelötet. USBDN und USBDP sind wie in dem "Basic System Connections" Diagramm des Datenblattes vorgeschlagen, per 33 Ohm Widerstand mit den USB-Datenleitungen verbunden, sowie ein Reset Taster mit 100 nF gegen Masse und 10k Pullup. Am BLMS-Pin, um den Bootlader zu aktivieren, ist ein weiterer Taster, ohne Kondensator und Pullup, da laut Datenblatt dort nur 50 pF Last erlaubt sind. Allerdings kann der Pin nach dem Booten als normaler Ausgang verwendet werden (als Eingang kann man ihn nicht schalten), daher habe ich da noch eine LED mit 470 Ohm Widerstand an VDD verbaut. Der USB-Bootloader detektiert automatisch, welcher Takt am Eingang anliegt (muß allerdings 2, 4, 6, 8, 12 oder 16 MHz sein), sodaß der USB-Bus mit einem sauberen Takt betrieben wird. Alternativ kann man aber auch mit einem externen Programmiergerät über den BKGD/MS-Pin den Chip programmieren.

Die USB-Buchse ist eine Mini-USB Buchse, in Dead-Bug-Technik aufgelötet, wobei die Schirmanschlüsse mit dickeren Draht eine recht stabile Verbindung zur Lochrasterplatine (einseitig mit Lötpunkten beschichtet) ergeben und durch die Anbringung von nicht angeschlossenen Stiftleisten auch auf der gegenüberliegenden Seite von der Signalseite, hält es auch recht gut im Steckboard.

Als Entwicklungsumgebung gibt es die CodeWarrior Development Suite - Special, wobei man die HCS08/ColdFire-Version braucht. Ist eine abgespeckte Version, die für C Code auf 32 kB Code-Größe begrenzt ist, was aber kein Problem bei maximal 16 kB Flash ist. Damit kann man recht leicht ein Projekt mit dem "Processor Expert" erstellen, was ein ähnliches Konzept wie der Cypress PSoC Designer verfolgt: Man kann in der IDE Software und Hardware Module hinzufügen und per GUI konfigurieren. Daraus wird dann C Code generiert, der die Hardware initialisiert und Stellen freiläßt, an denen man seine Implementierung schreiben kann.

Für einige Dinge, wie die Timer-Konfiguration oder den Baudrate-Generator gibt es Wizards, bei denen man nur die gewünschte Frequenz vorgibt und die dann alle benötigten Registerwerte ausrechnen und den Frequenzfehler anzeigen. Nützlich hierbei auch die Clock-Path Anzeige, bei der übersichtlich dargestellt wird, durch welche Teiler und sonstige Stufen der Takt läuft, um die Baudrate zu generieren:

Das typische Hello-World Programm ist natürlich, die LED blinken zu lassen. Dazu eignet sich der RTC sehr gut: Nachdem ich bei den Clock-Settings "External ref. clock for peripherals" eingeschaltet hatte, konnte ich dann den 4 MHz Eingang als Quelle für den RTC definieren. Das Modulo-Register (andere Hersteller nennen das Capture-Compare) ist zwar nur 8 Bit breit, aber dafür gibt es eine ganze Reihe verschiedener Binär- und Dezimalvorteiler. Man kann also problemlos 0,5 ms oder aber auch 2 Sekunden Takt exakt einstellen. Durch die geringe Auflösung des Modulo-Registers sind aber besondere Sachen, wie z.B. 1,000001 Hz, nicht möglich. Man kann aber auch den internen 1 kHz Oszillator verwenden und den Chip in einen Stop-Modus versetzen, sodaß er z.B. nur jede Sekunde aufgeweckt wird.

Den Pin kann man auch per GUI konfigurieren und einbinden. Man muß dann tatsächlich nur noch vier Zeilen selbst programmieren:

  static bool test = 1;
  RTCSC = RTCSC | 0x80;
  led_PutVal(test);
  test = !test;

Man muß dann noch den "S08JS family bootloader" installieren (unter "BOOTLOADER_GUI" hier zu finden) und wenn man dann den USB-Stecker bei gedrückter BLMS-Taste einsteckt, dann wartet der Bootloader auf Befehle (oder auch ohne BLMS-Taster, wenn noch kein Programm geflasht wurde). "Mass Erase" und "Program" klicken, und das Flash wird programmiert. Die CRC-Fehlermeldung scheint zu kommen, da das GUI-Programm Konfigurationsbereiche beschreibt und diese dann wieder auslesen und per CRC testen will, aber das Auslesen von den Konfigurationsbereichen scheint nicht zu funktionieren (so zumindest ein Forumseintrag irgendwo im Web). Das Programm läuft aber prima und mit einer RTC-Periode von 0,5 Sekunden blinkt die LED dann mit 1 Hz.

Leider geht die Aktivierung des Bootloaders per BLMS-Pin nur nach einem Power-On Reset, nicht per Reset am Reset-Pin. Also man kann nicht Reset- und BLMS-Taster gedrückt halten und dann den Reset-Taster loslassen, um den Bootloader zu aktivieren, wie das z.B. bei einigen Atmel-Chips möglich ist. Aber man könnte natürlich seinen eigenen Bootloader vom ROM-Bootloader laden lassen, der das dann kann.


30 . Oktober 2010, Frank Buß