C# Usercontrol

Heute mal was ganz anderes. Wenn man ein Programm schreibt findet man nicht immer das Steuerelement was man braucht.
Letztens benötigte Ich eine „Oszilloskop Ansicht“ um eine Vorschau für eine berechnete Wellenform darzustellen.
Nun in Visual Studio gibt es zwar vieles aber eben dies nicht. Viele werden jetzt sagen „nimm einfach eine Picturebox und zeichne da rein“.
Nun das habe ich auch getan um den Algorithmus zu testen aber Ich wollte was schöneres. Also schnell ein neues Projekt aufgesetzt.

Entwicklungsumgebung einrichten

  • Leere Projektmappe anlegen (hier Usercontrol)
  • Neues Projekt hinzufügen „Windows Forms-Anwendung“ (TestAPP)
  • Neues Projekt hinzufügen „Windows Forms-Steuerelementbibliothek“ (Oszilloskop)
  • Die Eigenschaft (Name) von Usercontrol1 in Oszilloskop abändern
  • Projektmappe erstellen [F6] damit das neue Steuerelement in der TestAPP zu Verfügung steht
  • Das neue Steuerelement in der TestAPP Anwendung verwenden

Jetzt kann man mit der eigentlichen Entwicklung loslegen.

Steuerelement

Zunächst muss man sich den Quellcode der Datei UserControl1.cs anzeigen lassen.
Die erreicht man in dem man die Datei UserControl1.cs im Projektmappen-Explorer markiert und [F7] drückt.
Alternativ kann man auch das Kontextmenü verwenden und den Punkt „Code anzeigen“ auswählen.

Direkt unter dem Konstruktor fügt man jetzt folgende Codezeilen ein.

Code
private PointF[] _data = null; // Globale variable die die Kurvenform enthält
// Extern zugängliche Funktion zur übergabe der zu zeichnenden Kurvenform
public void Drawcurve(PointF[] data)
{
// Zwei Punkte werden benötigt zum zeichnen
if (data.Length < 2)
return;  _data = data;
this.Invalidate(); // Graph neu zeichnen
}

// Funktion zum skalieren von werten
private float scale(float x, float x1, float x2, float y1, float y2)
{
if (x1 == x2)
return 0.0f; // We don't devide by 0

float retval = ((y2 - y1) / (x2 - x1)) * (x - x1) + y1;
return retval;
}

Diese Codezeilen zeichnen jedoch noch keine Kurve oder andere Elemente im Steuerelement. Dazu müssen wir die Funktion OnPaint des Steuerelements überschreiben.

Code
protected override void OnPaint(PaintEventArgs e)
{
Pen pGrid = new
Pen(Color.DarkGray);

float x1 = 0.0f,
x2 = this.Width - 1.0f, // Breite des Steuerelements
y1 = 0.0f,
y2 = this.Height - 1.0f; // Höhe des Steuerelements

float vdiv = 10.0f, hdiv = 10.0f; // Anzahl an Horizontlen/Vertikalen linien

// Vertikale linien
for (float y = x1; y < x2; y+=((x2 - x1 - 0.001f) / vdiv))
{
e.Graphics.DrawLine(pGrid, y, y1, y, y2);
}

// Horizontale linien
for (float x = y1; x <= y2; x+=((y2 - y1 - 0.001f) / hdiv))
{
e.Graphics.DrawLine(pGrid, x1, x, x2, x);
}

if (_data != null && _data.Length >= 2)
{
// Enthaltene Daten zeichnen
for (int i = 0; i < _data.Length; i++)
{
// Zu zeichnende Daten auf die Zeichenfläche skalieren
// Hier mit fester Skala

_data[i].X = scale(_data[i].X, 0.0f, 0.02f, 0, this.Width);
_data[i].Y = scale(_data[i].Y, -325.0f, 325.0f, this.Height, 0);
}

e.Graphics.DrawCurve(Pens.DarkCyan, _data);
}

base.OnPaint(e);
}

Testdaten berechnen

Zum berechnen des Augenblickswertes einer Sinusförmigen Spannung benötigt man folgende Formel.

Da jedoch ein einzelner Wert relativ sinnfrei ist für eine Darstellung einer ganzen Welle muss man sich die Werte für t=0 bis t=T berechnen und in einem Array abspeichern.

Code
PointF[] Ut = new
PointF[4096]; // Augenblickswertarray
float u = 325.0f; // Spitzenwert
float f = 50.0f; // Frequenz der Spannung
float T = 1.0f / f; // Periodendauer
float phi = 0.0f; // Phasenwinkel
float omega = Convert.ToSingle(2.0f * Math.PI * f);
float stepsize = T / Ut.Length;
int idx = 0; // Arrayindex

