Chronos Flying Mouse im Praxiseinsatz

Posted by Thomas Weller on März 12, 2012
eZ430 Chronos / No Comments

Die Chronos Flying Mouse hat mich derart fasziniert, dass ich sie tatsächlich für eine meiner Präsentationen einsetzen wollte. Doch beim Üben der Präsentation fiel mir auf, dass die Flying Mouse auch bei unterschiedlichsten Einstellungen häufig mehrfach hintereinander klickt. Das ist in Powerpoint natürlich ärgerlich, denn wer mag schon viele Folien auf einmal überspringen?

Eine kleine Änderung am Source Code ermöglichte mir, eine Verzögerung von fünf Sekunden einzubauen. Dazu habe ich in der Datei transform.cpp eine neue Variable namens last_click_time hinzugefügt und in der Methode transform() entsprechend ausgewertet:

if (been_clicking == 1)
{
if (static_cast<int32>(GetTickCount()) - last_click_time > 5000)
{
SetCursorPos(last_stable_pos.x, last_stable_pos.y);
click_mouse(MOUSEEVENTF_LEFTDOWN);
click_mouse(MOUSEEVENTF_LEFTUP);
last_click_time = static_cast<int32>(GetTickCount());
}
}

Auf diese Art muss zwischen zwei Klicks mindestens fünf Sekunden liegen.

Beim Test auf meinem Rechner zu Hause führte dies zu sehr brauchbaren Ergebnissen. Beim tatsächlichen Vortrag traten allerdings Schwierigkeiten auf. Ich vermute, dass es an der Referentenansicht über zwei Bildschirme lag. Klickt man mit der Maus in der Referentenansicht, sind die Aktionen abhängig von der Mausposition. Nur ein Klick auf die Folie selbst schaltet weiter.

Ich muss wohl noch weitere Änderungen vornehmen, damit ich zuverlässig mit der Flying Mouse präsentieren kann. Eine Idee dafür habe ich schon: im nächsten Anlauf werde ich Tastendrücke an Powerpoint absetzen. Den Quellcode stelle ich auf jeden Fall wieder hier zur Verfügung.

Tags: , , ,

Upgrade auf Code Composer Studio 5

Posted by Thomas Weller on Februar 12, 2012
eZ430 Chronos / No Comments

Mein Bruder teilte mir mit, dass die neue Version des Code Composer Studios (Version 5) deutlich schneller arbeitet als die im Original mit der eZ430 Chronos mitgelieferte Version 4. Darum habe ich mir das 1,2 GB große Paket von Texas Instruments heruntergeladen und installiert.

Das Ergebnis ist wirklich beeindruckend. Die Debug-Geschwindigkeit ist wirklich signifikant gestiegen. Bislang dachte ich, die Uhr sei so langsam, aber offensichtlich lag es nicht an der Hardware sondern an der Entwicklungsumgebung.

Die Free-Edition ist ausreichend, um MSP430 Projekte zu erzeugen. Die Einschränkung liegt hauptsächlich in der Menge an Binärcode, die erzeugt werden kann. Die Grenze liegt bei 16 kB. Texas Instruments verlangt für den Download eine Registrierung, bei der man einige persönliche Daten preisgeben muss.

Verglichen mit der Erstellung des Hello World Projekts in Code Composer Studio 4 ist auch die Anzahl der Schritte zur Erstellung des Hello World Beispiels deutlich reduziert:

Beim Update geht leider die vorprogrammierte Firmware für die eZ Chronos verloren und befindet sich nicht mehr im Workspace. Wie bereits zuvor beschrieben, lässt sich diese aber wieder herunterladen.

Tags:

Original Firmware aufspielen

Posted by Thomas Weller on Februar 06, 2012
eZ430 Chronos / No Comments

Hat man die eZ Chronos erst einmal umprogrammiert, ist der Speicher auf der Uhr erst einmal überschrieben. Wenn man dann nette Zusatzprogramme wie die Chronos Flying Mouse findet und ausprobieren will, muss man die Original Firmware wieder aufspielen.

