| Weitere Artikel aus dem Elo-Magazin |
Ping- Pong Wettbewerb
LEDHype: Laufschrift + Anbindung per RS232 an PC-Software LCDHype
Mit der PC-Freeware LCDHype können durch eine Skriptsprache beliebige Texte und Systeminformationen auf einem am PC angeschlossenen LCD dargestellt werden, z.B. Systemauslastung, CPU-Temperatur, aber auch Informationen der MP3-Player-Software WinAmp wie Titel, Interpret, Spektrumanalyzer usw. Durch einen selbstgeschriebenen Treiber kann jetzt auch die LED-Anzeige des Ping-Pong-Spiels per LCDHype gesteuert werden.
von Michael Gaus
Mit der PC-Freeware LCDHype können durch eine Skriptsprache beliebige Texte und Systeminformationen auf einem am PC angeschlossenen LCD dargestellt werden, z.B. Systemauslastung, CPU-Temperatur, aber auch Informationen der MP3-Player-Software WinAmp wie Titel, Interpret, Spektrumanalyzer usw.
Durch das Erstellen von passenden Treibern können beliebige LCDs angesteuert werden. Durch einen selbstgeschriebenen Treiber kann jetzt auch die LED-Anzeige des Ping-Pong-Spiels per LCDHype gesteuert werden. Oder in diesem Fall wohl passender: LEDHype :-)
Ganzen Artikel lesen...