// Testdaten berechnen
for (float t = 0; t < T; t+=stepsize)
{
idx = Convert.ToInt32(t / stepsize);
if (idx < Ut.Length)
{
Ut[idx].X = t;
Ut[idx].Y = Convert.ToSingle(u * Math.Sin(omega * t + phi));
}
}

Steuerelement testen

Wenn man mit der obigen Funktion seine Testkurve berechnet hat muss man diese nur noch an das neue Steuerelement übergeben und Sie darstellen lassen. Die folgende Codezeile muss man nur noch unter die obige For-Schleife schreiben und seine Anwendung starten.

Code
oszilloskop1.Drawcurve(Ut);

Going OLD-School with Assembler


Ok, Seit ein paar Tagen bin ich stolzer Besitzer eines Dev-Kits für einen C8051F930 von Silicon Labs.
Da ich mir das Teil für die Technikerschule angeschafft habe musste ich gleich mal ein wenig damit Spielen. In der Technikerschule arbeiten wir zwar mit einem Anderen Prozessortyp (Infineon SAB80C517) aber der Kern ist derselbe ein 8051.
Somit kann man das Board zum üben verwenden, man muss allerdings aufpassen das man mit den Registernamen sowie den Eigenheiten nicht durcheinander kommt.
Beim 80C517 gibt es bspw. einen Watchdog den man in Assembler mittels

SETB WDT
SETB SWDT

bedienen muss. Beim C8051F930 geschieht dies anders.
Des Weiteren wurde bei dem Dev-Kit eine „Vollversion“ von Keil µVision V4 mitgeliefert.
Die Vollversion bezieht sich allerdings nur auf die µCs von Silicon Labs, was durchaus verständlich ist.
Zum Spielen hab ich mir mal 2 Programme geschrieben und deren Footprint im Flash des µCs gegenübergestellt.
Die Programme schalten jeweils nur die LED die am Portpin 1.6 angeschlossen ist ein und gehen dann in eine Dauerschleife.
Zuerst die Assemblerversion:

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Name Test
; Description: Turn on the LED connected to PortPIN 1.6
; Author: Manuel Koenig
; Date: 03.03.2014

$include(C8051F930.INC)

CSEG AT 0000h

MOV P1MDIN,#60h ;// P1.5, P1.6 are digital
MOV P1MDOUT,#60h ;// P1.5, P1.6 are push-pull
MOV XBR2,#40h ;// Enable crossbar and
;// enable weak pull-ups

;// High = LED Off, Low = LED On
MOV P1,#0FFh ;// Turn off all LEDs
CLR P1.6 ;// Turn on LED on Portpin 1.6

endlos: JMP endlos
END

Assembler footprint im Flash
1
2
3
4
5
6
C:0x0000 75F260 MOV P1MDIN(0xF2),#0x60
C:0x0003 75A560 MOV P1MDOUT(0xA5),#0x60
C:0x0006 75E340 MOV XBR2(0xE3),#0x40
C:0x0009 7590FF MOV P1(0x90),#VDM0CN(0xFF)
C:0x000C C296 CLR 0x90.6
C:0x000E 80FE SJMP C:000E

Hier das C Programm:

C-Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <compiler_defs.h> // compiler declarations
#include <C8051F930_defs.h> // SFR declarations

SBIT (YELLOW_LED, SFR_P1, 6); // ‚0‘ means ON, ‚1‘ means OFF
#define LED_ON 0

void main (void)
{
P0MDIN |= 0x0C; // P0.2, P0.3 are digital
P1MDIN |= 0x60; // P1.5, P1.6 are digital

P0MDOUT &= ~0x0C; // P0.2, P0.3 are open-drain
P1MDOUT |= 0x60; // P1.5, P1.6 are push-pull

XBR2 = 0x40; // Enable crossbar and enable
// weak pull-ups
YELLOW_LED = LED_ON; // Turn on the LED on Portpin 1.6

while (1) {} // Spin forever
}

Assembler footprint im Flash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
C:0x0000 020016 LJMP C:0016
C:0x0003 43F10C ORL P0MDIN(0xF1),#0x0C
C:0x0006 43F260 ORL P1MDIN(0xF2),#0x60
C:0x0009 53A4F3 ANL P0MDOUT(0xA4),#0xF3
C:0x000C 43A560 ORL P1MDOUT(0xA5),#0x60
C:0x000F 75E340 MOV XBR2(0xE3),#0x40
C:0x0012 C296 CLR YELLOW_LED(0x90.6)
C:0x0014 80FE SJMP C:0014
C:0x0016 787F MOV R0,#0x7F
C:0x0018 E4 CLR A
C:0x0019 F6 MOV @R0,A
C:0x001A D8FD DJNZ R0,C:0019
C:0x001C 758107 MOV 0x81,#0x07
C:0x001F 020003 LJMP C:0003
.
.
.

