Feuerspeiender Drache für Microcontroller

Was erweckt einen AVR-Microcontroller von Atmel zum Leben? Ein Programm, geschrieben in Assembler oder C. Es läßt sich mittels ARV Studio 5 editieren, debuggen, compilieren, linken, flashen, so daß dem Controller der maschinenlesbare, um nicht zu sagen: unleserliche Code in binären Sequenzen von Nullen und Einsen eingehaucht wird. Indem der elektrisierende Atem des Drachen über den Speicher des Controllers hinwegstreicht, der in Kontakt mit dem Dragon-Board kommt.

Atmels Drachen auf dem Dragon-Board drängt sich nicht jedem auf, doch wer das unscheinbare Ungeheuer kennt, weiß es zu schätzen und will es nicht missen. Faucht der Drache, lernt der AVR was der Code verlangt: sich in rasanten Schleifen und mit riskanten Sprüngen zu bewegen, oder stillzuhalten, bevor er wieder aufgescheucht wird. Als Alf und Vegan das Risc-Konzept umsetzten, woher übrigens das Akronym AVR stammt (die norwegische Saga schweigt sich allerdings aus, und ein aufgezeichnetes Interview ist an der entscheidenden Stelle zufälligerweise gestört), vergaßen sie nicht, gewisse Sicherungen einzubauen. Wer sich unbedarft daran zu schaffen macht, sollte auf schlimme Folgen gefaßt sein. Doch wenn es darauf ankommt, solche Fuses zu manipulieren oder zu reparieren, läßt einen der Drache auch dabei nicht im Stich. Nebenbei trägt das Dragon-Board, wenn gewünscht, noch einen AVR mit sich herum. Sitzt der in einem eigens aufgelöteten Sockel, ist er auswechselbar. Die prototype area des Boards bietet Platz für den Schleudersitz. Entweder mit 28 oder mit 40 Pins, dual in-line. Programmiert wird jener Controller mittels des Boards, ohne bei der Programmierung anderer Controller zu stören. Allenfalls sind Kabel umzustecken, falls dieselbe Programmierschnittstelle gebraucht wird. Davon gibt es drei: JTAG, ISP sowie HV_PROG (für HVSP oder PP). Ein VCC-Anschluß ist ebenfalls vorhanden, der 5V mit maximal 300mA für externe Elektronik zur Verfügung stellt.

Im AVR Studio 5 wird dafür gesorgt, daß die Firmware des Dragon-Boards auf dem Laufenden bleibt. Ist das USB-Kabel eingesteckt und der Drache zur Stelle, werden widerspenstige Bits und Bytes in Angriff genommen, ohne ihnen die geringste Chance zu lassen. Schon in der schönen Schachtel, verziert mit einem goldenen Drachen-Emblem, schimmert die schwarze Platine undurchsichtig, als gebe es etwas zu verbergen. The dark side of the Force?

C# tritt elegant im kleinen Schwarzen auf

Code in C# und Microcontroller stehen sich nicht eben nahe, nehmen manche an. Angesichts eines winzigen Boards, des Netduino, erweist sich die Annahme als Irrtum. Wer dem ‘kleinen Schwarzen’ noch nicht begegnet ist, wird von dessen elegantem Äußeren nicht nur fasziniert sein, weil er weiß, was sich dahinter verbirgt. Wenn er es denn weiß. Ein 32-Bit-Controller von Atmel, getaktet mit 48MHz, der in C# programmierbar ist, und zwar ohne irgendein weiteres Board einzuschalten (wie etwa das auch nicht unelegante Dragon-Board). Der ARM7-Controller ist nämlich in das .NET Micro Framework eingebettet, das auf der Netduino-Hardware als Software implementiert ist.

Der Standdard-Version des Netduino steht ein Netduino Plus zur Seite, um gegebenenfalls auf 2 GB Speicher einer auswechselbaren MicroSD-Karte zurückzugreifen, sowie das Board ans Ethernet anzubinden, so daß sich die uneingeschränkte Kommunikationsfähigkeit mit dem LAN und WAN über das TCP/IP-Protokoll eröffnet. Aber auch ohne Netz im Hintergrund bietet sich das Board an, um C# als »see sharp« auszubuchstabieren. Es lassen sich digitale und analoge Ports ansprechen, Signale einlesen oder ausgeben, es laufen Timer ab, Interrupts werden ausgelöst, die PWM arbeitet nebenher, und zwischenzeitlich legt sich der Prozessor schlafen, solange es nichts weiter zu tun gibt.

Und all das geschieht unter Visual-C# aus der Entwicklungsumgebung heraus, an die das Netduino-Board unmittelbar angeschlossen ist, sobald der Stecker des Micro-USB-Kabels eingesteckt wird. Lediglich das .NET Micro Framework ist zuvor zu installieren. Es fügt sich nahtlos in die Entwicklungsumgebung von Visual-C# ein. Templates für Projekte mit dem Netduino beziehungsweise Netduino Plus lassen sich auswählen, und das Board wird im Debugging-Modus programmiert, wobei das Programm automatisch in den Flash-Speicher des Boards übertragen wird. Anschließend wird das Board abgenabelt, um bis zur nächsten Umprogrammierung allein zu arbeiten. Bei jedem Power-Up startet das Programm. Einen (Reset-) Taster gibt es auch, nebst weißer Kontroll-LED. Außer einer zusätzlichen blauen LED, die bequem ansteuerbar ist, ist sonst nichts weiter an Bord genommen worden. Knappes Design, es unterstreicht die sich bietenden Möglichkeiten. Auf dem Board, das dem bekannten und bewährten Arduino-Layout folgt, stehen geregelte 3.3V und 5.0V zur Verfügung. Es wird seinerseits über das angeschlossene USB-Kabel mit 5V versorgt, oder wahlweise über ein externes Netzteil oder eine entsprechenden Batterie mit Gleichspannung zwischen 7.5V und 12V.

Fehlt bloß noch ein eigenes Programm. Hier ein harmloses Beispiel:

// NetduinoPlus Timer Recipe (by Peter Gold)

// Device: NetduinoPlus
// Task: Invoke timer indicated by blue LCD on board.

using System;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using Microsoft.SPOT;
using Microsoft.SPOT.Hardware;
using SecretLabs.NETMF.Hardware;
using SecretLabs.NETMF.Hardware.NetduinoPlus;

namespace NetduinoPlusTimer
{
    public class Program
    {
        static OutputPort led = new OutputPort(Pins.ONBOARD_LED, false); // blue LED on board

        public static void Main()
        {
            // specify time interval in milliseconds
            int timeInterval = 11000; // 11000ms = 11s
            // invoke timer
            System.Threading.Timer timer = new System.Threading.Timer(new TimerCallback(onTimer), null, 0, timeInterval);
            // let microcontroller sleep
            Thread.Sleep(Timeout.Infinite);
        }

        private static void onTimer(object state)
        {
            // notify each tick of timer by blinking blue LED
            led.Write(true); // LED on
            Thread.Sleep(300); // 300ms delay
            led.Write(false); // LED off
            // or toggle LED by: led.Write(!led.Read());
        }
    }
}

Das Programm, geeignet für den Netduino und den Netduino Plus, bewirkt lediglich, daß ein blaues Licht blinkt. Trotzdem ist das nicht ganz ohne. Immerhin wird auf Interrupt-Ebene gearbeitet. Der Prozessor ist nicht länger involviert, weshalb er seine Zeit verschläft, energiesparend.