Pin RxD (Port D.0) des Atmega8 auf der Ping Pong Platine muss über einen geeigneten Pegelwandler mit einer RS232-Schnittstelle des PCs verbunden werden. Es kann entweder eine Standardschaltung mit einem MAX232 verwendet werden oder am besten ein über USB angeschlossener virtueller COM-Port. Man kann beispielsweise ein geeignetes Handydatenkabel verwenden, z.B. das Modell "KQ-U8A" für das Handy "Siemens C55". Vorteil: meistens ist gleichzeitig noch die 5-V-Spannungsversorgung des USB-Ports mit herausgeführt, über die man dann die Ping Pong Platine direkt versorgen kann.
Als erster Test kann auf dem PC ein Terminalprogramm gestartet werden, wobei die RS232-Schnittstelle wie folgt parametriert wird: 9600 Baud, kein Paritätsbit, 1 Stopbit. Nach dem Einschalten wird zunächst eine Laufschrift auf der LED-Anzeige ausgegeben.
Dabei wird entweder ein im Flash gespeicherter Text, der in der Firmware als String bei "dispText" angegeben wird, dargestellt oder aber ein im onchip-EEPROM des ATmega8 gespeicherter Text.
Um den Text im EEPROM zu ändern drückt man im Terminalprogramm zuerst die Enter-Taste. Im Display wird "EE" angezeigt, um den EEPROM-Mode zu signalisieren. Nun tippt man den Text ein (entweder "blind" oder man stellt im Terminalprogramm "lokales Echo" ein).
Die Korrektur von Zeichen mit der Backspace-Taste ist nicht möglich.
Am Ende des Textes drückt man wieder Enter. Nun wird der eingegebene Text, der jetzt im EEPROM gespeichert ist, als Laufschrift ausgegeben. Um den Text im EEPROM zu löschen und wieder den Lauftext aus dem Flash anzuzeigen drückt man einfach zweimal Enter. Nach diesem Test wird das Terminalprogramm wieder beendet.
Sobald auf der seriellen Schnittstelle Daten von LCDHype kommen wird die Laufschrift gestoppt und stattdessen erfolgt die Anzeigesteuerung per RS232-Schnittstelle (9600 Baud, kein Paritätsbit, 1 Stopbit). Unterstützt werden VT100 Cursorbefehle, ASCII-Textausgabe, sowie Grafikausgabe.
Cursorbefehle:
<Esc> [ H
(entspricht als Hexwerte: 1B 5B 48)
setzt den Cursor an den Zeilenanfang
Grafikausgabe:
Strg-Z <Low1> <High1> ... <Low12> <High12>
(entspricht als Hexwerte: 1B gefolgt von genau 24 Hexwerten für die 12 Spalten)
<LowX> ist das Lowbyte (oberste 8 LEDs) der Spalte X
<HighX> ist das Highbyte (unterste 2 LEDs) der Spalte X
RS232-Steuerung beenden und zurück zur Laufschrift:
<ESC> <ESC>
(entspricht als Hexwerte: 1B 1B)
LCDhype installieren und konfigurieren
(getestet mit LCDHype Version 0.7.2.1)
a) LCDHype installieren
Unter www.lcdhype.de.vu kann die Software bei "LCDHype Releases" heruntergeladen und dann installiert werden nach
"C:\Programme\LCDHype"
b) ZIP-Datei ledhype.zip downloaden entpacken
Einfach in ein beliebiges Verzeichnis auf der Festplatte entpacken.
Im Unterverzeichnis lcdhype sind alle Dateien enthalten, auf die in den nächsten Punkten Bezug genommen wird.
c) Treiber für Ping-Pong LED-Matrix installieren
Komplettes Verzeichnis "pingpong" (inkl. Verzeichnisname) kopieren nach
"C:\Programme\LCDHype\controller"
d) Plugin für WinAmp installieren
Plugin für WinAmp (V2.xx) installieren (getestet mit WinAmp 2.91)
Alle Dateien aus dem Verzeichnis "C:\Programme\LCDHype\stuff\winamp" kopieren nach
"C:\Programme\Winamp\Plugins"
e) WinAmp konfigurieren
WinAmp starten und bei "Visualisierung" => "Plug-in auswählen" folgendes einstellen:
Winamp Data Collector
f) LCDHype starten
In LCDHype unter Einstellungen => LCD-Einstellungen auswählen:
Ping-Pong LED Matrix
Dort dann auf "Einstellungen" klicken und den verwendeten (virtuellen) COM-Port einstellen. Die übrigen EInstellungen unverändert beibehalten.
g) Beispielskript:
Beispielskripts für Ping Pong:
Datei "pingpong.sd" kopieren nach
"C:\Programme\LCDHype\scripts"
In LCDHype unter "LCD-Anzeige" dieses Skript laden und dann das gewünschte Teilskript wählen.
Enthalten sind:
- Spektrumanalyzer aus WinAmp (WinAmp muss laufen und eine MP3-Datei abspielen)
- Ausgabe von Interpret und Titel (WinAmp muss laufen und eine MP3-Datei mit entsprechender Titel/Interpret Info abspielen)
- Smiley (Ausgabe einer Bitmap-Grafik)
- Songtext (Ausgabe eines in einer LRC-Datei gespeicherten Songtextes. Die LRC-Datei kann bei "Header" angegeben werden.)
- Newsticker
Mit dem Go-Button wird das ausgewählte Skript gestartet und es sollte nun eine Ausgabe auf der LED-Anzeige erfolgen.
Download: Scriptdateien
Der Code für den ATmega8 auf der Ping Pong Platine wurde mit dem C-Compiler CodeVision AVR (Version 2.04.6 Evaluation) erstellt. Diese Evaluation-Version kann für den privaten nicht-kommerziellen Gebrauch kostenlos verwendet werden und ist auf eine Codegröße von 3 kB beschränkt, was für diese Anwendung ausreicht. Das komplette Projekt ist in der ZIP-Datei enthalten (Projektdatei für CodeVison AVR ist ledhype.prj).
Download: Quelltext und Hex-File
Quellen/Links:
C-Compiler CodeVision AVR: http://www.hpinfotech.ro/html/download.htm
Freeware LCDHype: http://lcdhype.condense.de (Download unter "LCDHype Releases")
WinAmp: http://www.mpex.net/software/details/winamp.html
Songtexte im LRC-Format: http://de.wikipedia.org/wiki/LRC_(Dateiformat)
/*****************************************************
This program was produced by the
CodeWizardAVR V2.03.8a Standard
Automatic Program Generator
© Copyright 1998-2008 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com
Chip type : ATmega8
Program type : Application
Clock frequency : 8,000000 MHz
Memory model : Small
External RAM size : 0
Data Stack size : 256
*****************************************************/
#include <mega8.h>
#include <stdio.h>
#include <delay.h>
#include "font.h"
#define P_CLK PORTB.3
#define P_DATA PORTB.4
#define P_STROBE PORTB.2
#define GRAPHIC_CHAR 0x1A
#define ESC_CHAR 0x1B
#define EEPROM_CHAR 0x0D
flash unsigned char dispText[] = "Ping-Pong LED-Matrix ";
#define EE_TEXT_SIZE 512
eeprom unsigned char eeText[EE_TEXT_SIZE];
unsigned char ramBuf[EE_TEXT_SIZE];
unsigned int leds[12];
#define MAX_TEXT 2
unsigned char textbuf[MAX_TEXT];
#define MAX_MEM (12)
unsigned int displayBuffer[MAX_MEM];
bit bUartMode = 0;
unsigned char counter = 0;
unsigned char graphicMode = 0;
bit bCursor = 0;
bit bCopyRamToEeprom = 0;
bit bClearDisplay = 0;
unsigned int iEepromCounter = 0;
void updateDisplay(void)
{
unsigned char i;
for(i = 0; i < MAX_MEM; i++)
{
leds[i] = displayBuffer[i];
}
}
void showText(char *c)
{
unsigned char i, j, k;
flash unsigned char *pFont;
k = 0;
for(i = 0; i < MAX_TEXT; i++)
{
if(c[i] >= 0x80)
{
if(c[i] == 'ä')
c[i] = 128;
else if(c[i] == 'ö')
c[i] = 129;
else if(c[i] == 'ü')
c[i] = 130;
else if(c[i] == 'Ä')
c[i] = 131;
else if(c[i] == 'Ö')
c[i] = 132;
else if(c[i] == 'Ü')
c[i] = 133;
else if(c[i] == 'ß')
c[i] = 134;
else if(c[i] == '°')
c[i] = 135;
}
pFont = &font[(unsigned int)c[i] * 6];
for(j = 0; j < 6; j++)
{
displayBuffer[k++] = ((unsigned int)(*pFont++) << 1);
}
}
updateDisplay();
}
void convertText(char *c)
{
unsigned char i, j, k;
flash unsigned char *pFont;
k = 0;
for(i = 0; i < MAX_TEXT; i++)
{
if(c[i] >= 0x80)
{
if(c[i] == 'ä')
c[i] = 128;
else if(c[i] == 'ö')
c[i] = 129;
else if(c[i] == 'ü')
c[i] = 130;
else if(c[i] == 'Ä')
c[i] = 131;
else if(c[i] == 'Ö')
c[i] = 132;
else if(c[i] == 'Ü')
c[i] = 133;
else if(c[i] == 'ß')
c[i] = 134;
else if(c[i] == '°')
c[i] = 135;
}
pFont = &font[(unsigned int)c[i] * 6];
for(j = 0; j < 6; j++)
{
displayBuffer[k++] = ((unsigned int)(*pFont++) << 1);
}
}
}
// USART Receiver interrupt service routine
interrupt [USART_RXC] void usart_rx_isr(void)
{
unsigned char ch;
static unsigned char *pDisplayBuffer;
static bit bEepromMode = 0;
ch = UDR;
bUartMode = 1;
if(graphicMode)
{
*pDisplayBuffer++ = ch;
graphicMode++;
if(graphicMode > (MAX_MEM*2))
graphicMode = 0;
}
else if(ch == 0x0A)
{ // ignore linefeed
return;
}
else if(bEepromMode)
{
if(ch == EEPROM_CHAR)
{
bEepromMode = 0;
if(iEepromCounter < EE_TEXT_SIZE)
{
ramBuf[iEepromCounter] = ch;
iEepromCounter++;
}
textbuf[0] = ' ';
textbuf[1] = ' ';
convertText(textbuf);
bCopyRamToEeprom = 1;
}
else
{
if(iEepromCounter < EE_TEXT_SIZE)
{
ramBuf[iEepromCounter] = ch;
iEepromCounter++;
}
}
}
else
{
if(ch == GRAPHIC_CHAR)
{
graphicMode++;
pDisplayBuffer = (unsigned char *)displayBuffer;
}
else if(ch == ESC_CHAR)
{
if(bCursor == 1)
{
// back to moving font
bCursor = 0;
bClearDisplay = 1;
bUartMode = 0;
}
else
{
bCursor = 1;
}
counter = 0;
}
else if(bCursor)
{
if(ch == 'H')
bCursor = 0;
}
else if(ch == EEPROM_CHAR)
{
bEepromMode = 1;
iEepromCounter = 0;
textbuf[0] = 'E';
textbuf[1] = 'E';
convertText(textbuf);
}
else
{
if(counter < MAX_TEXT)
{
textbuf[counter] = ch;
convertText(textbuf);
counter++;
}
}
}
}
// Timer 2 overflow interrupt service routine
interrupt [TIM2_OVF] void timer2_ovf_isr(void)
{
static unsigned char count = 0;
unsigned int iValue;
count++;
if(count >= 12)
{
count = 0;
P_DATA = 0;
}
else
{
P_DATA = 1;
}
P_CLK = 1;
P_CLK = 0;
PORTC &= (~0x0F);
PORTD &= (~0xF0);
PORTB &= (~0x03);
P_STROBE = 1;
P_STROBE = 0;
iValue = leds[count];
PORTC |= (iValue & 0x0F);
PORTD |= (iValue & 0xF0);
PORTB |= ((iValue >> 8) & 0x03);
}
void initTimer2(void)
{
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: 1000,000 kHz
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x02;
TCNT2=0x00;
OCR2=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x40;
}
void initUart(void)
{
// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud Rate: 9600
UCSRA=0x00;
UCSRB=0x98;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x33;
}
void init(void)
{
PORTB = 0;
DDRB = 0x1F;
PORTC = 0;
DDRC = 0x0F;
PORTD = 0;
DDRD = 0xF0;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
}
void main(void)
{
#define DELAY_TIME 10000
unsigned char i=0, j, k,cnt=0, ch;
unsigned int iCount;
unsigned long d;
init();
initTimer2();
initUart();
for(i = 0; i < MAX_TEXT; i++)
{
textbuf[i] = ' ';
}
for(i = 0; i < MAX_MEM; i++)
{
displayBuffer[i] = 0;
}
updateDisplay();
//showText("Dies ist ein Test");
// Global enable interrupts
#asm("sei")
while(1)
{
if(bClearDisplay)
{
bClearDisplay = 0;
for(i = 0; i < MAX_MEM; i++)
{
displayBuffer[i] = 0;
}
updateDisplay();
}
if(bUartMode == 0)
{
i = eeText[0];
if( (i != EEPROM_CHAR) && (i != 0xFF) && (i != 0x00) )
{ // display text stored in EEPROM
cnt = 0;
i = 0;
while( (eeText[i] != EEPROM_CHAR) && (i < (unsigned int)EE_TEXT_SIZE) )
{
for(j = 0; j < 6; j++)
{
if(bUartMode)
{
break;
}
for(k = 0; k < (MAX_MEM-1); k++)
{
displayBuffer[k] = displayBuffer[k+1];
}
ch = eeText[i];
if(ch >= 0x80)
{
if(ch == 'ä')
ch = 128;
else if(ch == 'ö')
ch = 129;
else if(ch == 'ü')
ch = 130;
else if(ch == 'Ä')
ch = 131;
else if(ch == 'Ö')
ch = 132;
else if(ch == 'Ü')
ch = 133;
else if(ch == 'ß')
ch = 134;
else if(ch == '°')
ch = 135;
}
displayBuffer[k] = (unsigned int)(font[(unsigned int)ch * 6 + cnt]) << 1;
updateDisplay();
cnt++;
if(cnt==6)
{
cnt=0;
}
if(bUartMode)
{
break;
}
for(d = 0; d < DELAY_TIME; d++);
}
i++;
if(bUartMode)
{
break;
}
}
}
else
{ // display text stored in FLASH
cnt = 0;
for(i = 0; i < (sizeof(dispText) - 1); i++)
{
for(j = 0; j < 6; j++)
{
if(bUartMode)
{
break;
}
for(k = 0; k < (MAX_MEM-1); k++)
{
displayBuffer[k] = displayBuffer[k+1];
}
ch = dispText[i];
if(ch >= 0x80)
{
if(ch == 'ä')
ch = 128;
else if(ch == 'ö')
ch = 129;
else if(ch == 'ü')
ch = 130;
else if(ch == 'Ä')
ch = 131;
else if(ch == 'Ö')
ch = 132;
else if(ch == 'Ü')
ch = 133;
else if(ch == 'ß')
ch = 134;
else if(ch == '°')
ch = 135;
}
displayBuffer[k] = (unsigned int)(font[(unsigned int)ch * 6 + cnt]) << 1;
updateDisplay();
cnt++;
if(cnt==6)
{
cnt=0;
}
if(bUartMode)
{
break;
}
for(d = 0; d < DELAY_TIME; d++);
}
if(bUartMode)
{
break;
}
}
}
}
else
{
updateDisplay();
if(bCopyRamToEeprom)
{
bCopyRamToEeprom = 0;
for(iCount = 0; iCount < iEepromCounter; iCount++)
{
eeText[iCount] = ramBuf[iCount];
}
bUartMode = 0;
bClearDisplay = 1;
}
}
}
}
![]() | Franzis Ping-Pong Produktart: Softwarebox 29,95 € |