Wie man sieht hat man bei C einen deutlichen Overhead, daher sollte man bei begrenztem Speicher, hier max. 64kB (-Variablen, -Stack,-etc.) auf Assembler zurückgreifen.
Wer möchte kann die beiden Programme gerne runterladen und selbst ausprobieren sofern Ihr das Dev-Kit habt.

Test_ASM.zip Test_C.zip

AVR DEMO Board V1

Board
Durch einen meiner Kollegen bin ich inspiriert worden mich ein wenig mit µC-Technik zu beschäftigen.
Daraufhin hab ich mir erst mal bei Pollin das AVR NET IO Board gekauft um eine kleine Spielwiese zu haben.
Das Board von Pollin ist zwar schön und gut für den Anfang, hat jedoch ein paar Nachteile.
Es benötigt ein Netzteil das mind. 9VAC liefert und es hat neben dem µC keinen Speicher bzw. keinen Möglichkeit Daten auf eine SD-Karte zu speichern (ohne Zusatzboard).
Das hat mich dann schon ein wenig genervt. Als Elektroniker sollte ich es doch hinbekommen so eine kleine Platine selbst zu entwerfen und zu entflechten.
Gesagt getan. Nach etwas Recherche im Netz und den Festlegen der Funktionen die auf der ersten Version realisiert werden sollen ruhte das kleine Projekt jedoch erst mal eine Weile.
Die Abendschule lässt einen eben keine Zeit wenn man gute Noten schreiben will und Seinen Staatlich geprüften Techniker machen möchte.
Jetzt aber genug von dem Gejammer :D.
In den „Herbstferien“ 2013 hab ich mich dann doch mal hingehockt und die Platine entworfen, herstellen lassen und mit SMD teilen bestückt.
Die Bestückung ist zwar nicht schön aber selten :). Für die ersten Gehversuche in SMD-Technik und Handlöten finde ich es zumindest brauchbar.

Features der V1:

  • Spannungsversorgung über Mini USB-B Port 5V
  • SD-Card Slot
  • RJ45 Anschluss
  • USB RS232
  • 1K EEPROM für FTDI Chip (Eigene ID + Beschreibung)
  • 512K SPI-EEPROM (Für Daten oder Sonstiges)
  • ISP 10Pol Anschluss

Bitte weist mich nicht darauf hin dass ich mir auch einen Arduino hätte kaufen können.
Hier ging es einfach nur um den Spaß bei der Sache und um das Wissen welches man sich dadurch aneignet.

Pics:
Front Back

Da bei der V1 noch ein paar sachen gefehlt haben bzw. mir noch nicht ganz so zusagen.
Bspw. der verwendete RJ45 PulseJack J1006F01P (Lieferzeit 8Wochen+)

Hab ich mich dann an die V2 gemacht.

Board V2

Features der V2:

  • Alle der V1
  • I/O Ports auf Pfostenleiste
  • AVR RS232 auf Pfostenleiste
  • AVR XTAL1 auf Pfostenleiste (FAILOVER für Falsche Fuse Bits: Externer Takt)
  • Micro SD
  • Besser verfügbarer RJ45 anschlusA
  • Neue Level-Shifter 5V 3.3V
  • Test LED wie beim Arduino

Mittlerweile ist diese auch schon entflechtet und muss nur noch hegestellt werden.
Da die Ferien jedoch vorbei sind, konzentrier ich mich jetzt erst mal wieder auf die Schule.

Downloads:
EAGLE V6.5 Projekt + Docs: ATMEGA DEMO V1

Aktivierungszeitraum von Windows erweitern (Rearm Windows)

Vor kurzem stand ich vor dem Problem das Windows Aktiviert werden musste, ich aber noch etwas Testen musste zum Abschluss.
Daher hab ich mich im Internet auf die Suche nach einer Lösung gemacht und diese auch gefunden.

Für Windows XP sowie 2003 Server:

  • Starten im Abgesicherten Modus mit Eingabeaufforderung
  • In der Konsole folgendes ausführen:
    rundll32.exe syssetup,SetupOobeBnk
  • Zum Schluss noch mit dem Eventviewer kontrollieren ob die Reaktivierung erfolgreich war.
  • Neustarten und fertig.

Windows 7/8/2008 R2/2012:

  • Eingabeaufforderung als Administrator starten und folgendes ausführen:
  • slmgr.vbs /rearm

  • Neustarten

Auf folgenden Seiten findet man noch weitere Infos darüber:
Windows Server 2008 R2 Aktivierungszeitraum erweitern
How to rearm and change activation key on Windows