Dazu lädt man zunächst die aktuelle Version der Firmware von Texas Instruments herunter. Das Projekt kann dann von seinem Installationspfad (C:\Program Files (x86)\Texas Instruments\eZ430-Chronos\Software Projects\Chronos Watch\CCS\Sports Watch) in Eclipse importiert werden. Beim Importieren sollte man zumindest auf Windows 7 Systemen den Zusatz “Copy into workspace” auswählen, da ansonten der Compile-Vorgang aufgrund unzureichender Rechte fehlschlagen kann.

Da die Firmware noch für Compiler-Version 3.1 geschrieben wurde, ergibt dies ein Warning beim Übersetzen.  Man kann aber auch die Compiler-Version auf 4.0 festlegen. Vor dem Compilieren wählt man noch die passende Konfiguration (in meinem Fall die 433 MHz Variante) und spielt die Firmware wieder auf.

Und so sieht das dann im Code Composer Studio (Version 5) aus:

 

Tags: ,

Hello World

Posted by Thomas Weller on Januar 31, 2012
eZ430 Chronos / No Comments

Nach der Untersuchung, welche Display-Segmente sich an welcher Adresse befinden, war es ein einfaches, das Display mit dem Schriftzug “Hello World” zu versehen. Allerdings ist das Display typischerweise nicht in der Lage, zweimal fünf Buchstaben anzuzeigen. In diesem Fall lassen sich die beiden Ls jedoch in einer 7-Segment-Anzeige unterbringen und für die Lesbarkeit habe ich das W auf 1 1/2 7-Segment-Anzeigen verteilt, was auch nicht immer möglich ist.

Zunächst die Schritte in der Entwicklungsumgebung Code Composer Studio 4.

Hier ist der Code für main.c, basierend auf dem spanischen Original, aber an der ein oder anderen Stelle optimiert.
// Hello World
// Description: Shows "hEllo WorLd"

#include "cc430x613x.h"

void main(void) {
unsigned char * lcdmem;

// Clear entire display memory
LCDBMEMCTL |= LCDCLRBM + LCDCLRM;

// LCD_FREQ = ACLK/16/8 = 256Hz
// Frame frequency = 256Hz/4 = 64Hz, LCD mux 4, LCD on
LCDBCTL0 = (LCDDIV0 + LCDDIV1 + LCDDIV2 + LCDDIV3) | (LCDPRE0 + LCDPRE1)
| LCD4MUX | LCDON;

// LCB_BLK_FREQ = ACLK/8/4096 = 1Hz
LCDBBLKCTL = LCDBLKPRE0 | LCDBLKPRE1 | LCDBLKDIV0 | LCDBLKDIV1 | LCDBLKDIV2
| LCDBLKMOD0;

// I/O to COM outputs
P5SEL |= (BIT5 | BIT6 | BIT7);
P5DIR |= (BIT5 | BIT6 | BIT7);

// Activate LCD output
LCDBPCTL0 = 0xFFFF; // Select LCD segments S0-S15
LCDBPCTL1 = 0x00FF; // Select LCD segments S16-S22

lcdmem = (unsigned char *) 0x0A21;
*lcdmem = BIT0 + BIT1 + BIT2 + BIT6; // "h"
*(++lcdmem) = BIT0 + BIT1 + BIT2 + BIT4 + BIT7; // "E"
*(++lcdmem) = BIT0 + BIT2 + BIT5 + BIT6; // "ll"
lcdmem = (unsigned char *) 0x0A25;
*lcdmem = BIT1 + BIT2 + BIT6 + BIT7; // "o"

lcdmem = (unsigned char *) 0x0A2B;
*lcdmem = BIT6 + BIT2 + BIT3 + BIT7 + BIT4 + BIT1; // "W"
*(--lcdmem) = BIT2 + BIT3 + BIT5 + BIT6; // "o"
*(--lcdmem) = BIT6 + BIT5; // "r"
*(--lcdmem) = BIT4 + BIT6 + BIT3; // "L"
*(--lcdmem) = BIT1 + BIT2 + BIT3 + BIT6 + BIT5; // "d"

__no_operation(); // For debugger
}

Das Ergebnis auf der Uhr:

Das Display auf diese Art zur Anzeige zu bringen ist auf Dauer allerdings mühselig. Ich werde mir wohl als nächstes ein paar Hilfsfunktionen programmieren, die mir den Aufwand reduzieren.

Tags: , ,

Vorbereitung von Hello World

Posted by Thomas Weller on Januar 02, 2012
eZ430 Chronos / 1 Comment

Normalerweise fängt man eine neue Programmierumgebung, eine neue Programmiersprache oder eine neue Hardware mit einem Hello-World-Projekt an. Doch im Falle der programmierbaren Uhr eZ430 Chronos ist das nicht so einfach. Glücklicherweise fand ich auf einer spanischen Webseite eine Abwandlung von Hello World, nämlich Hi Earth. Meine Bemühungen, daraus ein Hello World zu machen waren nicht sonderlich erfolgreich, weil ich nicht wusste, wie das Display genau angesteuert wird.

Also musste ich für die Vorbereitung von Hello World zunächst die Belegung des Displays herausfinden. Dazu muss man zunächst die Register des Displays überhaupt kennen. Hier hilft Texas Instruments mit einem PDF Dokument. Auf Seite 38 steht, dass der Offset für das Display selbst bei 0x0A00 liegt. Weitere 0×20 später fängt der LCD Speicher an und reicht bis 0x2D. In einer einfachen Schleife habe ich dann die Segmente nacheinander eingeschaltet und bin im Debugger Schritt für Schritt durchgegangen.

// Display Test
// Description: Activates all segments on the display
#include "cc430x613x.h"
#include <string.h>
void main(void)
{
unsigned char * lcdmem;
    int i;
    // Clear entire display memory
    LCDBMEMCTL |= LCDCLRBM + LCDCLRM;
    // LCD_FREQ = ACLK/16/8 = 256Hz
    // Frame frequency = 256Hz/4 = 64Hz, LCD mux 4, LCD on
    LCDBCTL0 = (LCDDIV0 + LCDDIV1 + LCDDIV2 + LCDDIV3) | (LCDPRE0 + LCDPRE1) | LCD4MUX | LCDON;
    // LCB_BLK_FREQ = ACLK/8/4096 = 1Hz
    LCDBBLKCTL = LCDBLKPRE0 | LCDBLKPRE1 | LCDBLKDIV0 | LCDBLKDIV1 | LCDBLKDIV2 | LCDBLKMOD0;
    // I/O to COM outputs
    P5SEL |= (BIT5 | BIT6 | BIT7);
    P5DIR |= (BIT5 | BIT6 | BIT7);
    // Activate LCD output
    LCDBPCTL0 = 0xFFFF; // Select LCD segments S0-S15
    LCDBPCTL1 = 0x00FF; // Select LCD segments S16-S22
    // Loop through all display memory
    for ( i=0x0A20;i<0xA2D;i++)
    {
        lcdmem = (unsigned char *)i;
        // Set one bit after another
        // so that we can see during debugging which one is activated
        *lcdmem = (unsigned char)(*lcdmem | (BIT0));
        *lcdmem = (unsigned char)(*lcdmem | (BIT1));
        *lcdmem = (unsigned char)(*lcdmem | (BIT2));
        *lcdmem = (unsigned char)(*lcdmem | (BIT3));
        *lcdmem = (unsigned char)(*lcdmem | (BIT4));
        *lcdmem = (unsigned char)(*lcdmem | (BIT5));
        *lcdmem = (unsigned char)(*lcdmem | (BIT6));
        *lcdmem = (unsigned char)(*lcdmem | (BIT7));
    }
    __no_operation(); // For debugger
}

Das Ergebnis ist ein Bildschirm, bei dem alle Segmente aktiviert sind. Wichtiger ist jedoch der Weg dorthin im Debugger, so dass man nachvollziehen kann, welches Segment gerade aktiviert wurde.

Auf diese Art erhält man eine Zuordnungstabelle, die in etwa dem Handbuch (Seite 77, Figure 4-25) entspricht, wenn man weiß, wie man die Adressen zuordnen muss.

Mit dieser Tabelle ist es nun möglich, das Hello World Beispiel zu implementieren.

Tags: , ,