PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Gibt es noch Optimierungspotential? (Mega8 an 320x240 GLCD Textmodus)



MisterMou
21.04.2012, 14:28
Hallo,
ich bastel zur Zeit an der Ansteuerung eines Grafikdisplays.
Um genau zu sein, ist das meine Vorlage:
http://www.mikrocontroller.net/topic/92704#795168

Datenblatt:
http://www.mikrocontroller.net/attachment/37850/NANYA_LT_E9_372.pdf

Ich nutze das selbe Display und verfolge das selbe Ziel.
Mit einem Mega8 @16MHz dieses Display möglichst schnell ansteuern.

Genutzt wird eine 8x12 Schrift, das macht dann 40x20 Zeichen.

Das "Problem" ist die Geschwindigkeit, ich komm zur Zeit auf 63,5 Hz.
Das ist eigentlich eine ganze Menge, aber mir noch zu wenig, der AVR soll nämlich auch noch andere Sachen machen können, als Pixel aufs Display werfen :)

Ich nutze das AVR-Studio 5.1 und der Code wird mit der "-O1" Option optimiert, sonst wären es 13,5Hz :D

Die Funktionsweise ist recht einfach.
-ein 20x40 Array speichert die Zeichen für das Display
-das Display wird Zeile für Zeile gefüllt
-erst die ersten 4 Pixel des Buchstabens, dann die letzten 4 usw.


Jetzt meine eigentliche Frage, hat jemand eine Idee für die Optimierung?

Zum Schluss noch der Code:


/*
*B0-CP
*B1-LOAD
*B2-FRAME
*
*C0-D0
*C1-D1
*C2-D2
*C3-D3
*
*Mega8 @ 16MHz
*/

#define CP 0
#define LOAD 1
#define FRAME 2

#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>

//8x12 Schrift
//http://www.mikrocontroller.net/topic/54860
//Danke Benedikt!

const unsigned char schrift[256][12] PROGMEM ={
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00}, // 0x00
{0x00,0x7E,0xC3,0x81,0xA5,0x81,0xBD,0x99,0xC3,0x7E ,0x00,0x00}, // 0x01
{0x00,0x7E,0xFF,0xFF,0xDB,0xFF,0xC3,0xE7,0xFF,0x7E ,0x00,0x00}, // 0x02
{0x00,0x00,0x44,0xEE,0xFE,0xFE,0xFE,0x7C,0x38,0x10 ,0x00,0x00}, // 0x03
{0x00,0x10,0x38,0x7C,0xFE,0xFE,0x7C,0x38,0x10,0x00 ,0x00,0x00}, // 0x04
{0x00,0x18,0x3C,0x3C,0xFF,0xE7,0xE7,0x18,0x18,0x7E ,0x00,0x00}, // 0x05
{0x00,0x18,0x3C,0x7E,0xFF,0xFF,0x7E,0x18,0x18,0x7E ,0x00,0x00}, // 0x06
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00}, // 0x07
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00}, // 0x08
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00}, // 0x09
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00}, // 0x0A
{0x00,0x3E,0x0E,0x3A,0x72,0xF8,0xCC,0xCC,0xCC,0x78 ,0x00,0x00}, // 0x0B
{0x00,0x3C,0x66,0x66,0x66,0x3C,0x18,0x7E,0x18,0x18 ,0x00,0x00}, // 0x0C
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00}, // 0x0D
{0x00,0x7F,0x63,0x7F,0x63,0x63,0x63,0x67,0xE7,0xE6 ,0xC0,0x00}, // 0x0E
{0x00,0x00,0x18,0xDB,0x7E,0xE7,0xE7,0x7E,0xDB,0x18 ,0x00,0x00}, // 0x0F
{0x00,0x80,0xC0,0xE0,0xF8,0xFE,0xF8,0xE0,0xC0,0x80 ,0x00,0x00}, // 0x10
{0x00,0x02,0x06,0x0E,0x3E,0xFE,0x3E,0x0E,0x06,0x02 ,0x00,0x00}, // 0x11
{0x00,0x18,0x3C,0x7E,0x18,0x18,0x18,0x7E,0x3C,0x18 ,0x00,0x00}, // 0x12
{0x00,0x66,0x66,0x66,0x66,0x66,0x00,0x00,0x66,0x66 ,0x00,0x00}, // 0x13
{0x00,0x7F,0xDB,0xDB,0xDB,0x7B,0x1B,0x1B,0x1B,0x1B ,0x00,0x00}, // 0x14
{0x00,0x7E,0x63,0x30,0x3C,0x66,0x66,0x3C,0x0C,0xC6 ,0x7E,0x00}, // 0x15
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0xFE,0xFE ,0x00,0x00}, // 0x16
{0x00,0x18,0x3C,0x7E,0x18,0x18,0x18,0x7E,0x3C,0x18 ,0x7E,0x00}, // 0x17
{0x00,0x18,0x3C,0x7E,0x18,0x18,0x18,0x18,0x18,0x18 ,0x00,0x00}, // 0x18
{0x00,0x18,0x18,0x18,0x18,0x18,0x18,0x7E,0x3C,0x18 ,0x00,0x00}, // 0x19
{0x00,0x00,0x00,0x18,0x0C,0xFE,0x0C,0x18,0x00,0x00 ,0x00,0x00}, // 0x1A
{0x00,0x00,0x00,0x30,0x60,0xFE,0x60,0x30,0x00,0x00 ,0x00,0x00}, // 0x1B
{0x00,0x00,0x00,0x00,0xC0,0xC0,0xC0,0xFE,0x00,0x00 ,0x00,0x00}, // 0x1C
{0x00,0x00,0x00,0x24,0x66,0xFF,0x66,0x24,0x00,0x00 ,0x00,0x00}, // 0x1D
{0x00,0x00,0x10,0x10,0x38,0x38,0x7C,0x7C,0xFE,0xFE ,0x00,0x00}, // 0x1E
{0x00,0x00,0xFE,0xFE,0x7C,0x7C,0x38,0x38,0x10,0x10 ,0x00,0x00}, // 0x1F
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00}, // 0x20
{0x00,0x30,0x78,0x78,0x78,0x30,0x30,0x00,0x30,0x30 ,0x00,0x00}, // 0x21
{0x00,0x66,0x66,0x66,0x24,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00}, // 0x22
{0x00,0x6C,0x6C,0xFE,0x6C,0x6C,0x6C,0xFE,0x6C,0x6C ,0x00,0x00}, // 0x23
{0x30,0x30,0x7C,0xC0,0xC0,0x78,0x0C,0x0C,0xF8,0x30 ,0x30,0x00}, // 0x24
{0x00,0x00,0x00,0xC4,0xCC,0x18,0x30,0x60,0xCC,0x8C ,0x00,0x00}, // 0x25
{0x00,0x70,0xD8,0xD8,0x70,0xFA,0xDE,0xCC,0xDC,0x76 ,0x00,0x00}, // 0x26
{0x00,0x30,0x30,0x30,0x60,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00}, // 0x27
{0x00,0x0C,0x18,0x30,0x60,0x60,0x60,0x30,0x18,0x0C ,0x00,0x00}, // 0x28
{0x00,0x60,0x30,0x18,0x0C,0x0C,0x0C,0x18,0x30,0x60 ,0x00,0x00}, // 0x29
{0x00,0x00,0x00,0x66,0x3C,0xFF,0x3C,0x66,0x00,0x00 ,0x00,0x00}, // 0x2A
{0x00,0x00,0x00,0x18,0x18,0x7E,0x18,0x18,0x00,0x00 ,0x00,0x00}, // 0x2B
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x38 ,0x60,0x00}, // 0x2C
{0x00,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00 ,0x00,0x00}, // 0x2D
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x38 ,0x00,0x00}, // 0x2E
{0x00,0x00,0x02,0x06,0x0C,0x18,0x30,0x60,0xC0,0x80 ,0x00,0x00}, // 0x2F
{0x00,0x7C,0xC6,0xCE,0xDE,0xD6,0xF6,0xE6,0xC6,0x7C ,0x00,0x00}, // 0x30
{0x00,0x10,0x30,0xF0,0x30,0x30,0x30,0x30,0x30,0xFC ,0x00,0x00}, // 0x31
{0x00,0x78,0xCC,0xCC,0x0C,0x18,0x30,0x60,0xCC,0xFC ,0x00,0x00}, // 0x32
{0x00,0x78,0xCC,0x0C,0x0C,0x38,0x0C,0x0C,0xCC,0x78 ,0x00,0x00}, // 0x33
{0x00,0x0C,0x1C,0x3C,0x6C,0xCC,0xFE,0x0C,0x0C,0x1E ,0x00,0x00}, // 0x34
{0x00,0xFC,0xC0,0xC0,0xC0,0xF8,0x0C,0x0C,0xCC,0x78 ,0x00,0x00}, // 0x35
{0x00,0x38,0x60,0xC0,0xC0,0xF8,0xCC,0xCC,0xCC,0x78 ,0x00,0x00}, // 0x36
{0x00,0xFE,0xC6,0xC6,0x06,0x0C,0x18,0x30,0x30,0x30 ,0x00,0x00}, // 0x37
{0x00,0x78,0xCC,0xCC,0xCC,0x78,0xCC,0xCC,0xCC,0x78 ,0x00,0x00}, // 0x38
{0x00,0x78,0xCC,0xCC,0xCC,0x7C,0x18,0x18,0x30,0x70 ,0x00,0x00}, // 0x39
{0x00,0x00,0x00,0x38,0x38,0x00,0x00,0x38,0x38,0x00 ,0x00,0x00}, // 0x3A
{0x00,0x00,0x00,0x38,0x38,0x00,0x00,0x38,0x38,0x18 ,0x30,0x00}, // 0x3B
{0x00,0x0C,0x18,0x30,0x60,0xC0,0x60,0x30,0x18,0x0C ,0x00,0x00}, // 0x3C
{0x00,0x00,0x00,0x00,0x7E,0x00,0x7E,0x00,0x00,0x00 ,0x00,0x00}, // 0x3D
{0x00,0x60,0x30,0x18,0x0C,0x06,0x0C,0x18,0x30,0x60 ,0x00,0x00}, // 0x3E
{0x00,0x78,0xCC,0x0C,0x18,0x30,0x30,0x00,0x30,0x30 ,0x00,0x00}, // 0x3F
{0x00,0x7C,0xC6,0xC6,0xDE,0xDE,0xDE,0xC0,0xC0,0x7C ,0x00,0x00}, // 0x40
{0x00,0x30,0x78,0xCC,0xCC,0xCC,0xFC,0xCC,0xCC,0xCC ,0x00,0x00}, // 0x41
{0x00,0xFC,0x66,0x66,0x66,0x7C,0x66,0x66,0x66,0xFC ,0x00,0x00}, // 0x42
{0x00,0x3C,0x66,0xC6,0xC0,0xC0,0xC0,0xC6,0x66,0x3C ,0x00,0x00}, // 0x43
{0x00,0xF8,0x6C,0x66,0x66,0x66,0x66,0x66,0x6C,0xF8 ,0x00,0x00}, // 0x44
{0x00,0xFE,0x62,0x60,0x64,0x7C,0x64,0x60,0x62,0xFE ,0x00,0x00}, // 0x45
{0x00,0xFE,0x66,0x62,0x64,0x7C,0x64,0x60,0x60,0xF0 ,0x00,0x00}, // 0x46
{0x00,0x3C,0x66,0xC6,0xC0,0xC0,0xCE,0xC6,0x66,0x3E ,0x00,0x00}, // 0x47
{0x00,0xCC,0xCC,0xCC,0xCC,0xFC,0xCC,0xCC,0xCC,0xCC ,0x00,0x00}, // 0x48
{0x00,0x78,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x78 ,0x00,0x00}, // 0x49
{0x00,0x1E,0x0C,0x0C,0x0C,0x0C,0xCC,0xCC,0xCC,0x78 ,0x00,0x00}, // 0x4A
{0x00,0xE6,0x66,0x6C,0x6C,0x78,0x6C,0x6C,0x66,0xE6 ,0x00,0x00}, // 0x4B
{0x00,0xF0,0x60,0x60,0x60,0x60,0x62,0x66,0x66,0xFE ,0x00,0x00}, // 0x4C
{0x00,0xC6,0xEE,0xFE,0xFE,0xD6,0xC6,0xC6,0xC6,0xC6 ,0x00,0x00}, // 0x4D
{0x00,0xC6,0xC6,0xE6,0xF6,0xFE,0xDE,0xCE,0xC6,0xC6 ,0x00,0x00}, // 0x4E
{0x00,0x38,0x6C,0xC6,0xC6,0xC6,0xC6,0xC6,0x6C,0x38 ,0x00,0x00}, // 0x4F
{0x00,0xFC,0x66,0x66,0x66,0x7C,0x60,0x60,0x60,0xF0 ,0x00,0x00}, // 0x50
{0x00,0x38,0x6C,0xC6,0xC6,0xC6,0xCE,0xDE,0x7C,0x0C ,0x1E,0x00}, // 0x51
{0x00,0xFC,0x66,0x66,0x66,0x7C,0x6C,0x66,0x66,0xE6 ,0x00,0x00}, // 0x52
{0x00,0x78,0xCC,0xCC,0xC0,0x70,0x18,0xCC,0xCC,0x78 ,0x00,0x00}, // 0x53
{0x00,0xFC,0xB4,0x30,0x30,0x30,0x30,0x30,0x30,0x78 ,0x00,0x00}, // 0x54
{0x00,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0x78 ,0x00,0x00}, // 0x55
{0x00,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0x78,0x30 ,0x00,0x00}, // 0x56
{0x00,0xC6,0xC6,0xC6,0xC6,0xD6,0xD6,0x6C,0x6C,0x6C ,0x00,0x00}, // 0x57
{0x00,0xCC,0xCC,0xCC,0x78,0x30,0x78,0xCC,0xCC,0xCC ,0x00,0x00}, // 0x58
{0x00,0xCC,0xCC,0xCC,0xCC,0x78,0x30,0x30,0x30,0x78 ,0x00,0x00}, // 0x59
{0x00,0xFE,0xCE,0x98,0x18,0x30,0x60,0x62,0xC6,0xFE ,0x00,0x00}, // 0x5A
{0x00,0x3C,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x3C ,0x00,0x00}, // 0x5B
{0x00,0x00,0x80,0xC0,0x60,0x30,0x18,0x0C,0x06,0x02 ,0x00,0x00}, // 0x5C
{0x00,0x3C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x3C ,0x00,0x00}, // 0x5D
{0x10,0x38,0x6C,0xC6,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00}, // 0x5E
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0xFF,0x00}, // 0x5F
{0x30,0x30,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00}, // 0x60
{0x00,0x00,0x00,0x00,0x78,0x0C,0x7C,0xCC,0xCC,0x76 ,0x00,0x00}, // 0x61
{0x00,0xE0,0x60,0x60,0x7C,0x66,0x66,0x66,0x66,0xDC ,0x00,0x00}, // 0x62
{0x00,0x00,0x00,0x00,0x78,0xCC,0xC0,0xC0,0xCC,0x78 ,0x00,0x00}, // 0x63
{0x00,0x1C,0x0C,0x0C,0x7C,0xCC,0xCC,0xCC,0xCC,0x76 ,0x00,0x00}, // 0x64
{0x00,0x00,0x00,0x00,0x78,0xCC,0xFC,0xC0,0xCC,0x78 ,0x00,0x00}, // 0x65
{0x00,0x38,0x6C,0x60,0x60,0xF8,0x60,0x60,0x60,0xF0 ,0x00,0x00}, // 0x66
{0x00,0x00,0x00,0x00,0x76,0xCC,0xCC,0xCC,0x7C,0x0C ,0xCC,0x78}, // 0x67
{0x00,0xE0,0x60,0x60,0x6C,0x76,0x66,0x66,0x66,0xE6 ,0x00,0x00}, // 0x68
{0x00,0x18,0x18,0x00,0x78,0x18,0x18,0x18,0x18,0x7E ,0x00,0x00}, // 0x69
{0x00,0x0C,0x0C,0x00,0x3C,0x0C,0x0C,0x0C,0x0C,0xCC ,0xCC,0x78}, // 0x6A
{0x00,0xE0,0x60,0x60,0x66,0x6C,0x78,0x6C,0x66,0xE6 ,0x00,0x00}, // 0x6B
{0x00,0x78,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x7E ,0x00,0x00}, // 0x6C
{0x00,0x00,0x00,0x00,0xFC,0xD6,0xD6,0xD6,0xD6,0xC6 ,0x00,0x00}, // 0x6D
{0x00,0x00,0x00,0x00,0xF8,0xCC,0xCC,0xCC,0xCC,0xCC ,0x00,0x00}, // 0x6E
{0x00,0x00,0x00,0x00,0x78,0xCC,0xCC,0xCC,0xCC,0x78 ,0x00,0x00}, // 0x6F
{0x00,0x00,0x00,0x00,0xDC,0x66,0x66,0x66,0x66,0x7C ,0x60,0xF0}, // 0x70
{0x00,0x00,0x00,0x00,0x76,0xCC,0xCC,0xCC,0xCC,0x7C ,0x0C,0x1E}, // 0x71
{0x00,0x00,0x00,0x00,0xEC,0x6E,0x76,0x60,0x60,0xF0 ,0x00,0x00}, // 0x72
{0x00,0x00,0x00,0x00,0x78,0xCC,0x60,0x18,0xCC,0x78 ,0x00,0x00}, // 0x73
{0x00,0x00,0x20,0x60,0xFC,0x60,0x60,0x60,0x6C,0x38 ,0x00,0x00}, // 0x74
{0x00,0x00,0x00,0x00,0xCC,0xCC,0xCC,0xCC,0xCC,0x76 ,0x00,0x00}, // 0x75
{0x00,0x00,0x00,0x00,0xCC,0xCC,0xCC,0xCC,0x78,0x30 ,0x00,0x00}, // 0x76
{0x00,0x00,0x00,0x00,0xC6,0xC6,0xD6,0xD6,0x6C,0x6C ,0x00,0x00}, // 0x77
{0x00,0x00,0x00,0x00,0xC6,0x6C,0x38,0x38,0x6C,0xC6 ,0x00,0x00}, // 0x78
{0x00,0x00,0x00,0x00,0x66,0x66,0x66,0x66,0x3C,0x0C ,0x18,0xF0}, // 0x79
{0x00,0x00,0x00,0x00,0xFC,0x8C,0x18,0x60,0xC4,0xFC ,0x00,0x00}, // 0x7A
{0x00,0x1C,0x30,0x30,0x60,0xC0,0x60,0x30,0x30,0x1C ,0x00,0x00}, // 0x7B
{0x00,0x18,0x18,0x18,0x18,0x00,0x18,0x18,0x18,0x18 ,0x00,0x00}, // 0x7C
{0x00,0xE0,0x30,0x30,0x18,0x0C,0x18,0x30,0x30,0xE0 ,0x00,0x00}, // 0x7D
{0x00,0x73,0xDA,0xCE,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00}, // 0x7E
{0x00,0x00,0x00,0x10,0x38,0x6C,0xC6,0xC6,0xFE,0x00 ,0x00,0x00}, // 0x7F
{0x00,0x78,0xCC,0xCC,0xC0,0xC0,0xC0,0xCC,0xCC,0x78 ,0x30,0x60}, // 0x80
{0x00,0xCC,0xCC,0x00,0xCC,0xCC,0xCC,0xCC,0xCC,0x76 ,0x00,0x00}, // 0x81
{0x0C,0x18,0x30,0x00,0x78,0xCC,0xFC,0xC0,0xCC,0x78 ,0x00,0x00}, // 0x82
{0x30,0x78,0xCC,0x00,0x78,0x0C,0x7C,0xCC,0xCC,0x76 ,0x00,0x00}, // 0x83
{0x00,0xCC,0xCC,0x00,0x78,0x0C,0x7C,0xCC,0xCC,0x76 ,0x00,0x00}, // 0x84
{0xC0,0x60,0x30,0x00,0x78,0x0C,0x7C,0xCC,0xCC,0x76 ,0x00,0x00}, // 0x85
{0x38,0x6C,0x6C,0x38,0xF8,0x0C,0x7C,0xCC,0xCC,0x76 ,0x00,0x00}, // 0x86
{0x00,0x00,0x00,0x00,0x78,0xCC,0xC0,0xC0,0xCC,0x78 ,0x30,0x60}, // 0x87
{0x30,0x78,0xCC,0x00,0x78,0xCC,0xFC,0xC0,0xC0,0x7C ,0x00,0x00}, // 0x88
{0x00,0xCC,0xCC,0x00,0x78,0xCC,0xFC,0xC0,0xC0,0x7C ,0x00,0x00}, // 0x89
{0xC0,0x60,0x30,0x00,0x78,0xCC,0xFC,0xC0,0xC0,0x7C ,0x00,0x00}, // 0x8A
{0x00,0x6C,0x6C,0x00,0x78,0x18,0x18,0x18,0x18,0x7E ,0x00,0x00}, // 0x8B
{0x10,0x38,0x6C,0x00,0x78,0x18,0x18,0x18,0x18,0x7E ,0x00,0x00}, // 0x8C
{0x60,0x30,0x18,0x00,0x78,0x18,0x18,0x18,0x18,0x7E ,0x00,0x00}, // 0x8D
{0x00,0xCC,0x00,0x30,0x78,0xCC,0xCC,0xFC,0xCC,0xCC ,0x00,0x00}, // 0x8E
{0x78,0xCC,0xCC,0x78,0x78,0xCC,0xCC,0xFC,0xCC,0xCC ,0x00,0x00}, // 0x8F
{0x0C,0x18,0x00,0xFC,0xC4,0xC0,0xF8,0xC0,0xC4,0xFC ,0x00,0x00}, // 0x90
{0x00,0x00,0x00,0x00,0xFE,0x1B,0x7F,0xD8,0xD8,0xEF ,0x00,0x00}, // 0x91
{0x00,0x3E,0x78,0xD8,0xD8,0xFE,0xD8,0xD8,0xD8,0xDE ,0x00,0x00}, // 0x92
{0x30,0x78,0xCC,0x00,0x78,0xCC,0xCC,0xCC,0xCC,0x78 ,0x00,0x00}, // 0x93
{0x00,0xCC,0xCC,0x00,0x78,0xCC,0xCC,0xCC,0xCC,0x78 ,0x00,0x00}, // 0x94
{0xC0,0x60,0x30,0x00,0x78,0xCC,0xCC,0xCC,0xCC,0x78 ,0x00,0x00}, // 0x95
{0x30,0x78,0xCC,0x00,0xCC,0xCC,0xCC,0xCC,0xCC,0x76 ,0x00,0x00}, // 0x96
{0xC0,0x60,0x30,0x00,0xCC,0xCC,0xCC,0xCC,0xCC,0x76 ,0x00,0x00}, // 0x97
{0x00,0x66,0x66,0x00,0x66,0x66,0x66,0x66,0x3C,0x0C ,0x18,0xF0}, // 0x98
{0x00,0xCC,0x00,0x78,0xCC,0xCC,0xCC,0xCC,0xCC,0x78 ,0x00,0x00}, // 0x99
{0xCC,0x00,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0x78 ,0x00,0x00}, // 0x9A
{0x00,0x00,0x00,0x00,0x78,0xCC,0xDC,0xEC,0xCC,0x78 ,0x00,0x00}, // 0x9B
{0x3C,0x66,0x60,0x60,0x60,0xFC,0x60,0x60,0xC0,0xFE ,0x00,0x00}, // 0x9C
{0x00,0x3A,0x6C,0xCE,0xD6,0xD6,0xD6,0xE6,0x6C,0xB8 ,0x00,0x00}, // 0x9D
{0x00,0x00,0x00,0x00,0x00,0xC6,0x6C,0x38,0x6C,0xC6 ,0x00,0x00}, // 0x9E
{0x0E,0x1B,0x18,0x18,0x7E,0x18,0x18,0x18,0xD8,0x70 ,0x00,0x00}, // 0x9F
{0x0C,0x18,0x30,0x00,0x78,0x0C,0x7C,0xCC,0xCC,0x76 ,0x00,0x00}, // 0xA0
{0x0C,0x18,0x30,0x00,0x78,0x18,0x18,0x18,0x18,0x7E ,0x00,0x00}, // 0xA1
{0x0C,0x18,0x30,0x00,0x78,0xCC,0xCC,0xCC,0xCC,0x78 ,0x00,0x00}, // 0xA2
{0x0C,0x18,0x30,0x00,0xCC,0xCC,0xCC,0xCC,0xCC,0x76 ,0x00,0x00}, // 0xA3
{0x00,0x76,0xDC,0x00,0xF8,0xCC,0xCC,0xCC,0xCC,0xCC ,0x00,0x00}, // 0xA4
{0x76,0xDC,0x00,0xC6,0xE6,0xF6,0xDE,0xCE,0xC6,0xC6 ,0x00,0x00}, // 0xA5
{0x00,0x78,0xCC,0xCC,0x7E,0x00,0xFE,0x00,0x00,0x00 ,0x00,0x00}, // 0xA6
{0x00,0x78,0xCC,0xCC,0x78,0x00,0xFE,0x00,0x00,0x00 ,0x00,0x00}, // 0xA7
{0x00,0x30,0x30,0x00,0x30,0x60,0xC0,0xC0,0xCC,0x78 ,0x00,0x00}, // 0xA8
{0x00,0x38,0x44,0xBA,0xAA,0xBA,0xB2,0xAA,0x44,0x38 ,0x00,0x00}, // 0xA9
{0x00,0x00,0x00,0x00,0x00,0xFC,0x0C,0x0C,0x0C,0x00 ,0x00,0x00}, // 0xAA
{0x00,0x62,0xE6,0x6C,0x78,0x30,0x6E,0xC3,0x86,0x0C ,0x1F,0x00}, // 0xAB
{0x00,0x63,0xE6,0x6C,0x78,0x37,0x6F,0xDB,0xB3,0x3F ,0x03,0x00}, // 0xAC
{0x00,0x30,0x30,0x00,0x30,0x30,0x78,0x78,0x78,0x30 ,0x00,0x00}, // 0xAD
{0x00,0x00,0x00,0x00,0x33,0x66,0xCC,0xCC,0x66,0x33 ,0x00,0x00}, // 0xAE
{0x00,0x00,0x00,0x00,0xCC,0x66,0x33,0x33,0x66,0xCC ,0x00,0x00}, // 0xAF
{0x24,0x92,0x49,0x24,0x92,0x49,0x24,0x92,0x49,0x24 ,0x92,0x49}, // 0xB0
{0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA ,0x55,0xAA}, // 0xB1
{0x6D,0xDB,0xB6,0x6D,0xDB,0xB6,0x6D,0xDB,0xB6,0x6D ,0xDB,0xB6}, // 0xB2
{0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18 ,0x18,0x18}, // 0xB3
{0x18,0x18,0x18,0x18,0x18,0xF8,0x18,0x18,0x18,0x18 ,0x18,0x18}, // 0xB4
{0x0C,0x18,0x00,0x30,0x78,0xCC,0xCC,0xFC,0xCC,0xCC ,0x00,0x00}, // 0xB5
{0x78,0xCC,0x00,0x30,0x78,0xCC,0xCC,0xFC,0xCC,0xCC ,0x00,0x00}, // 0xB6
{0x60,0x30,0x00,0x30,0x78,0xCC,0xCC,0xFC,0xCC,0xCC ,0x00,0x00}, // 0xB7
{0x00,0x38,0x44,0xBA,0xA2,0xA2,0xA2,0xBA,0x44,0x38 ,0x00,0x00}, // 0xB8
{0x66,0x66,0x66,0x66,0xE6,0x06,0x06,0xE6,0x66,0x66 ,0x66,0x66}, // 0xB9
{0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66 ,0x66,0x66}, // 0xBA
{0x00,0x00,0x00,0x00,0xFE,0x06,0x06,0xE6,0x66,0x66 ,0x66,0x66}, // 0xBB
{0x66,0x66,0x66,0x66,0xE6,0x06,0x06,0xFE,0x00,0x00 ,0x00,0x00}, // 0xBC
{0x00,0x30,0x30,0x78,0xCC,0xC0,0xC0,0xCC,0x78,0x30 ,0x30,0x00}, // 0xBD
{0xCC,0xCC,0xCC,0xCC,0x78,0xFC,0x30,0xFC,0x30,0x30 ,0x00,0x00}, // 0xBE
{0x00,0x00,0x00,0x00,0x00,0xF8,0x18,0x18,0x18,0x18 ,0x18,0x18}, // 0xBF
{0x18,0x18,0x18,0x18,0x18,0x1F,0x00,0x00,0x00,0x00 ,0x00,0x00}, // 0xC0
{0x18,0x18,0x18,0x18,0x18,0xFF,0x00,0x00,0x00,0x00 ,0x00,0x00}, // 0xC1
{0x00,0x00,0x00,0x00,0x00,0xFF,0x18,0x18,0x18,0x18 ,0x18,0x18}, // 0xC2
{0x18,0x18,0x18,0x18,0x18,0x1F,0x18,0x18,0x18,0x18 ,0x18,0x18}, // 0xC3
{0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00 ,0x00,0x00}, // 0xC4
{0x18,0x18,0x18,0x18,0x18,0xFF,0x18,0x18,0x18,0x18 ,0x18,0x18}, // 0xC5
{0x00,0x76,0xDC,0x00,0x78,0x0C,0x7C,0xCC,0xCC,0x76 ,0x00,0x00}, // 0xC6
{0x76,0xDC,0x00,0x30,0x78,0xCC,0xCC,0xFC,0xCC,0xCC ,0x00,0x00}, // 0xC7
{0x66,0x66,0x66,0x66,0x67,0x60,0x60,0x7F,0x00,0x00 ,0x00,0x00}, // 0xC8
{0x00,0x00,0x00,0x00,0x7F,0x60,0x60,0x67,0x66,0x66 ,0x66,0x66}, // 0xC9
{0x66,0x66,0x66,0x66,0xE7,0x00,0x00,0xFF,0x00,0x00 ,0x00,0x00}, // 0xCA
{0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0xE7,0x66,0x66 ,0x66,0x66}, // 0xCB
{0x66,0x66,0x66,0x66,0x67,0x60,0x60,0x67,0x66,0x66 ,0x66,0x66}, // 0xCC
{0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00 ,0x00,0x00}, // 0xCD
{0x66,0x66,0x66,0x66,0xE7,0x00,0x00,0xE7,0x66,0x66 ,0x66,0x66}, // 0xCE
{0x00,0x00,0x00,0x00,0x00,0xC6,0x7C,0x6C,0x7C,0xC6 ,0x00,0x00}, // 0xCF
{0xCC,0x30,0xD8,0x0C,0x06,0x7E,0xC6,0xC6,0xC6,0x7C ,0x00,0x00}, // 0xD0
{0x00,0xF8,0x6C,0x66,0x66,0xF6,0x66,0x66,0x6C,0xF8 ,0x00,0x00}, // 0xD1
{0x78,0xCC,0x00,0xFC,0xC4,0xC0,0xF8,0xC0,0xC4,0xFC ,0x00,0x00}, // 0xD2
{0x00,0xCC,0x00,0xFC,0xC4,0xC0,0xF8,0xC0,0xC4,0xFC ,0x00,0x00}, // 0xD3
{0x60,0x30,0x00,0xFC,0xC4,0xC0,0xF8,0xC0,0xC4,0xFC ,0x00,0x00}, // 0xD4
{0x00,0xF0,0x30,0x30,0x30,0xFC,0x00,0x00,0x00,0x00 ,0x00,0x00}, // 0xD5
{0x18,0x30,0x00,0x78,0x30,0x30,0x30,0x30,0x30,0x78 ,0x00,0x00}, // 0xD6
{0x78,0xCC,0x00,0x78,0x30,0x30,0x30,0x30,0x30,0x78 ,0x00,0x00}, // 0xD7
{0x00,0xCC,0x00,0x78,0x30,0x30,0x30,0x30,0x30,0x78 ,0x00,0x00}, // 0xD8
{0x18,0x18,0x18,0x18,0x18,0xF8,0x00,0x00,0x00,0x00 ,0x00,0x00}, // 0xD9
{0x00,0x00,0x00,0x00,0x00,0x1F,0x18,0x18,0x18,0x18 ,0x18,0x18}, // 0xDA
{0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF ,0xFF,0xFF}, // 0xDB
{0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF ,0xFF,0xFF}, // 0xDC
{0x00,0x18,0x18,0x18,0x18,0x00,0x18,0x18,0x18,0x18 ,0x00,0x00}, // 0xDD
{0x60,0x30,0x00,0x78,0x30,0x30,0x30,0x30,0x30,0x78 ,0x00,0x00}, // 0xDE
{0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00 ,0x00,0x00}, // 0xDF
{0x18,0x30,0x00,0x78,0xCC,0xCC,0xCC,0xCC,0xCC,0x78 ,0x00,0x00}, // 0xE0
{0x00,0x78,0xCC,0xCC,0xD8,0xCC,0xCC,0xCC,0xF8,0xC0 ,0x60,0x00}, // 0xE1
{0x78,0xCC,0x00,0x78,0xCC,0xCC,0xCC,0xCC,0xCC,0x78 ,0x00,0x00}, // 0xE2
{0x60,0x30,0x00,0x78,0xCC,0xCC,0xCC,0xCC,0xCC,0x78 ,0x00,0x00}, // 0xE3
{0x00,0x76,0xDC,0x00,0x78,0xCC,0xCC,0xCC,0xCC,0x78 ,0x00,0x00}, // 0xE4
{0x76,0xDC,0x00,0x78,0xCC,0xCC,0xCC,0xCC,0xCC,0x78 ,0x00,0x00}, // 0xE5
{0x00,0x00,0x00,0x00,0x66,0x66,0x66,0x66,0x66,0x7B ,0x60,0xC0}, // 0xE6
{0x00,0x00,0xE0,0x60,0x7C,0x66,0x66,0x7C,0x60,0xF0 ,0x00,0x00}, // 0xE7
{0x00,0xF0,0x60,0x7C,0x66,0x66,0x66,0x7C,0x60,0xF0 ,0x00,0x00}, // 0xE8
{0x18,0x30,0x00,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0x78 ,0x00,0x00}, // 0xE9
{0x78,0xCC,0x00,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0x78 ,0x00,0x00}, // 0xEA
{0x60,0x30,0x00,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0x78 ,0x00,0x00}, // 0xEB
{0x06,0x0C,0x18,0x00,0x66,0x66,0x66,0x66,0x3C,0x0C ,0x18,0xF0}, // 0xEC
{0x18,0x30,0x00,0xCC,0xCC,0xCC,0x78,0x30,0x30,0x78 ,0x00,0x00}, // 0xED
{0x00,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00}, // 0xEE
{0x0C,0x18,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00}, // 0xEF
{0x00,0x00,0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0x00 ,0x00,0x00}, // 0xF0
{0x00,0x00,0x30,0x30,0xFC,0x30,0x30,0x00,0xFC,0x00 ,0x00,0x00}, // 0xF1
{0x00,0x00,0x00,0x00,0x00,0xF8,0x00,0x00,0xF8,0x00 ,0x00,0x00}, // 0xF2
{0xE0,0x33,0x66,0x3C,0xF8,0x37,0x6F,0xDB,0xB3,0x3F ,0x03,0x00}, // 0xF3
{0x00,0x7F,0xDB,0xDB,0xDB,0x7B,0x1B,0x1B,0x1B,0x1B ,0x00,0x00}, // 0xF4
{0x00,0x7E,0x63,0x30,0x3C,0x66,0x66,0x3C,0x0C,0xC6 ,0x7E,0x00}, // 0xF5
{0x00,0x00,0x30,0x30,0x00,0xFC,0x00,0x30,0x30,0x00 ,0x00,0x00}, // 0xF6
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x30,0x70}, // 0xF7
{0x00,0x3C,0x66,0x66,0x66,0x3C,0x00,0x00,0x00,0x00 ,0x00,0x00}, // 0xF8
{0x00,0xCC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00}, // 0xF9
{0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x00 ,0x00,0x00}, // 0xFA
{0x00,0x30,0x70,0x30,0x30,0x78,0x00,0x00,0x00,0x00 ,0x00,0x00}, // 0xFB
{0x00,0x78,0x0C,0x38,0x0C,0x78,0x00,0x00,0x00,0x00 ,0x00,0x00}, // 0xFC
{0x00,0x78,0x0C,0x18,0x30,0x7C,0x00,0x00,0x00,0x00 ,0x00,0x00}, // 0xFD
{0x00,0x00,0x00,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0x00 ,0x00,0x00}, // 0xFE
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00} // 0xFF
};

int main(void)
{

unsigned char text[20][40];
unsigned char zeichen=0;
unsigned char temp;

for (unsigned char y=0;y<20;y++)
{
for (unsigned char x=0;x<40;x++)
text[y][x]=zeichen++;
}


DDRC=0x0F;
DDRB=0x07;


PORTB=(1<<FRAME)|(1<<LOAD);

while(1)
{
PORTB=(1<<FRAME)|(1<<CP);

for(unsigned char i =0; i<20;i++)
{
for(unsigned char j =0; j<12;j++)
{
for( unsigned char k =0; k<40;k++)
{
temp=pgm_read_byte(&schrift[ text[i][k] ][j]);

PORTB=(1<<CP);
PORTC=(temp>>4); //ersten 4 Pixel
PORTB=0;
PORTB=(1<<CP); //zweiten 4 Pixel
PORTC=(temp);
PORTB=0;

}
PORTB=(1<<LOAD);
}

}
PORTB=(1<<LOAD)|(1<<FRAME);

}


}

Besserwessi
21.04.2012, 16:19
In C sehe ich das wenig Möglichkeiten zur Optimierung. Mit inline ASM könnte man ggf. noch etwas machen, vor allem beim (temp>>4). Die Funktion könnte man mit dem eher selten genutzten ASM Befehl swap deutlich schneller hinbekommen. Es würde mich wundern wenn der Compiler das erkennt. Ob noch mehr inline ASM sinnvoll ist, könnte man ggf. am ASM Code erkennen den der Compiler produziert. Es ist schon möglich das da noch einige Optimierungen möglich sind, sowohl in C als auch in ASM. Ein Punkt könnte die Form des Array-Zugriffs sein. Da könnte es schneller gehen, wenn man nur ein 1 Dim Array nutzt, und dafür beim schreiben in den Puffer etwas umrechnet - das muss nicht länger dauern, denn der Compiler muss an sich auf umrechnen.

Der Code für die Ausgabe ist aber auch noch nicht so lang, da könnte ggf. sogar die ganze Schleife noch als inline ASM machen.

markusj
21.04.2012, 16:49
Du möchtest nicht -O1 sondern -Os, da bei AVRs in der Regel die Geschwindigkeit mit der Größe korreliert. Probiers einfach Mal aus. Alternativ kannst du auch die richtig aggressiven Optimierungen anschalten und die Parameter zum Ausrollen von Schleifen modifizieren, dann geht der Code aber mit Sicherheit in die Breite.

mfG
Markus

MisterMou
21.04.2012, 16:52
Du möchtest nicht -O1 sondern -Os, da bei AVRs in der Regel die Geschwindigkeit mit der Größe korreliert. Probiers einfach Mal aus. Alternativ kannst du auch die richtig aggressiven Optimierungen anschalten und die Parameter zum Ausrollen von Schleifen modifizieren, dann geht der Code aber mit Sicherheit in die Breite.


Da muss ich dich enttäuschen.
-O1 ist schon die beste Lösung, sonst sinds gute 61Hz ;)


Das mit dem swap Befehl stimmt.
Hab fix ne inline Funktion mit inline asm zusammengeworfen, das ergibt 66Hz :)
Bis jetzt war die 1d Array Lösung noch nicht schneller, aber ich bin dran.

MagicWSmoke
21.04.2012, 17:13
Mit inline ASM könnte man ggf. noch etwas machen, vor allem beim (temp>>4). Die Funktion könnte man mit dem eher selten genutzten ASM Befehl swap deutlich schneller hinbekommen. Es würde mich wundern wenn der Compiler das erkennt.
Darfst Dich wundern, erkennt er.

swap r24
andi r24,k0F
out p15,r24
Da die Ausgabe für eine Zeile immer jeweils das erste Byte eines Zeichens, dann nächste Zeile das zweite, usw. ist, wäre eine andere Anordnung des Fonts vorteilhafter, weil dann weniger gerechnet werden müsste. Wenn also die erste Zeile eines beliebigen Zeichens linear über 256 Bytes Programmspeicher ansprechbar ist, fällt die Multiplikation mit 12 weg, die erforderlich ist um an die passende Stelle des Fonts zu gelangen.

Statt

const unsigned char schrift[256][12] PROGMEM ={
eine Anordnung

const unsigned char schrift[12][256] PROGMEM ={
Ein

temp=pgm_read_byte(&schrift[j][text[ln_ctr][row_ctr]]);
würde auf 71,7 Hz kommen. Keine Ahnung ob es sich lohnt die Tabelle dafür umzustellen.

Nachtrag:
Unter der Voraussetzung, dass die Fonttabelle [12][256] lautet, würde dies hier für 78,4 Hz sorgen, Optimierung -Os:

unsigned char *cptr;
// ...
cptr = &schrift[j][0];
for( unsigned char row_ctr = 0; row_ctr < rows; row_ctr++)
{
temp=pgm_read_byte(cptr + text[ln_ctr][row_ctr]);
// ...

MisterMou
21.04.2012, 18:25
Krass, wie hast du die 71,7 Hz berechnet?
Ich hab deinen Vorschlag durchgearbeitet, komm jetzt auf 71,6 Hz.

Man gut, dass man als Programmierer sowas automatisieren kann :D

Ich hab das Gefühl wir kommen gut voran :)

Aktueller Stand:


/*
*B0-CP
*B1-LOAD
*B2-FRAME
*
*C0-D0
*C1-D1
*C2-D2
*C3-D3
*
*Mega8 @ 16MHz
*/

#define CP 0
#define LOAD 1
#define FRAME 2

#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>

//8x12 Schrift
//http://www.mikrocontroller.net/topic/54860
//Danke Benedikt!

const unsigned char schrift[12][256] PROGMEM ={
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x10,0x00,0x30,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x0C,0x30,0x00,0xC0,0x38,0x00,0x30,0x00,0xC0,0x00 ,0x10,0x60,0x00,0x78,0x0C,0x00,0x00,0x30,0x00,0xC0 ,0x30,0xC0,0x00,0x00,0xCC,0x00,0x3C,0x00,0x00,0x0E ,0x0C,0x0C,0x0C,0x0C,0x00,0x76,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x24,0x55,0x6D,0x18 ,0x18,0x0C,0x78,0x60,0x00,0x66,0x66,0x00,0x66,0x00 ,0xCC,0x00,0x18,0x18,0x00,0x18,0x00,0x18,0x00,0x76 ,0x66,0x00,0x66,0x00,0x66,0x00,0x66,0x00,0xCC,0x00 ,0x78,0x00,0x60,0x00,0x18,0x78,0x00,0x18,0x00,0xFF ,0x00,0x00,0x60,0xFF,0x18,0x00,0x78,0x60,0x00,0x76 ,0x00,0x00,0x00,0x18,0x78,0x60,0x06,0x18,0x00,0x0C ,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00},
{0x00,0x7E,0x7E,0x00,0x10,0x18,0x18,0x00,0x00,0x00 ,0x00,0x3E,0x3C,0x00,0x7F,0x00,0x80,0x02,0x18,0x66 ,0x7F,0x7E,0x00,0x18,0x18,0x18,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x30,0x66,0x6C,0x30,0x00,0x70,0x30 ,0x0C,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x10 ,0x78,0x78,0x0C,0xFC,0x38,0xFE,0x78,0x78,0x00,0x00 ,0x0C,0x00,0x60,0x78,0x7C,0x30,0xFC,0x3C,0xF8,0xFE ,0xFE,0x3C,0xCC,0x78,0x1E,0xE6,0xF0,0xC6,0xC6,0x38 ,0xFC,0x38,0xFC,0x78,0xFC,0xCC,0xCC,0xC6,0xCC,0xCC ,0xFE,0x3C,0x00,0x3C,0x38,0x00,0x30,0x00,0xE0,0x00 ,0x1C,0x00,0x38,0x00,0xE0,0x18,0x0C,0xE0,0x78,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x1C,0x18,0xE0,0x73,0x00,0x78,0xCC ,0x18,0x78,0xCC,0x60,0x6C,0x00,0x78,0xCC,0x60,0x6C ,0x38,0x30,0xCC,0xCC,0x18,0x00,0x3E,0x78,0xCC,0x60 ,0x78,0x60,0x66,0xCC,0x00,0x00,0x66,0x3A,0x00,0x1B ,0x18,0x18,0x18,0x18,0x76,0xDC,0x78,0x78,0x30,0x38 ,0x00,0x62,0x63,0x30,0x00,0x00,0x92,0xAA,0xDB,0x18 ,0x18,0x18,0xCC,0x30,0x38,0x66,0x66,0x00,0x66,0x30 ,0xCC,0x00,0x18,0x18,0x00,0x18,0x00,0x18,0x76,0xDC ,0x66,0x00,0x66,0x00,0x66,0x00,0x66,0x00,0x30,0xF8 ,0xCC,0xCC,0x30,0xF0,0x30,0xCC,0xCC,0x18,0x00,0xFF ,0x00,0x18,0x30,0xFF,0x30,0x78,0xCC,0x30,0x76,0xDC ,0x00,0x00,0xF0,0x30,0xCC,0x30,0x0C,0x30,0xFC,0x18 ,0x00,0x00,0x00,0x33,0x7F,0x7E,0x00,0x00,0x3C,0xCC ,0x00,0x30,0x78,0x78,0x00,0x00},
{0x00,0xC3,0xFF,0x44,0x38,0x3C,0x3C,0x00,0x00,0x00 ,0x00,0x0E,0x66,0x00,0x63,0x18,0xC0,0x06,0x3C,0x66 ,0xDB,0x63,0x00,0x3C,0x3C,0x18,0x00,0x00,0x00,0x00 ,0x10,0xFE,0x00,0x78,0x66,0x6C,0x7C,0x00,0xD8,0x30 ,0x18,0x30,0x00,0x00,0x00,0x00,0x00,0x02,0xC6,0x30 ,0xCC,0xCC,0x1C,0xC0,0x60,0xC6,0xCC,0xCC,0x00,0x00 ,0x18,0x00,0x30,0xCC,0xC6,0x78,0x66,0x66,0x6C,0x62 ,0x66,0x66,0xCC,0x30,0x0C,0x66,0x60,0xEE,0xC6,0x6C ,0x66,0x6C,0x66,0xCC,0xB4,0xCC,0xCC,0xC6,0xCC,0xCC ,0xCE,0x30,0x80,0x0C,0x6C,0x00,0x18,0x00,0x60,0x00 ,0x0C,0x00,0x6C,0x00,0x60,0x18,0x0C,0x60,0x18,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00 ,0x00,0x00,0x00,0x30,0x18,0x30,0xDA,0x00,0xCC,0xCC ,0x30,0xCC,0xCC,0x30,0x6C,0x00,0xCC,0xCC,0x30,0x6C ,0x6C,0x18,0x00,0xCC,0x00,0x00,0x78,0xCC,0xCC,0x30 ,0xCC,0x30,0x66,0x00,0xCC,0x00,0x60,0x6C,0x00,0x18 ,0x30,0x30,0x30,0x30,0xDC,0x00,0xCC,0xCC,0x30,0x44 ,0x00,0xE6,0xE6,0x30,0x00,0x00,0x49,0x55,0xB6,0x18 ,0x18,0x00,0x00,0x00,0x44,0x66,0x66,0x00,0x66,0x30 ,0xCC,0x00,0x18,0x18,0x00,0x18,0x00,0x18,0xDC,0x00 ,0x66,0x00,0x66,0x00,0x66,0x00,0x66,0x00,0xD8,0x6C ,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x18,0x00,0xFF ,0x00,0x18,0x00,0xFF,0x00,0xCC,0x00,0x00,0xDC,0x00 ,0x00,0xE0,0x60,0x00,0x00,0x00,0x18,0x00,0x00,0x30 ,0x00,0x30,0x00,0x66,0xDB,0x63,0x30,0x00,0x66,0x00 ,0x00,0x70,0x0C,0x0C,0x00,0x00},
{0x00,0x81,0xFF,0xEE,0x7C,0x3C,0x7E,0x00,0x00,0x00 ,0x00,0x3A,0x66,0x00,0x7F,0xDB,0xE0,0x0E,0x7E,0x66 ,0xDB,0x30,0x00,0x7E,0x7E,0x18,0x18,0x30,0x00,0x24 ,0x10,0xFE,0x00,0x78,0x66,0xFE,0xC0,0xC4,0xD8,0x30 ,0x30,0x18,0x66,0x18,0x00,0x00,0x00,0x06,0xCE,0xF0 ,0xCC,0x0C,0x3C,0xC0,0xC0,0xC6,0xCC,0xCC,0x38,0x38 ,0x30,0x00,0x18,0x0C,0xC6,0xCC,0x66,0xC6,0x66,0x60 ,0x62,0xC6,0xCC,0x30,0x0C,0x6C,0x60,0xFE,0xE6,0xC6 ,0x66,0xC6,0x66,0xCC,0x30,0xCC,0xCC,0xC6,0xCC,0xCC ,0x98,0x30,0xC0,0x0C,0xC6,0x00,0x00,0x00,0x60,0x00 ,0x0C,0x00,0x60,0x00,0x60,0x00,0x00,0x60,0x18,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00 ,0x00,0x00,0x00,0x30,0x18,0x30,0xCE,0x10,0xCC,0x00 ,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x30,0x78,0xFC,0x00,0xD8,0x00,0x00,0x00 ,0x00,0x00,0x00,0x78,0xCC,0x00,0x60,0xCE,0x00,0x18 ,0x00,0x00,0x00,0x00,0x00,0xC6,0xCC,0xCC,0x00,0xBA ,0x00,0x6C,0x6C,0x00,0x00,0x00,0x24,0xAA,0x6D,0x18 ,0x18,0x30,0x30,0x30,0xBA,0x66,0x66,0x00,0x66,0x78 ,0xCC,0x00,0x18,0x18,0x00,0x18,0x00,0x18,0x00,0x30 ,0x66,0x00,0x66,0x00,0x66,0x00,0x66,0x00,0x0C,0x66 ,0xFC,0xFC,0xFC,0x30,0x78,0x78,0x78,0x18,0x00,0xFF ,0x00,0x18,0x78,0xFF,0x78,0xCC,0x78,0x78,0x00,0x78 ,0x00,0x60,0x7C,0xCC,0xCC,0xCC,0x00,0xCC,0x00,0x00 ,0x00,0x30,0x00,0x3C,0xDB,0x30,0x30,0x00,0x66,0x00 ,0x00,0x30,0x38,0x18,0xFC,0x00},
{0x00,0xA5,0xDB,0xFE,0xFE,0xFF,0xFF,0x00,0x00,0x00 ,0x00,0x72,0x66,0x00,0x63,0x7E,0xF8,0x3E,0x18,0x66 ,0xDB,0x3C,0x00,0x18,0x18,0x18,0x0C,0x60,0xC0,0x66 ,0x38,0x7C,0x00,0x78,0x24,0x6C,0xC0,0xCC,0x70,0x60 ,0x60,0x0C,0x3C,0x18,0x00,0x00,0x00,0x0C,0xDE,0x30 ,0x0C,0x0C,0x6C,0xC0,0xC0,0x06,0xCC,0xCC,0x38,0x38 ,0x60,0x7E,0x0C,0x18,0xDE,0xCC,0x66,0xC0,0x66,0x64 ,0x64,0xC0,0xCC,0x30,0x0C,0x6C,0x60,0xFE,0xF6,0xC6 ,0x66,0xC6,0x66,0xC0,0x30,0xCC,0xCC,0xC6,0x78,0xCC ,0x18,0x30,0x60,0x0C,0x00,0x00,0x00,0x78,0x7C,0x78 ,0x7C,0x78,0x60,0x76,0x6C,0x78,0x3C,0x66,0x18,0xFC ,0xF8,0x78,0xDC,0x76,0xEC,0x78,0xFC,0xCC,0xCC,0xC6 ,0xC6,0x66,0xFC,0x60,0x18,0x18,0x00,0x38,0xC0,0xCC ,0x78,0x78,0x78,0x78,0xF8,0x78,0x78,0x78,0x78,0x78 ,0x78,0x78,0x78,0x78,0xC4,0xFE,0xD8,0x78,0x78,0x78 ,0xCC,0xCC,0x66,0xCC,0xCC,0x78,0x60,0xD6,0x00,0x7E ,0x78,0x78,0x78,0xCC,0xF8,0xE6,0x7E,0x78,0x30,0xAA ,0x00,0x78,0x78,0x30,0x33,0xCC,0x92,0x55,0xDB,0x18 ,0x18,0x78,0x78,0x78,0xA2,0xE6,0x66,0xFE,0xE6,0xCC ,0x78,0x00,0x18,0x18,0x00,0x18,0x00,0x18,0x78,0x78 ,0x67,0x7F,0xE7,0xFF,0x67,0xFF,0xE7,0x00,0x06,0x66 ,0xC4,0xC4,0xC4,0x30,0x30,0x30,0x30,0x18,0x00,0xFF ,0x00,0x18,0x30,0xFF,0xCC,0xD8,0xCC,0xCC,0x78,0xCC ,0x66,0x7C,0x66,0xCC,0xCC,0xCC,0x66,0xCC,0x00,0x00 ,0x00,0xFC,0x00,0xF8,0xDB,0x3C,0x00,0x00,0x66,0x00 ,0x00,0x30,0x0C,0x30,0xFC,0x00},
{0x00,0x81,0xFF,0xFE,0xFE,0xE7,0xFF,0x00,0x00,0x00 ,0x00,0xF8,0x3C,0x00,0x63,0xE7,0xFE,0xFE,0x18,0x66 ,0x7B,0x66,0x00,0x18,0x18,0x18,0xFE,0xFE,0xC0,0xFF ,0x38,0x7C,0x00,0x30,0x00,0x6C,0x78,0x18,0xFA,0x00 ,0x60,0x0C,0xFF,0x7E,0x00,0xFE,0x00,0x18,0xD6,0x30 ,0x18,0x38,0xCC,0xF8,0xF8,0x0C,0x78,0x7C,0x00,0x00 ,0xC0,0x00,0x06,0x30,0xDE,0xCC,0x7C,0xC0,0x66,0x7C ,0x7C,0xC0,0xFC,0x30,0x0C,0x78,0x60,0xD6,0xFE,0xC6 ,0x7C,0xC6,0x7C,0x70,0x30,0xCC,0xCC,0xD6,0x30,0x78 ,0x30,0x30,0x30,0x0C,0x00,0x00,0x00,0x0C,0x66,0xCC ,0xCC,0xCC,0xF8,0xCC,0x76,0x18,0x0C,0x6C,0x18,0xD6 ,0xCC,0xCC,0x66,0xCC,0x6E,0xCC,0x60,0xCC,0xCC,0xC6 ,0x6C,0x66,0x8C,0xC0,0x00,0x0C,0x00,0x6C,0xC0,0xCC ,0xCC,0x0C,0x0C,0x0C,0x0C,0xCC,0xCC,0xCC,0xCC,0x18 ,0x18,0x18,0xCC,0xCC,0xC0,0x1B,0xFE,0xCC,0xCC,0xCC ,0xCC,0xCC,0x66,0xCC,0xCC,0xCC,0xFC,0xD6,0xC6,0x18 ,0x0C,0x18,0xCC,0xCC,0xCC,0xF6,0x00,0x00,0x60,0xBA ,0xFC,0x30,0x37,0x30,0x66,0x66,0x49,0xAA,0xB6,0x18 ,0xF8,0xCC,0xCC,0xCC,0xA2,0x06,0x66,0x06,0x06,0xC0 ,0xFC,0xF8,0x1F,0xFF,0xFF,0x1F,0xFF,0xFF,0x0C,0xCC ,0x60,0x60,0x00,0x00,0x60,0x00,0x00,0xC6,0x7E,0xF6 ,0xC0,0xC0,0xC0,0xFC,0x30,0x30,0x30,0xF8,0x1F,0xFF ,0x00,0x00,0x30,0xFF,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC ,0x66,0x66,0x66,0xCC,0xCC,0xCC,0x66,0xCC,0x00,0x00 ,0xFC,0x30,0xF8,0x37,0x7B,0x66,0xFC,0x00,0x3C,0x00 ,0x18,0x78,0x78,0x7C,0xFC,0x00},
{0x00,0xBD,0xC3,0xFE,0x7C,0xE7,0x7E,0x00,0x00,0x00 ,0x00,0xCC,0x18,0x00,0x63,0xE7,0xF8,0x3E,0x18,0x00 ,0x1B,0x66,0x00,0x18,0x18,0x18,0x0C,0x60,0xC0,0x66 ,0x7C,0x38,0x00,0x30,0x00,0x6C,0x0C,0x30,0xDE,0x00 ,0x60,0x0C,0x3C,0x18,0x00,0x00,0x00,0x30,0xF6,0x30 ,0x30,0x0C,0xFE,0x0C,0xCC,0x18,0xCC,0x18,0x00,0x00 ,0x60,0x7E,0x0C,0x30,0xDE,0xFC,0x66,0xC0,0x66,0x64 ,0x64,0xCE,0xCC,0x30,0xCC,0x6C,0x62,0xC6,0xDE,0xC6 ,0x60,0xCE,0x6C,0x18,0x30,0xCC,0xCC,0xD6,0x78,0x30 ,0x60,0x30,0x18,0x0C,0x00,0x00,0x00,0x7C,0x66,0xC0 ,0xCC,0xFC,0x60,0xCC,0x66,0x18,0x0C,0x78,0x18,0xD6 ,0xCC,0xCC,0x66,0xCC,0x76,0x60,0x60,0xCC,0xCC,0xD6 ,0x38,0x66,0x18,0x60,0x18,0x18,0x00,0xC6,0xC0,0xCC ,0xFC,0x7C,0x7C,0x7C,0x7C,0xC0,0xFC,0xFC,0xFC,0x18 ,0x18,0x18,0xCC,0xCC,0xF8,0x7F,0xD8,0xCC,0xCC,0xCC ,0xCC,0xCC,0x66,0xCC,0xCC,0xDC,0x60,0xD6,0x6C,0x18 ,0x7C,0x18,0xCC,0xCC,0xCC,0xDE,0xFE,0xFE,0xC0,0xB2 ,0x0C,0x6E,0x6F,0x78,0xCC,0x33,0x24,0x55,0x6D,0x18 ,0x18,0xCC,0xCC,0xCC,0xA2,0x06,0x66,0x06,0x06,0xC0 ,0x30,0x18,0x00,0x00,0x18,0x18,0x00,0x18,0x7C,0xCC ,0x60,0x60,0x00,0x00,0x60,0x00,0x00,0x7C,0xC6,0x66 ,0xF8,0xF8,0xF8,0x00,0x30,0x30,0x30,0x00,0x18,0xFF ,0xFF,0x18,0x30,0x00,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC ,0x66,0x66,0x66,0xCC,0xCC,0xCC,0x66,0x78,0x00,0x00 ,0x00,0x30,0x00,0x6F,0x1B,0x66,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0xFC,0x00},
{0x00,0x99,0xE7,0x7C,0x38,0x18,0x18,0x00,0x00,0x00 ,0x00,0xCC,0x7E,0x00,0x67,0x7E,0xE0,0x0E,0x7E,0x00 ,0x1B,0x3C,0xFE,0x7E,0x18,0x7E,0x18,0x30,0xFE,0x24 ,0x7C,0x38,0x00,0x00,0x00,0xFE,0x0C,0x60,0xCC,0x00 ,0x30,0x18,0x66,0x18,0x00,0x00,0x00,0x60,0xE6,0x30 ,0x60,0x0C,0x0C,0x0C,0xCC,0x30,0xCC,0x18,0x38,0x38 ,0x30,0x00,0x18,0x00,0xC0,0xCC,0x66,0xC6,0x66,0x60 ,0x60,0xC6,0xCC,0x30,0xCC,0x6C,0x66,0xC6,0xCE,0xC6 ,0x60,0xDE,0x66,0xCC,0x30,0xCC,0xCC,0x6C,0xCC,0x30 ,0x62,0x30,0x0C,0x0C,0x00,0x00,0x00,0xCC,0x66,0xC0 ,0xCC,0xC0,0x60,0xCC,0x66,0x18,0x0C,0x6C,0x18,0xD6 ,0xCC,0xCC,0x66,0xCC,0x60,0x18,0x60,0xCC,0xCC,0xD6 ,0x38,0x66,0x60,0x30,0x18,0x30,0x00,0xC6,0xCC,0xCC ,0xC0,0xCC,0xCC,0xCC,0xCC,0xC0,0xC0,0xC0,0xC0,0x18 ,0x18,0x18,0xFC,0xFC,0xC0,0xD8,0xD8,0xCC,0xCC,0xCC ,0xCC,0xCC,0x66,0xCC,0xCC,0xEC,0x60,0xE6,0x38,0x18 ,0xCC,0x18,0xCC,0xCC,0xCC,0xCE,0x00,0x00,0xC0,0xAA ,0x0C,0xC3,0xDB,0x78,0xCC,0x33,0x92,0xAA,0xDB,0x18 ,0x18,0xFC,0xFC,0xFC,0xBA,0xE6,0x66,0xE6,0xFE,0xCC ,0xFC,0x18,0x00,0x00,0x18,0x18,0x00,0x18,0xCC,0xFC ,0x7F,0x67,0xFF,0xE7,0x67,0xFF,0xE7,0x6C,0xC6,0x66 ,0xC0,0xC0,0xC0,0x00,0x30,0x30,0x30,0x00,0x18,0xFF ,0xFF,0x18,0x30,0x00,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC ,0x66,0x7C,0x7C,0xCC,0xCC,0xCC,0x66,0x30,0x00,0x00 ,0x00,0x00,0x00,0xDB,0x1B,0x3C,0x30,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0xFC,0x00},
{0x00,0xC3,0xFF,0x38,0x10,0x18,0x18,0x00,0x00,0x00 ,0x00,0xCC,0x18,0x00,0xE7,0xDB,0xC0,0x06,0x3C,0x66 ,0x1B,0x0C,0xFE,0x3C,0x18,0x3C,0x00,0x00,0x00,0x00 ,0xFE,0x10,0x00,0x30,0x00,0x6C,0xF8,0xCC,0xDC,0x00 ,0x18,0x30,0x00,0x00,0x38,0x00,0x38,0xC0,0xC6,0x30 ,0xCC,0xCC,0x0C,0xCC,0xCC,0x30,0xCC,0x30,0x38,0x38 ,0x18,0x00,0x30,0x30,0xC0,0xCC,0x66,0x66,0x6C,0x62 ,0x60,0x66,0xCC,0x30,0xCC,0x66,0x66,0xC6,0xC6,0x6C ,0x60,0x7C,0x66,0xCC,0x30,0xCC,0x78,0x6C,0xCC,0x30 ,0xC6,0x30,0x06,0x0C,0x00,0x00,0x00,0xCC,0x66,0xCC ,0xCC,0xCC,0x60,0x7C,0x66,0x18,0x0C,0x66,0x18,0xD6 ,0xCC,0xCC,0x66,0xCC,0x60,0xCC,0x6C,0xCC,0x78,0x6C ,0x6C,0x3C,0xC4,0x30,0x18,0x30,0x00,0xFE,0xCC,0xCC ,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xC0,0xC0,0xC0,0x18 ,0x18,0x18,0xCC,0xCC,0xC4,0xD8,0xD8,0xCC,0xCC,0xCC ,0xCC,0xCC,0x3C,0xCC,0xCC,0xCC,0xC0,0x6C,0x6C,0xD8 ,0xCC,0x18,0xCC,0xCC,0xCC,0xC6,0x00,0x00,0xCC,0x44 ,0x0C,0x86,0xB3,0x78,0x66,0x66,0x49,0x55,0xB6,0x18 ,0x18,0xCC,0xCC,0xCC,0x44,0x66,0x66,0x66,0x00,0x78 ,0x30,0x18,0x00,0x00,0x18,0x18,0x00,0x18,0xCC,0xCC ,0x00,0x66,0x00,0x66,0x66,0x00,0x66,0x7C,0xC6,0x6C ,0xC4,0xC4,0xC4,0x00,0x30,0x30,0x30,0x00,0x18,0xFF ,0xFF,0x18,0x30,0x00,0xCC,0xF8,0xCC,0xCC,0xCC,0xCC ,0x66,0x60,0x60,0xCC,0xCC,0xCC,0x3C,0x30,0x00,0x00 ,0x00,0xFC,0xF8,0xB3,0x1B,0x0C,0x30,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0xFC,0x00},
{0x00,0x7E,0x7E,0x10,0x00,0x7E,0x7E,0x00,0x00,0x00 ,0x00,0x78,0x18,0x00,0xE6,0x18,0x80,0x02,0x18,0x66 ,0x1B,0xC6,0xFE,0x18,0x18,0x18,0x00,0x00,0x00,0x00 ,0xFE,0x10,0x00,0x30,0x00,0x6C,0x30,0x8C,0x76,0x00 ,0x0C,0x60,0x00,0x00,0x38,0x00,0x38,0x80,0x7C,0xFC ,0xFC,0x78,0x1E,0x78,0x78,0x30,0x78,0x70,0x00,0x18 ,0x0C,0x00,0x60,0x30,0x7C,0xCC,0xFC,0x3C,0xF8,0xFE ,0xF0,0x3E,0xCC,0x78,0x78,0xE6,0xFE,0xC6,0xC6,0x38 ,0xF0,0x0C,0xE6,0x78,0x78,0x78,0x30,0x6C,0xCC,0x78 ,0xFE,0x3C,0x02,0x3C,0x00,0x00,0x00,0x76,0xDC,0x78 ,0x76,0x78,0xF0,0x0C,0xE6,0x7E,0xCC,0xE6,0x7E,0xC6 ,0xCC,0x78,0x7C,0x7C,0xF0,0x78,0x38,0x76,0x30,0x6C ,0xC6,0x0C,0xFC,0x1C,0x18,0xE0,0x00,0x00,0x78,0x76 ,0x78,0x76,0x76,0x76,0x76,0x78,0x7C,0x7C,0x7C,0x7E ,0x7E,0x7E,0xCC,0xCC,0xFC,0xEF,0xDE,0x78,0x78,0x78 ,0x76,0x76,0x0C,0x78,0x78,0x78,0xFE,0xB8,0xC6,0x70 ,0x76,0x7E,0x78,0x76,0xCC,0xC6,0x00,0x00,0x78,0x38 ,0x00,0x0C,0x3F,0x30,0x33,0xCC,0x24,0xAA,0x6D,0x18 ,0x18,0xCC,0xCC,0xCC,0x38,0x66,0x66,0x66,0x00,0x30 ,0x30,0x18,0x00,0x00,0x18,0x18,0x00,0x18,0x76,0xCC ,0x00,0x66,0x00,0x66,0x66,0x00,0x66,0xC6,0x7C,0xF8 ,0xFC,0xFC,0xFC,0x00,0x78,0x78,0x78,0x00,0x18,0xFF ,0xFF,0x18,0x78,0x00,0x78,0xC0,0x78,0x78,0x78,0x78 ,0x7B,0xF0,0xF0,0x78,0x78,0x78,0x0C,0x78,0x00,0x00 ,0x00,0x00,0x00,0x3F,0x1B,0xC6,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00},
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x00,0x00 ,0x00,0x7E,0x00,0x7E,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0xCC,0x00,0x00,0xCC,0x00,0x00,0x00 ,0x00,0x00,0x60,0x0C,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00 ,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x1F,0x03,0x00,0x00,0x00,0x92,0x55,0xDB,0x18 ,0x18,0x00,0x00,0x00,0x00,0x66,0x66,0x66,0x00,0x30 ,0x00,0x18,0x00,0x00,0x18,0x18,0x00,0x18,0x00,0x00 ,0x00,0x66,0x00,0x66,0x66,0x00,0x66,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0xFF ,0xFF,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x00 ,0x60,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00 ,0x00,0x00,0x00,0x03,0x00,0x7E,0x00,0x30,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00},
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x78,0x00,0x00,0x78,0x00,0x00,0x00 ,0x00,0x00,0xF0,0x1E,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00 ,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x49,0xAA,0xB6,0x18 ,0x18,0x00,0x00,0x00,0x00,0x66,0x66,0x66,0x00,0x00 ,0x00,0x18,0x00,0x00,0x18,0x18,0x00,0x18,0x00,0x00 ,0x00,0x66,0x00,0x66,0x66,0x00,0x66,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0xFF ,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0xC0,0x00,0x00,0x00,0x00,0x00,0xF0,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00}
};

static inline unsigned char swap (unsigned char x)
{
asm volatile ("swap %0" : "=r" (x) : "0" (x));
return x;
}

int main(void)
{

unsigned char text[20][40];
unsigned char zeichen=0;
unsigned char temp;

for (unsigned char y=0;y<20;y++)
{
for (unsigned char x=0;x<40;x++)
text[y][x]=zeichen++;
}


DDRC=0x0F;
DDRB=0x07;

PORTB=(1<<FRAME)|(1<<LOAD);

while(1)
{
PORTB=(1<<FRAME)|(1<<CP);

for(unsigned char i =0; i<20;i++)
{
for(unsigned char j =0; j<12;j++)
{
for( unsigned char k =0; k<40;k++)
{
temp=pgm_read_byte(&schrift[j][ text[i][k] ]);

PORTB=(1<<CP);
PORTC=swap(temp); //ersten 4 Pixel
PORTB=0;
PORTB=(1<<CP); //zweiten 4 Pixel
PORTC=temp;
PORTB=0;

}
PORTB=(1<<LOAD);
}

}
PORTB=(1<<LOAD)|(1<<FRAME);

}


}

MagicWSmoke
21.04.2012, 18:30
Krass, wie hast du die 71,7 Hz berechnet?
Ich hab deinen Vorschlag durchgearbeitet, komm jetzt auf 71,6 Hz.
Ja, ist mir beim erneuten compilieren und simulieren dann auch aufgefallen dass es nur 71,6 sind, hab's dann nicht mehr so wichtig gefunden es zu ändern.
Geändert hab' ich trotzdem, schau nochmal mein voriges Post an, da bin ich schon ein wenig weiter :)

MisterMou
21.04.2012, 19:09
Ich kann noch einen nachlegen, 89,4 Hz bei -O2 Optimierung :)

Jedes Byte im Schrift-Array wurde woher schon geswapt, so können die ersten 4Pixel so eingelesen werden, und dann wird geswapt. So wird eine Variable gespart:)



/*
*B0-CP
*B1-LOAD
*B2-FRAME
*
*C0-D0
*C1-D1
*C2-D2
*C3-D3
*
*Mega8 @ 16MHz
*/

#define CP 0
#define LOAD 1
#define FRAME 2

#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>

//8x12 Schrift
//http://www.mikrocontroller.net/topic/54860
//Danke Benedikt!

const unsigned char schrift[12][256] PROGMEM ={
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0xC0,0x03,0x00,0x0C,0x83,0x00,0x03,0x00,0x0C,0x00 ,0x01,0x06,0x00,0x87,0xC0,0x00,0x00,0x03,0x00,0x0C ,0x03,0x0C,0x00,0x00,0xCC,0x00,0xC3,0x00,0x00,0xE0 ,0xC0,0xC0,0xC0,0xC0,0x00,0x67,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x55,0xD6,0x81 ,0x81,0xC0,0x87,0x06,0x00,0x66,0x66,0x00,0x66,0x00 ,0xCC,0x00,0x81,0x81,0x00,0x81,0x00,0x81,0x00,0x67 ,0x66,0x00,0x66,0x00,0x66,0x00,0x66,0x00,0xCC,0x00 ,0x87,0x00,0x06,0x00,0x81,0x87,0x00,0x81,0x00,0xFF ,0x00,0x00,0x06,0xFF,0x81,0x00,0x87,0x06,0x00,0x67 ,0x00,0x00,0x00,0x81,0x87,0x06,0x60,0x81,0x00,0xC0 ,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00},
{0x00,0xE7,0xE7,0x00,0x01,0x81,0x81,0x00,0x00,0x00 ,0x00,0xE3,0xC3,0x00,0xF7,0x00,0x08,0x20,0x81,0x66 ,0xF7,0xE7,0x00,0x81,0x81,0x81,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x03,0x66,0xC6,0x03,0x00,0x07,0x03 ,0xC0,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xC7,0x01 ,0x87,0x87,0xC0,0xCF,0x83,0xEF,0x87,0x87,0x00,0x00 ,0xC0,0x00,0x06,0x87,0xC7,0x03,0xCF,0xC3,0x8F,0xEF ,0xEF,0xC3,0xCC,0x87,0xE1,0x6E,0x0F,0x6C,0x6C,0x83 ,0xCF,0x83,0xCF,0x87,0xCF,0xCC,0xCC,0x6C,0xCC,0xCC ,0xEF,0xC3,0x00,0xC3,0x83,0x00,0x03,0x00,0x0E,0x00 ,0xC1,0x00,0x83,0x00,0x0E,0x81,0xC0,0x0E,0x87,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0xC1,0x81,0x0E,0x37,0x00,0x87,0xCC ,0x81,0x87,0xCC,0x06,0xC6,0x00,0x87,0xCC,0x06,0xC6 ,0x83,0x03,0xCC,0xCC,0x81,0x00,0xE3,0x87,0xCC,0x06 ,0x87,0x06,0x66,0xCC,0x00,0x00,0x66,0xA3,0x00,0xB1 ,0x81,0x81,0x81,0x81,0x67,0xCD,0x87,0x87,0x03,0x83 ,0x00,0x26,0x36,0x03,0x00,0x00,0x29,0xAA,0xBD,0x81 ,0x81,0x81,0xCC,0x03,0x83,0x66,0x66,0x00,0x66,0x03 ,0xCC,0x00,0x81,0x81,0x00,0x81,0x00,0x81,0x67,0xCD ,0x66,0x00,0x66,0x00,0x66,0x00,0x66,0x00,0x03,0x8F ,0xCC,0xCC,0x03,0x0F,0x03,0xCC,0xCC,0x81,0x00,0xFF ,0x00,0x81,0x03,0xFF,0x03,0x87,0xCC,0x03,0x67,0xCD ,0x00,0x00,0x0F,0x03,0xCC,0x03,0xC0,0x03,0xCF,0x81 ,0x00,0x00,0x00,0x33,0xF7,0xE7,0x00,0x00,0xC3,0xCC ,0x00,0x03,0x87,0x87,0x00,0x00},
{0x00,0x3C,0xFF,0x44,0x83,0xC3,0xC3,0x00,0x00,0x00 ,0x00,0xE0,0x66,0x00,0x36,0x81,0x0C,0x60,0xC3,0x66 ,0xBD,0x36,0x00,0xC3,0xC3,0x81,0x00,0x00,0x00,0x00 ,0x01,0xEF,0x00,0x87,0x66,0xC6,0xC7,0x00,0x8D,0x03 ,0x81,0x03,0x00,0x00,0x00,0x00,0x00,0x20,0x6C,0x03 ,0xCC,0xCC,0xC1,0x0C,0x06,0x6C,0xCC,0xCC,0x00,0x00 ,0x81,0x00,0x03,0xCC,0x6C,0x87,0x66,0x66,0xC6,0x26 ,0x66,0x66,0xCC,0x03,0xC0,0x66,0x06,0xEE,0x6C,0xC6 ,0x66,0xC6,0x66,0xCC,0x4B,0xCC,0xCC,0x6C,0xCC,0xCC ,0xEC,0x03,0x08,0xC0,0xC6,0x00,0x81,0x00,0x06,0x00 ,0xC0,0x00,0xC6,0x00,0x06,0x81,0xC0,0x06,0x81,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00 ,0x00,0x00,0x00,0x03,0x81,0x03,0xAD,0x00,0xCC,0xCC ,0x03,0xCC,0xCC,0x03,0xC6,0x00,0xCC,0xCC,0x03,0xC6 ,0xC6,0x81,0x00,0xCC,0x00,0x00,0x87,0xCC,0xCC,0x03 ,0xCC,0x03,0x66,0x00,0xCC,0x00,0x06,0xC6,0x00,0x81 ,0x03,0x03,0x03,0x03,0xCD,0x00,0xCC,0xCC,0x03,0x44 ,0x00,0x6E,0x6E,0x03,0x00,0x00,0x94,0x55,0x6B,0x81 ,0x81,0x00,0x00,0x00,0x44,0x66,0x66,0x00,0x66,0x03 ,0xCC,0x00,0x81,0x81,0x00,0x81,0x00,0x81,0xCD,0x00 ,0x66,0x00,0x66,0x00,0x66,0x00,0x66,0x00,0x8D,0xC6 ,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x81,0x00,0xFF ,0x00,0x81,0x00,0xFF,0x00,0xCC,0x00,0x00,0xCD,0x00 ,0x00,0x0E,0x06,0x00,0x00,0x00,0x81,0x00,0x00,0x03 ,0x00,0x03,0x00,0x66,0xBD,0x36,0x03,0x00,0x66,0x00 ,0x00,0x07,0xC0,0xC0,0x00,0x00},
{0x00,0x18,0xFF,0xEE,0xC7,0xC3,0xE7,0x00,0x00,0x00 ,0x00,0xA3,0x66,0x00,0xF7,0xBD,0x0E,0xE0,0xE7,0x66 ,0xBD,0x03,0x00,0xE7,0xE7,0x81,0x81,0x03,0x00,0x42 ,0x01,0xEF,0x00,0x87,0x66,0xEF,0x0C,0x4C,0x8D,0x03 ,0x03,0x81,0x66,0x81,0x00,0x00,0x00,0x60,0xEC,0x0F ,0xCC,0xC0,0xC3,0x0C,0x0C,0x6C,0xCC,0xCC,0x83,0x83 ,0x03,0x00,0x81,0xC0,0x6C,0xCC,0x66,0x6C,0x66,0x06 ,0x26,0x6C,0xCC,0x03,0xC0,0xC6,0x06,0xEF,0x6E,0x6C ,0x66,0x6C,0x66,0xCC,0x03,0xCC,0xCC,0x6C,0xCC,0xCC ,0x89,0x03,0x0C,0xC0,0x6C,0x00,0x00,0x00,0x06,0x00 ,0xC0,0x00,0x06,0x00,0x06,0x00,0x00,0x06,0x81,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00 ,0x00,0x00,0x00,0x03,0x81,0x03,0xEC,0x01,0xCC,0x00 ,0x00,0x00,0x00,0x00,0x83,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x03,0x87,0xCF,0x00,0x8D,0x00,0x00,0x00 ,0x00,0x00,0x00,0x87,0xCC,0x00,0x06,0xEC,0x00,0x81 ,0x00,0x00,0x00,0x00,0x00,0x6C,0xCC,0xCC,0x00,0xAB ,0x00,0xC6,0xC6,0x00,0x00,0x00,0x42,0xAA,0xD6,0x81 ,0x81,0x03,0x03,0x03,0xAB,0x66,0x66,0x00,0x66,0x87 ,0xCC,0x00,0x81,0x81,0x00,0x81,0x00,0x81,0x00,0x03 ,0x66,0x00,0x66,0x00,0x66,0x00,0x66,0x00,0xC0,0x66 ,0xCF,0xCF,0xCF,0x03,0x87,0x87,0x87,0x81,0x00,0xFF ,0x00,0x81,0x87,0xFF,0x87,0xCC,0x87,0x87,0x00,0x87 ,0x00,0x06,0xC7,0xCC,0xCC,0xCC,0x00,0xCC,0x00,0x00 ,0x00,0x03,0x00,0xC3,0xBD,0x03,0x03,0x00,0x66,0x00 ,0x00,0x03,0x83,0x81,0xCF,0x00},
{0x00,0x5A,0xBD,0xEF,0xEF,0xFF,0xFF,0x00,0x00,0x00 ,0x00,0x27,0x66,0x00,0x36,0xE7,0x8F,0xE3,0x81,0x66 ,0xBD,0xC3,0x00,0x81,0x81,0x81,0xC0,0x06,0x0C,0x66 ,0x83,0xC7,0x00,0x87,0x42,0xC6,0x0C,0xCC,0x07,0x06 ,0x06,0xC0,0xC3,0x81,0x00,0x00,0x00,0xC0,0xED,0x03 ,0xC0,0xC0,0xC6,0x0C,0x0C,0x60,0xCC,0xCC,0x83,0x83 ,0x06,0xE7,0xC0,0x81,0xED,0xCC,0x66,0x0C,0x66,0x46 ,0x46,0x0C,0xCC,0x03,0xC0,0xC6,0x06,0xEF,0x6F,0x6C ,0x66,0x6C,0x66,0x0C,0x03,0xCC,0xCC,0x6C,0x87,0xCC ,0x81,0x03,0x06,0xC0,0x00,0x00,0x00,0x87,0xC7,0x87 ,0xC7,0x87,0x06,0x67,0xC6,0x87,0xC3,0x66,0x81,0xCF ,0x8F,0x87,0xCD,0x67,0xCE,0x87,0xCF,0xCC,0xCC,0x6C ,0x6C,0x66,0xCF,0x06,0x81,0x81,0x00,0x83,0x0C,0xCC ,0x87,0x87,0x87,0x87,0x8F,0x87,0x87,0x87,0x87,0x87 ,0x87,0x87,0x87,0x87,0x4C,0xEF,0x8D,0x87,0x87,0x87 ,0xCC,0xCC,0x66,0xCC,0xCC,0x87,0x06,0x6D,0x00,0xE7 ,0x87,0x87,0x87,0xCC,0x8F,0x6E,0xE7,0x87,0x03,0xAA ,0x00,0x87,0x87,0x03,0x33,0xCC,0x29,0x55,0xBD,0x81 ,0x81,0x87,0x87,0x87,0x2A,0x6E,0x66,0xEF,0x6E,0xCC ,0x87,0x00,0x81,0x81,0x00,0x81,0x00,0x81,0x87,0x87 ,0x76,0xF7,0x7E,0xFF,0x76,0xFF,0x7E,0x00,0x60,0x66 ,0x4C,0x4C,0x4C,0x03,0x03,0x03,0x03,0x81,0x00,0xFF ,0x00,0x81,0x03,0xFF,0xCC,0x8D,0xCC,0xCC,0x87,0xCC ,0x66,0xC7,0x66,0xCC,0xCC,0xCC,0x66,0xCC,0x00,0x00 ,0x00,0xCF,0x00,0x8F,0xBD,0xC3,0x00,0x00,0x66,0x00 ,0x00,0x03,0xC0,0x03,0xCF,0x00},
{0x00,0x18,0xFF,0xEF,0xEF,0x7E,0xFF,0x00,0x00,0x00 ,0x00,0x8F,0xC3,0x00,0x36,0x7E,0xEF,0xEF,0x81,0x66 ,0xB7,0x66,0x00,0x81,0x81,0x81,0xEF,0xEF,0x0C,0xFF ,0x83,0xC7,0x00,0x03,0x00,0xC6,0x87,0x81,0xAF,0x00 ,0x06,0xC0,0xFF,0xE7,0x00,0xEF,0x00,0x81,0x6D,0x03 ,0x81,0x83,0xCC,0x8F,0x8F,0xC0,0x87,0xC7,0x00,0x00 ,0x0C,0x00,0x60,0x03,0xED,0xCC,0xC7,0x0C,0x66,0xC7 ,0xC7,0x0C,0xCF,0x03,0xC0,0x87,0x06,0x6D,0xEF,0x6C ,0xC7,0x6C,0xC7,0x07,0x03,0xCC,0xCC,0x6D,0x03,0x87 ,0x03,0x03,0x03,0xC0,0x00,0x00,0x00,0xC0,0x66,0xCC ,0xCC,0xCC,0x8F,0xCC,0x67,0x81,0xC0,0xC6,0x81,0x6D ,0xCC,0xCC,0x66,0xCC,0xE6,0xCC,0x06,0xCC,0xCC,0x6C ,0xC6,0x66,0xC8,0x0C,0x00,0xC0,0x00,0xC6,0x0C,0xCC ,0xCC,0xC0,0xC0,0xC0,0xC0,0xCC,0xCC,0xCC,0xCC,0x81 ,0x81,0x81,0xCC,0xCC,0x0C,0xB1,0xEF,0xCC,0xCC,0xCC ,0xCC,0xCC,0x66,0xCC,0xCC,0xCC,0xCF,0x6D,0x6C,0x81 ,0xC0,0x81,0xCC,0xCC,0xCC,0x6F,0x00,0x00,0x06,0xAB ,0xCF,0x03,0x73,0x03,0x66,0x66,0x94,0xAA,0x6B,0x81 ,0x8F,0xCC,0xCC,0xCC,0x2A,0x60,0x66,0x60,0x60,0x0C ,0xCF,0x8F,0xF1,0xFF,0xFF,0xF1,0xFF,0xFF,0xC0,0xCC ,0x06,0x06,0x00,0x00,0x06,0x00,0x00,0x6C,0xE7,0x6F ,0x0C,0x0C,0x0C,0xCF,0x03,0x03,0x03,0x8F,0xF1,0xFF ,0x00,0x00,0x03,0xFF,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC ,0x66,0x66,0x66,0xCC,0xCC,0xCC,0x66,0xCC,0x00,0x00 ,0xCF,0x03,0x8F,0x73,0xB7,0x66,0xCF,0x00,0xC3,0x00 ,0x81,0x87,0x87,0xC7,0xCF,0x00},
{0x00,0xDB,0x3C,0xEF,0xC7,0x7E,0xE7,0x00,0x00,0x00 ,0x00,0xCC,0x81,0x00,0x36,0x7E,0x8F,0xE3,0x81,0x00 ,0xB1,0x66,0x00,0x81,0x81,0x81,0xC0,0x06,0x0C,0x66 ,0xC7,0x83,0x00,0x03,0x00,0xC6,0xC0,0x03,0xED,0x00 ,0x06,0xC0,0xC3,0x81,0x00,0x00,0x00,0x03,0x6F,0x03 ,0x03,0xC0,0xEF,0xC0,0xCC,0x81,0xCC,0x81,0x00,0x00 ,0x06,0xE7,0xC0,0x03,0xED,0xCF,0x66,0x0C,0x66,0x46 ,0x46,0xEC,0xCC,0x03,0xCC,0xC6,0x26,0x6C,0xED,0x6C ,0x06,0xEC,0xC6,0x81,0x03,0xCC,0xCC,0x6D,0x87,0x03 ,0x06,0x03,0x81,0xC0,0x00,0x00,0x00,0xC7,0x66,0x0C ,0xCC,0xCF,0x06,0xCC,0x66,0x81,0xC0,0x87,0x81,0x6D ,0xCC,0xCC,0x66,0xCC,0x67,0x06,0x06,0xCC,0xCC,0x6D ,0x83,0x66,0x81,0x06,0x81,0x81,0x00,0x6C,0x0C,0xCC ,0xCF,0xC7,0xC7,0xC7,0xC7,0x0C,0xCF,0xCF,0xCF,0x81 ,0x81,0x81,0xCC,0xCC,0x8F,0xF7,0x8D,0xCC,0xCC,0xCC ,0xCC,0xCC,0x66,0xCC,0xCC,0xCD,0x06,0x6D,0xC6,0x81 ,0xC7,0x81,0xCC,0xCC,0xCC,0xED,0xEF,0xEF,0x0C,0x2B ,0xC0,0xE6,0xF6,0x87,0xCC,0x33,0x42,0x55,0xD6,0x81 ,0x81,0xCC,0xCC,0xCC,0x2A,0x60,0x66,0x60,0x60,0x0C ,0x03,0x81,0x00,0x00,0x81,0x81,0x00,0x81,0xC7,0xCC ,0x06,0x06,0x00,0x00,0x06,0x00,0x00,0xC7,0x6C,0x66 ,0x8F,0x8F,0x8F,0x00,0x03,0x03,0x03,0x00,0x81,0xFF ,0xFF,0x81,0x03,0x00,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC ,0x66,0x66,0x66,0xCC,0xCC,0xCC,0x66,0x87,0x00,0x00 ,0x00,0x03,0x00,0xF6,0xB1,0x66,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0xCF,0x00},
{0x00,0x99,0x7E,0xC7,0x83,0x81,0x81,0x00,0x00,0x00 ,0x00,0xCC,0xE7,0x00,0x76,0xE7,0x0E,0xE0,0xE7,0x00 ,0xB1,0xC3,0xEF,0xE7,0x81,0xE7,0x81,0x03,0xEF,0x42 ,0xC7,0x83,0x00,0x00,0x00,0xEF,0xC0,0x06,0xCC,0x00 ,0x03,0x81,0x66,0x81,0x00,0x00,0x00,0x06,0x6E,0x03 ,0x06,0xC0,0xC0,0xC0,0xCC,0x03,0xCC,0x81,0x83,0x83 ,0x03,0x00,0x81,0x00,0x0C,0xCC,0x66,0x6C,0x66,0x06 ,0x06,0x6C,0xCC,0x03,0xCC,0xC6,0x66,0x6C,0xEC,0x6C ,0x06,0xED,0x66,0xCC,0x03,0xCC,0xCC,0xC6,0xCC,0x03 ,0x26,0x03,0xC0,0xC0,0x00,0x00,0x00,0xCC,0x66,0x0C ,0xCC,0x0C,0x06,0xCC,0x66,0x81,0xC0,0xC6,0x81,0x6D ,0xCC,0xCC,0x66,0xCC,0x06,0x81,0x06,0xCC,0xCC,0x6D ,0x83,0x66,0x06,0x03,0x81,0x03,0x00,0x6C,0xCC,0xCC ,0x0C,0xCC,0xCC,0xCC,0xCC,0x0C,0x0C,0x0C,0x0C,0x81 ,0x81,0x81,0xCF,0xCF,0x0C,0x8D,0x8D,0xCC,0xCC,0xCC ,0xCC,0xCC,0x66,0xCC,0xCC,0xCE,0x06,0x6E,0x83,0x81 ,0xCC,0x81,0xCC,0xCC,0xCC,0xEC,0x00,0x00,0x0C,0xAA ,0xC0,0x3C,0xBD,0x87,0xCC,0x33,0x29,0xAA,0xBD,0x81 ,0x81,0xCF,0xCF,0xCF,0xAB,0x6E,0x66,0x6E,0xEF,0xCC ,0xCF,0x81,0x00,0x00,0x81,0x81,0x00,0x81,0xCC,0xCF ,0xF7,0x76,0xFF,0x7E,0x76,0xFF,0x7E,0xC6,0x6C,0x66 ,0x0C,0x0C,0x0C,0x00,0x03,0x03,0x03,0x00,0x81,0xFF ,0xFF,0x81,0x03,0x00,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC ,0x66,0xC7,0xC7,0xCC,0xCC,0xCC,0x66,0x03,0x00,0x00 ,0x00,0x00,0x00,0xBD,0xB1,0xC3,0x03,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0xCF,0x00},
{0x00,0x3C,0xFF,0x83,0x01,0x81,0x81,0x00,0x00,0x00 ,0x00,0xCC,0x81,0x00,0x7E,0xBD,0x0C,0x60,0xC3,0x66 ,0xB1,0xC0,0xEF,0xC3,0x81,0xC3,0x00,0x00,0x00,0x00 ,0xEF,0x01,0x00,0x03,0x00,0xC6,0x8F,0xCC,0xCD,0x00 ,0x81,0x03,0x00,0x00,0x83,0x00,0x83,0x0C,0x6C,0x03 ,0xCC,0xCC,0xC0,0xCC,0xCC,0x03,0xCC,0x03,0x83,0x83 ,0x81,0x00,0x03,0x03,0x0C,0xCC,0x66,0x66,0xC6,0x26 ,0x06,0x66,0xCC,0x03,0xCC,0x66,0x66,0x6C,0x6C,0xC6 ,0x06,0xC7,0x66,0xCC,0x03,0xCC,0x87,0xC6,0xCC,0x03 ,0x6C,0x03,0x60,0xC0,0x00,0x00,0x00,0xCC,0x66,0xCC ,0xCC,0xCC,0x06,0xC7,0x66,0x81,0xC0,0x66,0x81,0x6D ,0xCC,0xCC,0x66,0xCC,0x06,0xCC,0xC6,0xCC,0x87,0xC6 ,0xC6,0xC3,0x4C,0x03,0x81,0x03,0x00,0xEF,0xCC,0xCC ,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0x0C,0x0C,0x0C,0x81 ,0x81,0x81,0xCC,0xCC,0x4C,0x8D,0x8D,0xCC,0xCC,0xCC ,0xCC,0xCC,0xC3,0xCC,0xCC,0xCC,0x0C,0xC6,0xC6,0x8D ,0xCC,0x81,0xCC,0xCC,0xCC,0x6C,0x00,0x00,0xCC,0x44 ,0xC0,0x68,0x3B,0x87,0x66,0x66,0x94,0x55,0x6B,0x81 ,0x81,0xCC,0xCC,0xCC,0x44,0x66,0x66,0x66,0x00,0x87 ,0x03,0x81,0x00,0x00,0x81,0x81,0x00,0x81,0xCC,0xCC ,0x00,0x66,0x00,0x66,0x66,0x00,0x66,0xC7,0x6C,0xC6 ,0x4C,0x4C,0x4C,0x00,0x03,0x03,0x03,0x00,0x81,0xFF ,0xFF,0x81,0x03,0x00,0xCC,0x8F,0xCC,0xCC,0xCC,0xCC ,0x66,0x06,0x06,0xCC,0xCC,0xCC,0xC3,0x03,0x00,0x00 ,0x00,0xCF,0x8F,0x3B,0xB1,0xC0,0x03,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0xCF,0x00},
{0x00,0xE7,0xE7,0x01,0x00,0xE7,0xE7,0x00,0x00,0x00 ,0x00,0x87,0x81,0x00,0x6E,0x81,0x08,0x20,0x81,0x66 ,0xB1,0x6C,0xEF,0x81,0x81,0x81,0x00,0x00,0x00,0x00 ,0xEF,0x01,0x00,0x03,0x00,0xC6,0x03,0xC8,0x67,0x00 ,0xC0,0x06,0x00,0x00,0x83,0x00,0x83,0x08,0xC7,0xCF ,0xCF,0x87,0xE1,0x87,0x87,0x03,0x87,0x07,0x00,0x81 ,0xC0,0x00,0x06,0x03,0xC7,0xCC,0xCF,0xC3,0x8F,0xEF ,0x0F,0xE3,0xCC,0x87,0x87,0x6E,0xEF,0x6C,0x6C,0x83 ,0x0F,0xC0,0x6E,0x87,0x87,0x87,0x03,0xC6,0xCC,0x87 ,0xEF,0xC3,0x20,0xC3,0x00,0x00,0x00,0x67,0xCD,0x87 ,0x67,0x87,0x0F,0xC0,0x6E,0xE7,0xCC,0x6E,0xE7,0x6C ,0xCC,0x87,0xC7,0xC7,0x0F,0x87,0x83,0x67,0x03,0xC6 ,0x6C,0xC0,0xCF,0xC1,0x81,0x0E,0x00,0x00,0x87,0x67 ,0x87,0x67,0x67,0x67,0x67,0x87,0xC7,0xC7,0xC7,0xE7 ,0xE7,0xE7,0xCC,0xCC,0xCF,0xFE,0xED,0x87,0x87,0x87 ,0x67,0x67,0xC0,0x87,0x87,0x87,0xEF,0x8B,0x6C,0x07 ,0x67,0xE7,0x87,0x67,0xCC,0x6C,0x00,0x00,0x87,0x83 ,0x00,0xC0,0xF3,0x03,0x33,0xCC,0x42,0xAA,0xD6,0x81 ,0x81,0xCC,0xCC,0xCC,0x83,0x66,0x66,0x66,0x00,0x03 ,0x03,0x81,0x00,0x00,0x81,0x81,0x00,0x81,0x67,0xCC ,0x00,0x66,0x00,0x66,0x66,0x00,0x66,0x6C,0xC7,0x8F ,0xCF,0xCF,0xCF,0x00,0x87,0x87,0x87,0x00,0x81,0xFF ,0xFF,0x81,0x87,0x00,0x87,0x0C,0x87,0x87,0x87,0x87 ,0xB7,0x0F,0x0F,0x87,0x87,0x87,0xC0,0x87,0x00,0x00 ,0x00,0x00,0x00,0xF3,0xB1,0x6C,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00},
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x00,0x00 ,0x00,0xE7,0x00,0xE7,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0xE1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0xCC,0x00,0x00,0xCC,0x00,0x00,0x00 ,0x00,0x00,0x06,0xC0,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x81,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00 ,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x81,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0xF1,0x30,0x00,0x00,0x00,0x29,0x55,0xBD,0x81 ,0x81,0x00,0x00,0x00,0x00,0x66,0x66,0x66,0x00,0x03 ,0x00,0x81,0x00,0x00,0x81,0x81,0x00,0x81,0x00,0x00 ,0x00,0x66,0x00,0x66,0x66,0x00,0x66,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x81,0xFF ,0xFF,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x00 ,0x06,0x00,0x00,0x00,0x00,0x00,0x81,0x00,0x00,0x00 ,0x00,0x00,0x00,0x30,0x00,0xE7,0x00,0x03,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00},
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x87,0x00,0x00,0x87,0x00,0x00,0x00 ,0x00,0x00,0x0F,0xE1,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00 ,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x94,0xAA,0x6B,0x81 ,0x81,0x00,0x00,0x00,0x00,0x66,0x66,0x66,0x00,0x00 ,0x00,0x81,0x00,0x00,0x81,0x81,0x00,0x81,0x00,0x00 ,0x00,0x66,0x00,0x66,0x66,0x00,0x66,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x81,0xFF ,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x0C,0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00}
};


int main(void)
{

unsigned char text[20][40];
unsigned char zeichen=0;
unsigned char temp;

for (unsigned char y=0;y<20;y++)
{
for (unsigned char x=0;x<40;x++)
text[y][x]=zeichen++;
}


DDRC=0x0F;
DDRB=0x07;


PORTB=(1<<FRAME)|(1<<LOAD);

unsigned char *cptr;

while(1)
{
PORTB=(1<<FRAME)|(1<<CP);

for(unsigned char i =0; i<20;i++)
{
for(unsigned char j =0; j<12;j++)
{
cptr = &schrift[j][0];
for( unsigned char k =0; k<40;k++)
{
temp=pgm_read_byte(cptr + text[i][k]);

PORTB=(1<<CP);
PORTC=temp; //ersten 4 Pixel
PORTB=0;
PORTB=(1<<CP);
asm volatile ("swap %0" : "=r" (temp) : "0" (temp));
PORTC=temp; //zweiten 4 Pixel
PORTB=0;

}
PORTB=(1<<LOAD);
}

}
PORTB=(1<<LOAD)|(1<<FRAME);

}


}

Nebenbei, ich probiere die Schaltung immer aus und messe mit dem Oszi nach, so kann man sichergehen, dass das Display nachkommt, denn an die Spezikikationen im Datenblatt halten wir uns nichtmehr :D

Ich habs gerade mal mit nem größeren Quarz getestet, gute 18MHz das macht dann über 102Hz :D
Aber das Ziel sind 16Mhz ;)

MagicWSmoke
21.04.2012, 19:41
Ich kann noch einen nachlegen, 89,4 Hz bei -O2 Optimierung
Da kommt bei mir nur 84,8Hz raus, mit -Os sind's 86,6Hz, da werden dann evtl. die Compilerversion und Makefileoptionen Einfluss haben.

Die innerste und damit wichtigste Loop sieht jetzt so aus, da wüsste ich nicht mehr viel zu optimieren:

L0673:
ld r24,X+
movw r30,r18
add r30,r24
adc r31,r1
lpm r30,Z
out p18,r25
out p15,r30
out p18,r1
out p18,r25
swap r30
out p15,r30
out p18,r1
cp r26,r16
cpc r27,r17
brne L0673

MisterMou
21.04.2012, 19:52
Hmm, von asm hab ich nicht so viel Ahnung, sonst hätte ich gleich alles so geschrieben :)

Ich habe die neuste AVR-Studio 5 Version instaliert ;)

MagicWSmoke
21.04.2012, 20:00
Hmm, von asm hab ich nicht so viel Ahnung, sonst hätte ich gleich alles so geschrieben :)
So 'ne Routine in ASM ist eigentlich kein Problem, nur beim C Inline Assembler hab' ich so meine Bauchschmerzen.
Aber es lesen zu können reicht hier ja auch schon. Die Rechnerei die der Compiler beim Progmem Zugriff veranstaltet hatte, sagte mir dass es besser ist dort einen Pointer zu verwenden.

Ich habe die neuste AVR-Studio 5 Version instaliert ;)
Und ich die 4er Version.

MisterMou
22.04.2012, 10:39
Die innerste und damit wichtigste Loop sieht jetzt so aus, da wüsste ich nicht mehr viel zu optimieren:

L0673:
ld r24,X+
movw r30,r18
add r30,r24
adc r31,r1
lpm r30,Z
out p18,r25
out p15,r30
out p18,r1
out p18,r25
swap r30
out p15,r30
out p18,r1
cp r26,r16
cpc r27,r17
brne L0673


Was macht diese Zeile?


adc r31,r1

r1 müsste doch 0 sein...
Was der Befehl macht weiß ich(denke ich), aber warum?
r31 verändert sich doch nicht, welche Rolle spielt das Carry?

sternst
22.04.2012, 11:04
Was macht diese Zeile?Sie addiert den Übertrag zu R31, der möglicherweise bei der Zeile vorher entstanden ist.


add r30,r24
adc r31,r1R24 wird zum 16-Bit Wert in R30:31 addiert.

MagicWSmoke
22.04.2012, 11:07
Was macht diese Zeile?

adc r31,r1
Sie sorgt dafür, wie Du richtig erkannt hast, dass eine 0 addiert und das Carry übernommen wird.

r31 verändert sich doch nicht, welche Rolle spielt das Carry?
Doch, R31 muss sich ändern, da der Fontblock nicht aligned ist, siehst Du wenn Du Dir den Pointer ausgeben lässt, bei mir startete der bei 0x26.

Wenn Du dem Compiler klarmachen kannst, dass er für den Font auf ein Alignement auf einen 256 Byte Block macht, dann sparst Du Dir den ADC, 1 Takt, mehr aber nicht, da das MOVW gleichviel wie ein MOV braucht.
Und sollte Dir der Code nicht zu hässlich werden und wenn Du genügend Flash über hast, dann kannst Du diese innere Schleife entrollen und einfach 40 mal wiederholen, das spart Dir dann mehr, nämlich 2 Takte pro Durchlauf.

MisterMou
22.04.2012, 13:31
Ahh, genau, der Flash hat ja 16Bit Adressen und das Array liegt bestimmt nicht nur in einem 256Byte Block, damit ist alles klar:)
Ich sag ja, asm ist nicht meine Welt.

Das mit dem Entrollen hatte ich gestern schon mal probiert, dabei wurde "k" durch Konstanten ersetzt. Das Ergebnis war langsamer o.O

http://www.abload.de/img/img_509132kuf.jpg (http://www.abload.de/image.php?img=img_509132kuf.jpg)


http://www.myvideo.de/watch/8517232/AVR_Mega8_GLCD_Textmodus

MagicWSmoke
23.04.2012, 00:08
So mag ich das, wenn da passende Grüße kommen :p

Das mit dem Entrollen hatte ich gestern schon mal probiert, dabei wurde "k" durch Konstanten ersetzt. Das Ergebnis war langsamer o.O
Langsamer muss es nicht zwingend sein, mit Konstanten wird's aber nix. Nachdem der Compiler in mancher Beziehung extrem stur ist, hab' ich's nochmal anders versucht.
Wenn's geht, was ich doch hoffe, zumindest die Simulation sah gut aus, so wären das 107Hz@16MHz. Optimierung -Os.

/*
*B0-CP
*B1-LOAD
*B2-FRAME
*
*C0-D0
*C1-D1
*C2-D2
*C3-D3
*
*Mega8 @ 16MHz
*/

#define CP 0
#define LOAD 1
#define FRAME 2

#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>

//8x12 Schrift
//http://www.mikrocontroller.net/topic/54860
//Danke Benedikt!

const unsigned char schrift[12][256] PROGMEM ={
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0xC0,0x03,0x00,0x0C,0x83,0x00,0x03,0x00,0x0C,0x00 ,0x01,0x06,0x00,0x87,0xC0,0x00,0x00,0x03,0x00,0x0C ,0x03,0x0C,0x00,0x00,0xCC,0x00,0xC3,0x00,0x00,0xE0 ,0xC0,0xC0,0xC0,0xC0,0x00,0x67,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x55,0xD6,0x81 ,0x81,0xC0,0x87,0x06,0x00,0x66,0x66,0x00,0x66,0x00 ,0xCC,0x00,0x81,0x81,0x00,0x81,0x00,0x81,0x00,0x67 ,0x66,0x00,0x66,0x00,0x66,0x00,0x66,0x00,0xCC,0x00 ,0x87,0x00,0x06,0x00,0x81,0x87,0x00,0x81,0x00,0xFF ,0x00,0x00,0x06,0xFF,0x81,0x00,0x87,0x06,0x00,0x67 ,0x00,0x00,0x00,0x81,0x87,0x06,0x60,0x81,0x00,0xC0 ,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00},
{0x00,0xE7,0xE7,0x00,0x01,0x81,0x81,0x00,0x00,0x00 ,0x00,0xE3,0xC3,0x00,0xF7,0x00,0x08,0x20,0x81,0x66 ,0xF7,0xE7,0x00,0x81,0x81,0x81,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x03,0x66,0xC6,0x03,0x00,0x07,0x03 ,0xC0,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xC7,0x01 ,0x87,0x87,0xC0,0xCF,0x83,0xEF,0x87,0x87,0x00,0x00 ,0xC0,0x00,0x06,0x87,0xC7,0x03,0xCF,0xC3,0x8F,0xEF ,0xEF,0xC3,0xCC,0x87,0xE1,0x6E,0x0F,0x6C,0x6C,0x83 ,0xCF,0x83,0xCF,0x87,0xCF,0xCC,0xCC,0x6C,0xCC,0xCC ,0xEF,0xC3,0x00,0xC3,0x83,0x00,0x03,0x00,0x0E,0x00 ,0xC1,0x00,0x83,0x00,0x0E,0x81,0xC0,0x0E,0x87,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0xC1,0x81,0x0E,0x37,0x00,0x87,0xCC ,0x81,0x87,0xCC,0x06,0xC6,0x00,0x87,0xCC,0x06,0xC6 ,0x83,0x03,0xCC,0xCC,0x81,0x00,0xE3,0x87,0xCC,0x06 ,0x87,0x06,0x66,0xCC,0x00,0x00,0x66,0xA3,0x00,0xB1 ,0x81,0x81,0x81,0x81,0x67,0xCD,0x87,0x87,0x03,0x83 ,0x00,0x26,0x36,0x03,0x00,0x00,0x29,0xAA,0xBD,0x81 ,0x81,0x81,0xCC,0x03,0x83,0x66,0x66,0x00,0x66,0x03 ,0xCC,0x00,0x81,0x81,0x00,0x81,0x00,0x81,0x67,0xCD ,0x66,0x00,0x66,0x00,0x66,0x00,0x66,0x00,0x03,0x8F ,0xCC,0xCC,0x03,0x0F,0x03,0xCC,0xCC,0x81,0x00,0xFF ,0x00,0x81,0x03,0xFF,0x03,0x87,0xCC,0x03,0x67,0xCD ,0x00,0x00,0x0F,0x03,0xCC,0x03,0xC0,0x03,0xCF,0x81 ,0x00,0x00,0x00,0x33,0xF7,0xE7,0x00,0x00,0xC3,0xCC ,0x00,0x03,0x87,0x87,0x00,0x00},
{0x00,0x3C,0xFF,0x44,0x83,0xC3,0xC3,0x00,0x00,0x00 ,0x00,0xE0,0x66,0x00,0x36,0x81,0x0C,0x60,0xC3,0x66 ,0xBD,0x36,0x00,0xC3,0xC3,0x81,0x00,0x00,0x00,0x00 ,0x01,0xEF,0x00,0x87,0x66,0xC6,0xC7,0x00,0x8D,0x03 ,0x81,0x03,0x00,0x00,0x00,0x00,0x00,0x20,0x6C,0x03 ,0xCC,0xCC,0xC1,0x0C,0x06,0x6C,0xCC,0xCC,0x00,0x00 ,0x81,0x00,0x03,0xCC,0x6C,0x87,0x66,0x66,0xC6,0x26 ,0x66,0x66,0xCC,0x03,0xC0,0x66,0x06,0xEE,0x6C,0xC6 ,0x66,0xC6,0x66,0xCC,0x4B,0xCC,0xCC,0x6C,0xCC,0xCC ,0xEC,0x03,0x08,0xC0,0xC6,0x00,0x81,0x00,0x06,0x00 ,0xC0,0x00,0xC6,0x00,0x06,0x81,0xC0,0x06,0x81,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00 ,0x00,0x00,0x00,0x03,0x81,0x03,0xAD,0x00,0xCC,0xCC ,0x03,0xCC,0xCC,0x03,0xC6,0x00,0xCC,0xCC,0x03,0xC6 ,0xC6,0x81,0x00,0xCC,0x00,0x00,0x87,0xCC,0xCC,0x03 ,0xCC,0x03,0x66,0x00,0xCC,0x00,0x06,0xC6,0x00,0x81 ,0x03,0x03,0x03,0x03,0xCD,0x00,0xCC,0xCC,0x03,0x44 ,0x00,0x6E,0x6E,0x03,0x00,0x00,0x94,0x55,0x6B,0x81 ,0x81,0x00,0x00,0x00,0x44,0x66,0x66,0x00,0x66,0x03 ,0xCC,0x00,0x81,0x81,0x00,0x81,0x00,0x81,0xCD,0x00 ,0x66,0x00,0x66,0x00,0x66,0x00,0x66,0x00,0x8D,0xC6 ,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x81,0x00,0xFF ,0x00,0x81,0x00,0xFF,0x00,0xCC,0x00,0x00,0xCD,0x00 ,0x00,0x0E,0x06,0x00,0x00,0x00,0x81,0x00,0x00,0x03 ,0x00,0x03,0x00,0x66,0xBD,0x36,0x03,0x00,0x66,0x00 ,0x00,0x07,0xC0,0xC0,0x00,0x00},
{0x00,0x18,0xFF,0xEE,0xC7,0xC3,0xE7,0x00,0x00,0x00 ,0x00,0xA3,0x66,0x00,0xF7,0xBD,0x0E,0xE0,0xE7,0x66 ,0xBD,0x03,0x00,0xE7,0xE7,0x81,0x81,0x03,0x00,0x42 ,0x01,0xEF,0x00,0x87,0x66,0xEF,0x0C,0x4C,0x8D,0x03 ,0x03,0x81,0x66,0x81,0x00,0x00,0x00,0x60,0xEC,0x0F ,0xCC,0xC0,0xC3,0x0C,0x0C,0x6C,0xCC,0xCC,0x83,0x83 ,0x03,0x00,0x81,0xC0,0x6C,0xCC,0x66,0x6C,0x66,0x06 ,0x26,0x6C,0xCC,0x03,0xC0,0xC6,0x06,0xEF,0x6E,0x6C ,0x66,0x6C,0x66,0xCC,0x03,0xCC,0xCC,0x6C,0xCC,0xCC ,0x89,0x03,0x0C,0xC0,0x6C,0x00,0x00,0x00,0x06,0x00 ,0xC0,0x00,0x06,0x00,0x06,0x00,0x00,0x06,0x81,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00 ,0x00,0x00,0x00,0x03,0x81,0x03,0xEC,0x01,0xCC,0x00 ,0x00,0x00,0x00,0x00,0x83,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x03,0x87,0xCF,0x00,0x8D,0x00,0x00,0x00 ,0x00,0x00,0x00,0x87,0xCC,0x00,0x06,0xEC,0x00,0x81 ,0x00,0x00,0x00,0x00,0x00,0x6C,0xCC,0xCC,0x00,0xAB ,0x00,0xC6,0xC6,0x00,0x00,0x00,0x42,0xAA,0xD6,0x81 ,0x81,0x03,0x03,0x03,0xAB,0x66,0x66,0x00,0x66,0x87 ,0xCC,0x00,0x81,0x81,0x00,0x81,0x00,0x81,0x00,0x03 ,0x66,0x00,0x66,0x00,0x66,0x00,0x66,0x00,0xC0,0x66 ,0xCF,0xCF,0xCF,0x03,0x87,0x87,0x87,0x81,0x00,0xFF ,0x00,0x81,0x87,0xFF,0x87,0xCC,0x87,0x87,0x00,0x87 ,0x00,0x06,0xC7,0xCC,0xCC,0xCC,0x00,0xCC,0x00,0x00 ,0x00,0x03,0x00,0xC3,0xBD,0x03,0x03,0x00,0x66,0x00 ,0x00,0x03,0x83,0x81,0xCF,0x00},
{0x00,0x5A,0xBD,0xEF,0xEF,0xFF,0xFF,0x00,0x00,0x00 ,0x00,0x27,0x66,0x00,0x36,0xE7,0x8F,0xE3,0x81,0x66 ,0xBD,0xC3,0x00,0x81,0x81,0x81,0xC0,0x06,0x0C,0x66 ,0x83,0xC7,0x00,0x87,0x42,0xC6,0x0C,0xCC,0x07,0x06 ,0x06,0xC0,0xC3,0x81,0x00,0x00,0x00,0xC0,0xED,0x03 ,0xC0,0xC0,0xC6,0x0C,0x0C,0x60,0xCC,0xCC,0x83,0x83 ,0x06,0xE7,0xC0,0x81,0xED,0xCC,0x66,0x0C,0x66,0x46 ,0x46,0x0C,0xCC,0x03,0xC0,0xC6,0x06,0xEF,0x6F,0x6C ,0x66,0x6C,0x66,0x0C,0x03,0xCC,0xCC,0x6C,0x87,0xCC ,0x81,0x03,0x06,0xC0,0x00,0x00,0x00,0x87,0xC7,0x87 ,0xC7,0x87,0x06,0x67,0xC6,0x87,0xC3,0x66,0x81,0xCF ,0x8F,0x87,0xCD,0x67,0xCE,0x87,0xCF,0xCC,0xCC,0x6C ,0x6C,0x66,0xCF,0x06,0x81,0x81,0x00,0x83,0x0C,0xCC ,0x87,0x87,0x87,0x87,0x8F,0x87,0x87,0x87,0x87,0x87 ,0x87,0x87,0x87,0x87,0x4C,0xEF,0x8D,0x87,0x87,0x87 ,0xCC,0xCC,0x66,0xCC,0xCC,0x87,0x06,0x6D,0x00,0xE7 ,0x87,0x87,0x87,0xCC,0x8F,0x6E,0xE7,0x87,0x03,0xAA ,0x00,0x87,0x87,0x03,0x33,0xCC,0x29,0x55,0xBD,0x81 ,0x81,0x87,0x87,0x87,0x2A,0x6E,0x66,0xEF,0x6E,0xCC ,0x87,0x00,0x81,0x81,0x00,0x81,0x00,0x81,0x87,0x87 ,0x76,0xF7,0x7E,0xFF,0x76,0xFF,0x7E,0x00,0x60,0x66 ,0x4C,0x4C,0x4C,0x03,0x03,0x03,0x03,0x81,0x00,0xFF ,0x00,0x81,0x03,0xFF,0xCC,0x8D,0xCC,0xCC,0x87,0xCC ,0x66,0xC7,0x66,0xCC,0xCC,0xCC,0x66,0xCC,0x00,0x00 ,0x00,0xCF,0x00,0x8F,0xBD,0xC3,0x00,0x00,0x66,0x00 ,0x00,0x03,0xC0,0x03,0xCF,0x00},
{0x00,0x18,0xFF,0xEF,0xEF,0x7E,0xFF,0x00,0x00,0x00 ,0x00,0x8F,0xC3,0x00,0x36,0x7E,0xEF,0xEF,0x81,0x66 ,0xB7,0x66,0x00,0x81,0x81,0x81,0xEF,0xEF,0x0C,0xFF ,0x83,0xC7,0x00,0x03,0x00,0xC6,0x87,0x81,0xAF,0x00 ,0x06,0xC0,0xFF,0xE7,0x00,0xEF,0x00,0x81,0x6D,0x03 ,0x81,0x83,0xCC,0x8F,0x8F,0xC0,0x87,0xC7,0x00,0x00 ,0x0C,0x00,0x60,0x03,0xED,0xCC,0xC7,0x0C,0x66,0xC7 ,0xC7,0x0C,0xCF,0x03,0xC0,0x87,0x06,0x6D,0xEF,0x6C ,0xC7,0x6C,0xC7,0x07,0x03,0xCC,0xCC,0x6D,0x03,0x87 ,0x03,0x03,0x03,0xC0,0x00,0x00,0x00,0xC0,0x66,0xCC ,0xCC,0xCC,0x8F,0xCC,0x67,0x81,0xC0,0xC6,0x81,0x6D ,0xCC,0xCC,0x66,0xCC,0xE6,0xCC,0x06,0xCC,0xCC,0x6C ,0xC6,0x66,0xC8,0x0C,0x00,0xC0,0x00,0xC6,0x0C,0xCC ,0xCC,0xC0,0xC0,0xC0,0xC0,0xCC,0xCC,0xCC,0xCC,0x81 ,0x81,0x81,0xCC,0xCC,0x0C,0xB1,0xEF,0xCC,0xCC,0xCC ,0xCC,0xCC,0x66,0xCC,0xCC,0xCC,0xCF,0x6D,0x6C,0x81 ,0xC0,0x81,0xCC,0xCC,0xCC,0x6F,0x00,0x00,0x06,0xAB ,0xCF,0x03,0x73,0x03,0x66,0x66,0x94,0xAA,0x6B,0x81 ,0x8F,0xCC,0xCC,0xCC,0x2A,0x60,0x66,0x60,0x60,0x0C ,0xCF,0x8F,0xF1,0xFF,0xFF,0xF1,0xFF,0xFF,0xC0,0xCC ,0x06,0x06,0x00,0x00,0x06,0x00,0x00,0x6C,0xE7,0x6F ,0x0C,0x0C,0x0C,0xCF,0x03,0x03,0x03,0x8F,0xF1,0xFF ,0x00,0x00,0x03,0xFF,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC ,0x66,0x66,0x66,0xCC,0xCC,0xCC,0x66,0xCC,0x00,0x00 ,0xCF,0x03,0x8F,0x73,0xB7,0x66,0xCF,0x00,0xC3,0x00 ,0x81,0x87,0x87,0xC7,0xCF,0x00},
{0x00,0xDB,0x3C,0xEF,0xC7,0x7E,0xE7,0x00,0x00,0x00 ,0x00,0xCC,0x81,0x00,0x36,0x7E,0x8F,0xE3,0x81,0x00 ,0xB1,0x66,0x00,0x81,0x81,0x81,0xC0,0x06,0x0C,0x66 ,0xC7,0x83,0x00,0x03,0x00,0xC6,0xC0,0x03,0xED,0x00 ,0x06,0xC0,0xC3,0x81,0x00,0x00,0x00,0x03,0x6F,0x03 ,0x03,0xC0,0xEF,0xC0,0xCC,0x81,0xCC,0x81,0x00,0x00 ,0x06,0xE7,0xC0,0x03,0xED,0xCF,0x66,0x0C,0x66,0x46 ,0x46,0xEC,0xCC,0x03,0xCC,0xC6,0x26,0x6C,0xED,0x6C ,0x06,0xEC,0xC6,0x81,0x03,0xCC,0xCC,0x6D,0x87,0x03 ,0x06,0x03,0x81,0xC0,0x00,0x00,0x00,0xC7,0x66,0x0C ,0xCC,0xCF,0x06,0xCC,0x66,0x81,0xC0,0x87,0x81,0x6D ,0xCC,0xCC,0x66,0xCC,0x67,0x06,0x06,0xCC,0xCC,0x6D ,0x83,0x66,0x81,0x06,0x81,0x81,0x00,0x6C,0x0C,0xCC ,0xCF,0xC7,0xC7,0xC7,0xC7,0x0C,0xCF,0xCF,0xCF,0x81 ,0x81,0x81,0xCC,0xCC,0x8F,0xF7,0x8D,0xCC,0xCC,0xCC ,0xCC,0xCC,0x66,0xCC,0xCC,0xCD,0x06,0x6D,0xC6,0x81 ,0xC7,0x81,0xCC,0xCC,0xCC,0xED,0xEF,0xEF,0x0C,0x2B ,0xC0,0xE6,0xF6,0x87,0xCC,0x33,0x42,0x55,0xD6,0x81 ,0x81,0xCC,0xCC,0xCC,0x2A,0x60,0x66,0x60,0x60,0x0C ,0x03,0x81,0x00,0x00,0x81,0x81,0x00,0x81,0xC7,0xCC ,0x06,0x06,0x00,0x00,0x06,0x00,0x00,0xC7,0x6C,0x66 ,0x8F,0x8F,0x8F,0x00,0x03,0x03,0x03,0x00,0x81,0xFF ,0xFF,0x81,0x03,0x00,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC ,0x66,0x66,0x66,0xCC,0xCC,0xCC,0x66,0x87,0x00,0x00 ,0x00,0x03,0x00,0xF6,0xB1,0x66,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0xCF,0x00},
{0x00,0x99,0x7E,0xC7,0x83,0x81,0x81,0x00,0x00,0x00 ,0x00,0xCC,0xE7,0x00,0x76,0xE7,0x0E,0xE0,0xE7,0x00 ,0xB1,0xC3,0xEF,0xE7,0x81,0xE7,0x81,0x03,0xEF,0x42 ,0xC7,0x83,0x00,0x00,0x00,0xEF,0xC0,0x06,0xCC,0x00 ,0x03,0x81,0x66,0x81,0x00,0x00,0x00,0x06,0x6E,0x03 ,0x06,0xC0,0xC0,0xC0,0xCC,0x03,0xCC,0x81,0x83,0x83 ,0x03,0x00,0x81,0x00,0x0C,0xCC,0x66,0x6C,0x66,0x06 ,0x06,0x6C,0xCC,0x03,0xCC,0xC6,0x66,0x6C,0xEC,0x6C ,0x06,0xED,0x66,0xCC,0x03,0xCC,0xCC,0xC6,0xCC,0x03 ,0x26,0x03,0xC0,0xC0,0x00,0x00,0x00,0xCC,0x66,0x0C ,0xCC,0x0C,0x06,0xCC,0x66,0x81,0xC0,0xC6,0x81,0x6D ,0xCC,0xCC,0x66,0xCC,0x06,0x81,0x06,0xCC,0xCC,0x6D ,0x83,0x66,0x06,0x03,0x81,0x03,0x00,0x6C,0xCC,0xCC ,0x0C,0xCC,0xCC,0xCC,0xCC,0x0C,0x0C,0x0C,0x0C,0x81 ,0x81,0x81,0xCF,0xCF,0x0C,0x8D,0x8D,0xCC,0xCC,0xCC ,0xCC,0xCC,0x66,0xCC,0xCC,0xCE,0x06,0x6E,0x83,0x81 ,0xCC,0x81,0xCC,0xCC,0xCC,0xEC,0x00,0x00,0x0C,0xAA ,0xC0,0x3C,0xBD,0x87,0xCC,0x33,0x29,0xAA,0xBD,0x81 ,0x81,0xCF,0xCF,0xCF,0xAB,0x6E,0x66,0x6E,0xEF,0xCC ,0xCF,0x81,0x00,0x00,0x81,0x81,0x00,0x81,0xCC,0xCF ,0xF7,0x76,0xFF,0x7E,0x76,0xFF,0x7E,0xC6,0x6C,0x66 ,0x0C,0x0C,0x0C,0x00,0x03,0x03,0x03,0x00,0x81,0xFF ,0xFF,0x81,0x03,0x00,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC ,0x66,0xC7,0xC7,0xCC,0xCC,0xCC,0x66,0x03,0x00,0x00 ,0x00,0x00,0x00,0xBD,0xB1,0xC3,0x03,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0xCF,0x00},
{0x00,0x3C,0xFF,0x83,0x01,0x81,0x81,0x00,0x00,0x00 ,0x00,0xCC,0x81,0x00,0x7E,0xBD,0x0C,0x60,0xC3,0x66 ,0xB1,0xC0,0xEF,0xC3,0x81,0xC3,0x00,0x00,0x00,0x00 ,0xEF,0x01,0x00,0x03,0x00,0xC6,0x8F,0xCC,0xCD,0x00 ,0x81,0x03,0x00,0x00,0x83,0x00,0x83,0x0C,0x6C,0x03 ,0xCC,0xCC,0xC0,0xCC,0xCC,0x03,0xCC,0x03,0x83,0x83 ,0x81,0x00,0x03,0x03,0x0C,0xCC,0x66,0x66,0xC6,0x26 ,0x06,0x66,0xCC,0x03,0xCC,0x66,0x66,0x6C,0x6C,0xC6 ,0x06,0xC7,0x66,0xCC,0x03,0xCC,0x87,0xC6,0xCC,0x03 ,0x6C,0x03,0x60,0xC0,0x00,0x00,0x00,0xCC,0x66,0xCC ,0xCC,0xCC,0x06,0xC7,0x66,0x81,0xC0,0x66,0x81,0x6D ,0xCC,0xCC,0x66,0xCC,0x06,0xCC,0xC6,0xCC,0x87,0xC6 ,0xC6,0xC3,0x4C,0x03,0x81,0x03,0x00,0xEF,0xCC,0xCC ,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0x0C,0x0C,0x0C,0x81 ,0x81,0x81,0xCC,0xCC,0x4C,0x8D,0x8D,0xCC,0xCC,0xCC ,0xCC,0xCC,0xC3,0xCC,0xCC,0xCC,0x0C,0xC6,0xC6,0x8D ,0xCC,0x81,0xCC,0xCC,0xCC,0x6C,0x00,0x00,0xCC,0x44 ,0xC0,0x68,0x3B,0x87,0x66,0x66,0x94,0x55,0x6B,0x81 ,0x81,0xCC,0xCC,0xCC,0x44,0x66,0x66,0x66,0x00,0x87 ,0x03,0x81,0x00,0x00,0x81,0x81,0x00,0x81,0xCC,0xCC ,0x00,0x66,0x00,0x66,0x66,0x00,0x66,0xC7,0x6C,0xC6 ,0x4C,0x4C,0x4C,0x00,0x03,0x03,0x03,0x00,0x81,0xFF ,0xFF,0x81,0x03,0x00,0xCC,0x8F,0xCC,0xCC,0xCC,0xCC ,0x66,0x06,0x06,0xCC,0xCC,0xCC,0xC3,0x03,0x00,0x00 ,0x00,0xCF,0x8F,0x3B,0xB1,0xC0,0x03,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0xCF,0x00},
{0x00,0xE7,0xE7,0x01,0x00,0xE7,0xE7,0x00,0x00,0x00 ,0x00,0x87,0x81,0x00,0x6E,0x81,0x08,0x20,0x81,0x66 ,0xB1,0x6C,0xEF,0x81,0x81,0x81,0x00,0x00,0x00,0x00 ,0xEF,0x01,0x00,0x03,0x00,0xC6,0x03,0xC8,0x67,0x00 ,0xC0,0x06,0x00,0x00,0x83,0x00,0x83,0x08,0xC7,0xCF ,0xCF,0x87,0xE1,0x87,0x87,0x03,0x87,0x07,0x00,0x81 ,0xC0,0x00,0x06,0x03,0xC7,0xCC,0xCF,0xC3,0x8F,0xEF ,0x0F,0xE3,0xCC,0x87,0x87,0x6E,0xEF,0x6C,0x6C,0x83 ,0x0F,0xC0,0x6E,0x87,0x87,0x87,0x03,0xC6,0xCC,0x87 ,0xEF,0xC3,0x20,0xC3,0x00,0x00,0x00,0x67,0xCD,0x87 ,0x67,0x87,0x0F,0xC0,0x6E,0xE7,0xCC,0x6E,0xE7,0x6C ,0xCC,0x87,0xC7,0xC7,0x0F,0x87,0x83,0x67,0x03,0xC6 ,0x6C,0xC0,0xCF,0xC1,0x81,0x0E,0x00,0x00,0x87,0x67 ,0x87,0x67,0x67,0x67,0x67,0x87,0xC7,0xC7,0xC7,0xE7 ,0xE7,0xE7,0xCC,0xCC,0xCF,0xFE,0xED,0x87,0x87,0x87 ,0x67,0x67,0xC0,0x87,0x87,0x87,0xEF,0x8B,0x6C,0x07 ,0x67,0xE7,0x87,0x67,0xCC,0x6C,0x00,0x00,0x87,0x83 ,0x00,0xC0,0xF3,0x03,0x33,0xCC,0x42,0xAA,0xD6,0x81 ,0x81,0xCC,0xCC,0xCC,0x83,0x66,0x66,0x66,0x00,0x03 ,0x03,0x81,0x00,0x00,0x81,0x81,0x00,0x81,0x67,0xCC ,0x00,0x66,0x00,0x66,0x66,0x00,0x66,0x6C,0xC7,0x8F ,0xCF,0xCF,0xCF,0x00,0x87,0x87,0x87,0x00,0x81,0xFF ,0xFF,0x81,0x87,0x00,0x87,0x0C,0x87,0x87,0x87,0x87 ,0xB7,0x0F,0x0F,0x87,0x87,0x87,0xC0,0x87,0x00,0x00 ,0x00,0x00,0x00,0xF3,0xB1,0x6C,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00},
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x00,0x00 ,0x00,0xE7,0x00,0xE7,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0xE1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0xCC,0x00,0x00,0xCC,0x00,0x00,0x00 ,0x00,0x00,0x06,0xC0,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x81,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00 ,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x81,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0xF1,0x30,0x00,0x00,0x00,0x29,0x55,0xBD,0x81 ,0x81,0x00,0x00,0x00,0x00,0x66,0x66,0x66,0x00,0x03 ,0x00,0x81,0x00,0x00,0x81,0x81,0x00,0x81,0x00,0x00 ,0x00,0x66,0x00,0x66,0x66,0x00,0x66,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x81,0xFF ,0xFF,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x00 ,0x06,0x00,0x00,0x00,0x00,0x00,0x81,0x00,0x00,0x00 ,0x00,0x00,0x00,0x30,0x00,0xE7,0x00,0x03,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00},
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x87,0x00,0x00,0x87,0x00,0x00,0x00 ,0x00,0x00,0x0F,0xE1,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00 ,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x94,0xAA,0x6B,0x81 ,0x81,0x00,0x00,0x00,0x00,0x66,0x66,0x66,0x00,0x00 ,0x00,0x81,0x00,0x00,0x81,0x81,0x00,0x81,0x00,0x00 ,0x00,0x66,0x00,0x66,0x66,0x00,0x66,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x81,0xFF ,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x0C,0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00}
};

#define char_put() \
{asm volatile("ld __tmp_reg__, x+" "\n\t" \
"movw r30, %A0" "\n\t" \
"add r30, __tmp_reg__" "\n\t" \
"adc r31, __zero_reg__" "\n\t" \
"lpm %A1, z" "\n\t" \
: \
: "r" (&schrift[j][0]), "r" (temp) \
: "r26", "r27", "r30", "r31" \
); \
PORTB=(1<<CP); \
PORTC=temp; \
PORTB=0; \
PORTB=(1<<CP); \
asm volatile ("swap %0" : "=r" (temp) : "0" (temp)); \
PORTC=temp; \
PORTB=0; \
}


int main(void)
{
unsigned char text[20][40];
unsigned char zeichen = 0;
volatile unsigned char dummy;
unsigned char temp = 0;
unsigned char *tptr;

for (unsigned char y = 0; y < 20; y++)
{
for (unsigned char x = 0; x < 40; x++)
text[y][x] = zeichen++;
}
dummy = text[19][39]; // optimierung verhindern

DDRC=0x0F;
DDRB=0x07;


PORTB=(1<<FRAME)|(1<<LOAD);

while(1)
{
tptr = &text[0][0];
PORTB=(1<<FRAME)|(1<<CP);
for(volatile unsigned char lines =0; lines<20;lines++)
{
for(volatile unsigned char rows =0; rows<12;rows++)
{
unsigned char j = rows;
asm volatile("movw r26, %A0" : : "r" (tptr) : "r26", "r27");
char_put() char_put() char_put() char_put();
char_put() char_put() char_put() char_put();
char_put() char_put() char_put() char_put();
char_put() char_put() char_put() char_put();
char_put() char_put() char_put() char_put();
char_put() char_put() char_put() char_put();
char_put() char_put() char_put() char_put();
char_put() char_put() char_put() char_put();
char_put() char_put() char_put() char_put();
char_put() char_put() char_put() char_put();
PORTB=(1<<LOAD);
}
tptr += 40;
}
PORTB=(1<<LOAD)|(1<<FRAME);
}
}

Nachtrag:
So werden's 114Hz:

const unsigned char schrift[12][256] PROGMEM __attribute__((aligned(256))) ={
// ...
#define char_put() \
{asm volatile("ld __tmp_reg__, x+" "\n\t" \
"movw r30, %A0" "\n\t" \
"add r30, __tmp_reg__" "\n\t" \
"lpm %A1, z" "\n\t" \
: \
: "r" (&schrift[j][0]), "r" (temp) \
: "r26", "r27", "r30", "r31" \
); \
PORTB=(1<<CP); \
PORTC=temp; \
PORTB=0; \
PORTB=(1<<CP); \
asm volatile ("swap %0" : "=r" (temp) : "0" (temp)); \
PORTC=temp; \
PORTB=0; \
}

MisterMou
23.04.2012, 16:25
Oh man...
Jetzt ist es vorbei, bis gestern war der Code kein Problem, jetzt muss ich erst einmal rausbekommen was was macht :D
Woher hast Du das Wissen? Gibt es da ein Zauberbuch?

Das Display macht keine Probleme, es läuft auch noch bei 132Hz, jetzt sind es 114,6Hz mit -O2 bzw. -O3.

MagicWSmoke
23.04.2012, 16:44
Woher hast Du das Wissen? Gibt es da ein Zauberbuch?
286/386er in Assembler geschrieben, auch dazu gibt's natürlich Bücher, und dann irgendwann mal auf AVR. Da kennt man das Meiste schon und braucht eigentlich nur noch ein Instruction Set Datenblatt.
Mehr Kopfzerbrechen hatte mir der C-Inlineassembler gemacht, der recht kryptisch ist und auch durchaus kreativ Code generiert hatte. Manchmal unfunktionell, aber immer wieder interessant. Für den Assembler gibt's Quellen im Netz, so auch hier im Forum, und manches bringt man durch Trial & Error raus.

Das Display macht keine Probleme, es läuft auch noch bei 132Hz, jetzt sind es 114,6Hz mit -O2 bzw. -O3.
So wie ich's verstehe läuft die aktuelle Hardware mit dem neuen Code, ist das richtig ? Konnte nur "trocken" probieren, war also nicht sicher.

MisterMou
23.04.2012, 16:58
Du bist also ein "alter" Hase :D
Ich fang ja erst an :)
Normalerweise wüsste ich nicht einmal was was ein AVR ist ;) 2.Semester Elektrotechnik...

Genau, läuft alles wunderbar, hatte bloß mal zum Test 18,4MHz drauf gegeben ;)
Ich schlage schon Alarm, wenns nicht läuft^^

MagicWSmoke
23.04.2012, 19:32
Ja, ich mach' das schon 'ne geraume Zeit ;)

Ist in Ordnung, schaut doch auch ganz gut aus.
Hilft außerdem immer mit den Stoff weiter zu sein als der Rest.:)

Ich denke, dass es noch schneller geht, aber dann müsste man die Schleifen komplett in Assembler machen, da ließe sich noch was sparen.
Wie's jetzt ist, find' ich 'ne gute Mischung, es ist noch weitestgehend C und da optimiert, wo der Compiler selbst nicht wollte - zum Teil kam da schon wildes Zeug raus.

MagicWSmoke
24.04.2012, 20:47
Interesse an einer Interrupt-getriebenen Version ?

ePyx
25.04.2012, 07:32
Hab zwar eigentlich keine Anwendung, lese aber den Thread schon ne Weile mit. Mich würde die IRQ-Version durchaus interessieren. Also antworte ich mal mit : "Ja".

MagicWSmoke
25.04.2012, 10:01
Hab zwar eigentlich keine Anwendung
Da geht's mir nicht besser, hab' nicht mal ein Display. Bei Pollin gibt's die auch nicht mehr, außer einem Modell das aber komplizierter bei der Spannungsversorgung ist.

Mich würde die IRQ-Version durchaus interessieren. Also antworte ich mal mit : "Ja".
Ich simuliere den Code immer, aus beschriebenen Grund kann ich's nicht am lebenden Objekt testen. Kann also sein, dass noch ein Wurm drin ist, tatsächlich wissen wir's wenn MisterMou es am Laufen hatte.

ePyx
25.04.2012, 10:11
Naja hab auch kein Display, daher auch keine Anwendung. Aber Interesse kann man ja haben. :) Dabei kann man nur Lernen.

PS : Das du das ohne Hardware und Anwendung durch simulierst bzw. dir generell den Aufwand machst, ist im Übrigen hoch anzurechnen. Zumindest ich mach das. :)

MagicWSmoke
25.04.2012, 10:25
Aber Interesse kann man ja haben.
Ja, klar.

...dir generell den Aufwand machst, ist im Übrigen hoch anzurechnen.
Danke, ganz uneigennützig bin ich aber auch nicht, das mach' ich gern wenn ich's als Knobelaufgabe betrachte.
Das Schreiben von Assembler in 'ner separate .S-Datei ist im Übrigen um Einiges angenehmer als Inline ASM.

Hatte noch 'ne andere ISR Version gebaut, bei der immer pro ISR-Aufruf eine komplette der 20 Zeilen ausgegeben wurde, die war noch schneller und hätte es auf maximal 115Hz gebracht. Aber sie hätte die Programmausführung recht lange unterbrochen und damit wäre das für UART-Kommunikation ein Problem gewesen.

Die angehängte Version gibt immer nur eine Scanzeile von 12 aus, hat deswegen mehr Overhead und schafft's auf max 103Hz.

ePyx
25.04.2012, 10:28
Danke, ganz uneigennützig bin ich aber auch nicht, das mach' ich gern wenn ich's als Knobelaufgabe betrachte.
Das ist aber sehr schlimm. ;)



Das Schreiben von Assembler in 'ner separate .S-Datei ist im Übrigen um Einiges angenehmer als Inline ASM.

Kann ich mir gut vorstellen. Bisher hab ich mich noch nicht wirklich damit auseinandersetzen müssen. Entweder waren die Sachen in C oder in ASM lösbar. Mischen bzw. Optimieren musste ich da bisher nicht allzu viel. Daher ist halt auch interessant. ;)

MisterMou
29.04.2012, 19:24
Soo,
endlich hatte ich mal wieder etwas Zeit...
Inzwischen nutze ich ein anderes Display, bei dem "M" manuell geschaltet werden muss. Das heißt, jedes Frame wechselt M zwischen high und low. (1.Frame high | 2.Frame low | ...)
Das Display flimmert weniger bei niedrigen Frequenzen. Es lässt sich bei 57Hz problemlos betreiben, das andere musste mit mindestens 70Hz gefahren werden.
Außerdem besitzt dieses eine LED Hintergrundbeleuchtung. Allerdings steigt die Kontrastspannung von -18V auf +23V, aber für mein Labornetzteil ist das kein Problem.
Der Kontrast ist auch etwas schlechter.
Der große Bonus ist der Touchscreen:cool:
Sonst bleibt alles beim Alten.

Zur Zeit habe ich Probleme, dass die Schrift nicht sauber gezeichnet wird. Einige Pixel sind an der falschen Stelle, aber bei dem selben Zeichen immer wieder gleich falsch. Das sieht so aus als würde das Array falsch gespeichert werden.
Und dann passt auch mal wieder alles, einfach so. Ich gebe aber meinem Rechner die Schuld, der ist zur Zeit etwas zickig.

Die IRQ Sache ist ne tolle Idee, aber Timer0 unterstützt doch gar keinen Compare-Interrupt, sondern nur einen Overflow-Interrupt.
Ich sage auch mal "Ja" :)

edit: Der Rechner ist es nicht, mein großer ist der selben Meinung O.o

MagicWSmoke
29.04.2012, 19:55
Die IRQ Sache ist ne tolle Idee, aber Timer0 unterstützt doch gar keinen Compare-Interrupt, sondern nur einen Overflow-Interrupt.
Ich sage auch mal "Ja" :)
Irgendwie bin ich da auf den Mega16 gekommen :)
Lässt sich aber einfach auf Preload des Timers umbauen, werd's morgen mal ändern und dann einstellen.

MagicWSmoke
30.04.2012, 14:23
Anbei die geänderte Version für den ATMega8, bei dem nun Timer0 vorgeladen wird.
Es handelt sich aber noch um ungetesteten Code für das ursprüngliche Display, sollte also erst getestet werden ob's auf dem überhaupt hinhaut, sowohl von der prinzipiellen Code-Funktion, als auch mit der Ausgabe jeweils 1 Linie pro ISR-Aufruf.

Sobald das dort läuft, kannst Du die Änderung

jedes Frame wechselt M zwischen high und low. (1.Frame high | 2.Frame low | ...)
selbst in der .S vornehmen, oder C-Beispielcode einstellen, dann schau' ich's mir an.

Leider musste meine Kalkulation für den Zähler-Topwert über das #define in der .h über Bord gehen. Der GCC hatte kein Problem damit, aber der GNU Assembler war nicht dazu zu bewegen die Rechnung aufzulösen.
top_val muss also nun selbst ausgerechnet werden, ist für 75Hz bereits erledigt, bei dieser Wiederholrate sind noch ungefähr 27% der Prozessorleistung für anderen Code verfügbar.

MisterMou
01.05.2012, 11:28
Danke für die ganze Arbeit.
Inzwischen überfordert mich Dein Code komplett:(
Er funktioniert trotzdem tadellos.
Er lässt sich auch am neuen Display testen, allerdings verblasst das Bild nach ein paar Sekunden, daran ist aber M schuld.
Soweit ich das mitbekommen hab, ändert M die Polarität der Kristalle und hält so den Kontrast aufrecht, deswegen der ständige Wechsel.
Die Ansteuerung ist sehr einfach. Nach jedem Frame wird gewechselt.

PORTD=~PORTD;
Ich habe dafür noch den übrigen Port genommen um den original Code nicht ändern zu müssen. M hängt an Pin D0.

Meine Pixelfehler waren ein gelegentlicher Kurzschluss zwischen D1 und D2...

MagicWSmoke
01.05.2012, 11:55
Danke für die ganze Arbeit.
Bitte. Ich fand's natürlich interessant, auch wenn die einfach zu versorgenden Displays nicht mehr erhältlich sind.

Inzwischen überfordert mich Dein Code komplett
Um es in eine .S auszulagern, war der Umbau komplett auf Assembler notwendig.

Er funktioniert trotzdem tadellos.
Prima.

Die Ansteuerung ist sehr einfach. Nach jedem Frame wird gewechselt.
Ich hatte mich nicht mit der eigentlichen Funktion des Displays auseinandergesetzt, sondern nur Deinen Beispielcode umgesetzt.
D.h., wenn Du einen funktionierenden Code einstellst, an dem ich sehe wann genau M kommen muss, dann ist's für mich am einfachsten danach meinen Code zu ändern.
Sind auf dem Kontrollport PORTB noch Pins verfügbar ?

MisterMou
01.05.2012, 17:01
Ich habe fix mal einen Code fetig gemacht.
M liegt mit auf PortB, Pin B3 um genau zu sein.

Läuft mit 114,6 Hz bei -O1.

Die Versorgung mit den +23V ist doch kein Problem mit einer Spannungspumpe.

edit: Natürlich meine ich eine Ladungspumpe :D

ePyx
01.05.2012, 18:02
Du meinst sicher eine Ladungspumpe. ;)

MagicWSmoke
01.05.2012, 19:20
M liegt mit auf PortB, Pin B4 um genau zu sein.
Laut Deinem Code liegt er auf PB3, nicht auf 4.
Kannst es im .h einfach ändern, wenn's doch PB4 sein sollte.
Anbei der angepasste Code, sollte theoretisch funktionieren. Basierend auf der momentanen Vorlage unter Verwendung von M wäre man mit den Opcodes CBI/SBI (statt Out) etwas besser gefahren.
Es dürfte kein großartiger Unterschied sein, hätte aber eine deutliche Veränderung des Codes erfordert, das wollt' ich vermeiden.
In der momentanen Version ist der Code dagegen einfach auf höhere Port-IO-Adressen anpassbar, was mit CBI/SBI nicht so problemlos ginge, bzw. dann deutlich länger brauchen würde.

MisterMou
01.05.2012, 19:32
Danke, du hast aber noch ne Kleinigkeit in der main() vergessen ;)

CTRL_DDR=0x0F;

Läuft wunderbar mit 75.0719Hz.

Es ist in der Tat Pin B3 :D

MagicWSmoke
01.05.2012, 19:44
Danke, du hast aber noch ne Kleinigkeit in der main() vergessen ;)
Immer diese groben Schnitzer :p

Läuft wunderbar mit 75.0719Hz.
Das macht er natürlich wegen des Timers. Für Dich sind ja tatsächlich keine 120Hz wichtig, sondern was an Rechenleistung noch über bleibt, es ist mehr als ein Viertel. Also äquivalent einem mit 4MHz betriebenen µC und damit lässt sich ja immer noch Einiges anfangen.

MisterMou
01.05.2012, 19:46
Das macht er natürlich wegen des Timers. Für Dich sind ja tatsächlich keine 120Hz wichtig, sondern was an Rechenleistung noch über bleibt, es ist mehr als ein Viertel. Also äquivalent einem mit 4MHz betriebenen µC und damit lässt sich ja immer noch Einiges anfangen.

Das ist mir klar :D
Ich wollte bloß mal die tatsächliche Frequenz liefern ;)

MagicWSmoke
02.05.2012, 00:27
Ich wollte bloß mal die tatsächliche Frequenz liefern ;)
Ah, ok.
Was mich interessieren würde, sind Bildstörungen beim Beschreiben des Zeichenspeichers bemerkbar ?
Es wird pro Interruptaufruf ja nur ein 12tel Buchstabe geschrieben, also müsste da theoretisch ein wenig Verhau entstehen, kann aber sein dass es durch die Trägheit des Auges nicht erkennbar ist.

Vorher hatte ich noch eine ISR gebaut, die jeweils eine der 20 Zeilen komplett auf einen Rutsch geschrieben hat.
Da hätt's sicher keine Störungen gegeben, aber bei Verwendung eines UARTs wär' bei ~34kBaud Schluss gewesen, weil sonst Zeichen nicht mehr abgeholt worden wären.
Fand ich dann auch nicht so optimal.

MisterMou
02.05.2012, 20:21
Ich glaube nicht, dass da problematische Störungen auftreten, der Mensch ist einfach zu langsam :D Ich werde es aber mal untersuchen.

Inzwischen habe ich mich auch mal an der Interrupt-Geschichte versucht, allerdings auf C Basis.
Das Ergebnis ist zur Zeit 60% Auslastung bei 50Hz und 90% Auslastung bei 75Hz.
Die Auslastung lässt sich an der Low-Zeit von Pin D0 abschätzen.
Ich bekomme allerdings Grafikfehler bei der -O1 Optimierung, sonst klappt alles.

Das ist alles Neuland für mich, also die ganze Displaygeschichte. Ich programmiere einfach drauf los, Hauptsache ist, dass es funktioniert. :D
Nur nochmal zur Erinnerung^^

MagicWSmoke
02.05.2012, 21:27
Ich glaube nicht, dass da problematische Störungen auftreten, der Mensch ist einfach zu langsam :D Ich werde es aber mal untersuchen.
Bis jetzt hattest Du nur statischen Text.

Das Ergebnis ist zur Zeit 60% Auslastung bei 50Hz und 90% Auslastung bei 75Hz.
Da wird auch einiges merkwürdiges Zeugs produziert, besonders von der Konstruktion (mFlag<<M) halte ich nichts. Schon mal angesehen, was da selbst in -Os generiert wird ?

Die Auslastung lässt sich an der Low-Zeit von Pin D0 abschätzen.
Ich lass mir immer die Takte im Simulator ausgeben.

Ich bekomme allerdings Grafikfehler bei der -O1 Optimierung, sonst klappt alles.
Wahrscheinlich optimiert er Dir da irgendetwas weg. Bedeutet das, die höheren Optimierungsstufen funktionieren ?

Ich programmiere einfach drauf los, Hauptsache ist, dass es funktioniert. :D
Da Dein Ziel eine möglichst kurze Ausführungszeit ist, ist ein Einfachfrauflos halt sehr zufällig im Ergebnis.

MisterMou
02.05.2012, 21:57
Bis jetzt hattest Du nur statischen Text.

Ich seh aber wie träge das Display ist, der Wechsel eins Zeichens dauert mehrere Frames.
Ich kann Dich aber beruhigen, man sieht keine Probleme, zumindest bei meinem Code. Deiner ist ja fixer, da sollte es weniger Probleme werden.


Wahrscheinlich optimiert er Dir da irgendetwas weg. Bedeutet das, die höheren Optimierungsstufen funktionieren ?
Genau, beides.


Da Dein Ziel eine möglichst kurze Ausführungszeit ist, ist ein Einfachfrauflos halt sehr zufällig im Ergebnis.
Das ist mir bewusst, aber ich habe kaum Erfahrung. Also erst einmal zum Laufen bringen, dann optimieren. Ich kann ja nicht zaubern ;)

MagicWSmoke
02.05.2012, 22:15
Das ist dann das Henne-Ei Paradoxon, wenn Du nicht Assembler lesen kannst, siehst Du nicht, wie der Compiler bestimmte Anweisungen in C umsetzt, das Du deswegen benutzt um Assembler zu vermeiden :p

MisterMou
02.05.2012, 22:36
Da geb ich Dir Recht :D
Ich finde ASM einfach so unbequem, aber wo keine Rechenleistung ist, muss man eben durch Optimierung nachhelfen, mir bleibt da wohl nichts übrig...

Das Ersetzen von (mFlag<<M) durch mFlag bringt so gut wie nichts.
mFlag wird dabei vorher schon 0x08 oder 0x00 gesetzt.

MagicWSmoke
02.05.2012, 22:46
Du hast halt das Problem dass aus 2 schnöden Takten, oft genug durchlaufen, schnell mal 1000 werden.
Ich fand den erzeugten ASM-Block zum Steuern der Bits unnötig kompliziert, hab' mich allerdings nicht um andere Lösungen umgesehen.

Mir wär's allerdings zu dumm mit dem C-Code rumtüfteln zu müssen, nur damit der Compiler das von mir Gewünschte zusammenbaut. Hatte ich am Anfang des Projekts auch versucht, nur um zu erkennen, was da alles an kreativ Unbrauchbarem rauskommt.

Dann sag' ich's doch gleich in Assembler, vor allem da der Umfang der Sache recht überschaubar ist.

MagicWSmoke
03.05.2012, 09:12
Hab' mir nochmal angesehen, warum Dein Code so langsam ist. Hier:

...dass aus 2 schnöden Takten, oft genug durchlaufen, schnell mal 1000 werden.
hatte ich bereits richtig geraten. Auch wenn ich die (mFlag<<M) Geschichte nicht gut finde, weil er da in einer Schleife schiebt, was völlig unnötig ist, da vermeidbar, so wird dieser Teil nicht oft durchlaufen.

Das Problem macht dies hier:

mov r25,r21
ldi r24,k00
subi r24,k00
sbci r25,kFF
Denn das wird 40 mal pro ISR eingebaut und ist das Resultat aus:

: "r" (&font[charRow][0]), "r" (tempChar) \
So etwas kannst Du vermeiden, indem Du zu Beginn der ISR die globale Variable in eine lokale kopierst und am Ende wieder zurück. Damit erlaubst Du dem Compiler zu optimieren, d.h. diese lokale Variable in einem Prozessorregister zu halten.

#define char_put() \
...
: "r" (&font[l_charRow][0]), "r" (tempChar) \
...
}

ISR(TIMER0_OVF_vect)
{
unsigned char l_charRow = charRow;
...
if(l_charRow==CHAR_HEIGTH)
...
l_charRow=0;
...
l_charRow++;
charRow = l_charRow;
}
Spart pro ISR-Lauf ca. 160 Takte, macht dann bei 12 x 20 x 75 = ~2900000 Takte

MisterMou
03.05.2012, 10:17
So etwas kannst Du vermeiden, indem Du zu Beginn der ISR die globale Variable in eine lokale kopierst und am Ende wieder zurück. Damit erlaubst Du dem Compiler zu optimieren, d.h. diese lokale Variable in einem Prozessorregister zu halten.
Um solche Infos geht es mir, danke. Das hatte ich bis jetzt nirgendwo gelesen (vllt. auch überlesen), dabei ist es doch so wichtig für ein schnelles Programm...
Bin damit auf eine Auslastung von 70% bei 75Hz gefallen, da fehlt nicht mehr viel zur ASM Version :)
Bei 50Hz sind es 47% Auslastung.

Aktueller Stand:

MagicWSmoke
03.05.2012, 10:47
Um solche Infos geht es mir, danke.
Dachte ich mir :)

Das hatte ich bis jetzt nirgendwo gelesen (vllt. auch überlesen), dabei ist es doch so wichtig für ein schnelles Programm...
http://www.mikrocontroller.net/articles/AVR-GCC-Codeoptimierung#Puffern_von_volatile-Variablen

Bin damit auf eine Auslastung von 70% bei 75Hz gefallen, da fehlt nicht mehr viel zur ASM Version :)
70% halt' ich für ein Gerücht, die Assembler-ISR hatte im Schnitt um die 650 Takte, daraus ergibt sich 73% Last, die C-Version mit 680 Takten hat dann um die 76 %.

MisterMou
03.05.2012, 10:58
Dann muss mein Oszi lügen. Nagut die "Messung" ist nicht optimal :D
http://www.abload.de/img/ads000014blkz.png (http://www.abload.de/image.php?img=ads000014blkz.png)



Für Dich sind ja tatsächlich keine 120Hz wichtig, sondern was an Rechenleistung noch über bleibt, es ist mehr als ein Viertel. Also äquivalent einem mit 4MHz betriebenen µC und damit lässt sich ja immer noch Einiges anfangen.
Bei Dir klang das neulich noch nach weniger als 66% :)

edit: Jaja, ich hab mich verrechnet, sind 75% :D

MagicWSmoke
03.05.2012, 11:30
Dann muss mein Oszi lügen. Nagut die "Messung" ist nicht optimal :D
Wie so oft sitzt der Teufel im Detail, Deine Messung lässt Sichern und Wiederherstellen der Prozessorregister unberücksichtigt.

Bei Dir klang das neulich noch nach weniger als 66%
Nach meinem Zitat stehen 4MHz von 16MHz zur Verfügung, 4/16tel sind 25%, entsprechend 75% Last.

Die Rechnung: (([Durchschnittliche Takte pro ISR] * 12 * 20 * Bildwiederholrate) / Quarzfrequenz)*100 = Prozessorlast in Prozent.
Bei Deiner C-Version hast Du jetzt ungefähr 680 Takte von ISR-Einsprung bis Rückkehr in den unterbrochenen Code.

MisterMou
03.05.2012, 11:50
Fail...
Bei mir sind 4 von 16 eben ein Drittel :D


Wie so oft sitzt der Teufel im Detail, Deine Messung lässt Sichern und Wiederherstellen der Prozessorregister unberücksichtigt.
Achso. Das Sichern wird nicht gemessen, das glaub ich Dir sofort. Aber die Wiederherstellung geschieht doch noch wenn D0 low ist.
D0 wird doch erst wieder in der main() high geschaltet.

MagicWSmoke
03.05.2012, 12:50
Bei mir sind 4 von 16 eben ein Drittel :D
2 x 3 macht 4 Widdewiddewitt und Drei macht Neune :D

Aber die Wiederherstellung geschieht doch noch wenn D0 low ist.
Ja, ist richtig, hab' Deinen Code nochmal angesehen. Dann ist's nur das Sichern und der ISR-Einsprung was Du in der Messung nicht mitbekommst. Von der Auslösung bis der Port auf Low geht sind's ~38 Takte, von da bis zum erneuten Setzen auf High sinds >= 642 Takte, also eine Verteilung Gesamt 76,5% auf 4,3% und 72,2%, genau 70% kommt da immer noch nicht raus.

MisterMou
12.05.2012, 19:51
Inzwischen gibt´s eine print() für Strings und eine printInt() für Ganzzahlen in dezimalform.

Gibt es da wieder Tricks die ich noch nicht kenne um die printInt() zu beschleunigen?
Eine Fehlertoleranz ist nicht vorgesehen, schade um die Rechenleistung.

Das große Problem wird die Division und der Modulo-Operator sein, denke ich. Auf jeden Fall wird ein riesieger ASM-Code erstellt.




void printInt(unsigned char xPos, unsigned char yPos, unsigned char length, int num)//32767 -> +32767
{
unsigned char temp;
unsigned int i=0;
xPos+=length-1;

if(num<0)
{
num--; //Zweierkompliment
num=~num;
do
{
num-=(temp=num%10); //letzte Stelle extrahieren
num/=10; //num>>1 dezimal
text[yPos][xPos-i++]=temp+0x30; //um auf passenden char zu kommen
if(i==length-1)break; //damit Platz fürs Minus ist
}while(num);
text[yPos][xPos-i++]=0x2D; //Minuszeichen an erste stelle
}else
{
do
{
num-=(temp=num%10);
num/=10;
text[yPos][xPos-i++]=temp+0x30;
if(i==length)break;
}while(num);
}

while(i<length)
text[yPos][xPos-i++]=0x20; //Rest mit Leerzeichen auffüllen

}

MagicWSmoke
13.05.2012, 20:59
Gibt es da wieder Tricks die ich noch nicht kenne um die printInt() zu beschleunigen?
Der "Trick" nennt sich "effektiverer Code" :D
Warum glaubst Du besser als itoa() zu sein ? Noch dazu Du umständlich programmierst. Hast ja bemerkt dass Divisionen "teuer" sind, für Multiplikationen gibt's in manchen AVR's Unterstützung durch den MUL Opcode, Divisionen müssen immer per Code gemacht werden.
Hier führst Du gleich 2 Divisionen durch, wovon Du eine hättest sparen können.

num-=num%10;
num/=10;
Ein Modulo 10 enthält die gleiche Division wie num/=10, die Multiplikation und Differenzbildung als Modulo zu Fuß wär' wahrscheinlich billiger gewesen.
Dein Code benötigt so ganze 2570 Takte mit printInt(0,0,6,29999).

void printInt(unsigned char xPos, unsigned char yPos, unsigned char length, int num){
char buff[7];
unsigned char slen;
unsigned char spccnt = 0;
itoa(num, buff, 10);
slen = strlen(buff);
if (slen < length) {
spccnt = length - slen;
memset((void*)&text[yPos][xPos], ' ', spccnt);
xPos += spccnt;
length -= spccnt;
}
memcpy((void*)&text[yPos][xPos], (void*)&buff, length);
}

printInt(0,0,6,29999);
Braucht noch 1370.

const int idiv[6] PROGMEM = {0, 1, 10, 100, 1000, 10000};

void printInt(unsigned char xPos, unsigned char yPos, unsigned char length, int num){
unsigned int idx = 5;
char lz = 1;
char prlz;
char chval;
char isminus = 0;
unsigned char *txtptr = &text[yPos][xPos];
if (num < 0) {
num = 0 - num;
length--;
isminus = 1;
}
else
*txtptr++ = ' ';
while ((idx) && (length--)) {
chval = '0';
prlz = lz;
while (num >= pgm_read_word(&(idiv[idx]))) {
num -= pgm_read_word(&(idiv[idx]));
chval++;
lz = 0;
}
if ((prlz != lz) && (isminus)) {
prlz = lz;
*txtptr++ = '-';
}
idx--;
if ((lz) && (idx)) chval = ' ';
*txtptr++ = chval;
}
}

printInt(0,0,6,29999);
Der noch 540.

Das einzig Lästige dabei ist, durch das Alignement des Fonts kommt const int idiv[6] PROGMEM auf $D00 zu liegen, der Compiler aligned für den darauffolgenden Code nochmals und verhaut damit knapp 240 Bytes Flash, aus der .map-Datei:

0x00000d00 idiv
0x00000e00 . = ALIGN (0x2)

MisterMou
15.05.2012, 18:53
Warum glaubst Du besser als itoa() zu sein ?

Weil ich itoa() zu bis eben noch nicht kannte :D
Kam mir zu speziell vor,als das es dafür eine Funktion gibt.

Danke, dass Du so geduldig mit mir bist :)

Ich kämpfe zur Zeit mit inhomogenen Differenzialgleichungen 2. Grades, sobald das verstanden wurde, werde ich mich an Deinen Code setzen.

Nochmal danke für die Arbeit.

MagicWSmoke
15.05.2012, 19:07
Ich kämpfe zur Zeit mit inhomogenen Differenzialgleichungen 2. Grades
Sollte ich jemals wissen wollen was das ist, kann ich dann ja Dich fragen :p

Nochmal danke für die Arbeit.
Bitte. :)

MisterMou
11.07.2012, 18:11
Soo, die Prüfungen sind so gut wie fertig, bis auf eine, aber die hat noch Zeit :D

Wie gesagt, verwende ich ein neues Display(WINTEK WD-H3224V). Link (http://www.pollin.de/shop/dt/Mzk0OTc4OTk-/Bauelemente_Bauteile/Aktive_Bauelemente/Displays/LCD_Modul_WINTEK_WD_H3224V.html)
Verbaut sieht das dann so aus:
http://www.abload.de/thumb/neuesdisplayvkzpw.jpg (http://www.abload.de/image.php?img=neuesdisplayvkzpw.jpg)

Der Touchscreen wurde inzwischen auch in Betrieb genommen. Ich habe ihm gleich noch eine Fehlerbetrachtung verpasst. Sollten zwei Folgewerte zu weit auseinander liegen, wird dies als Fehler betrachtet. Der 2. Wert wird aber trotzdem aufgenommen und mit der nächsten Messung verglichen. Wenn alles passt wird der Wert in in die Hauptvariable gepackt und ein "touched" Flag wird 1 gesetzt, bis wieder zwei Folgewerte zu stark voneinander abweichen u.s.w.
Der Sinn dahinter ist, dass die Ausgangsspannung sehr nervös ist, wenn man nicht richtig draufdrückt. So wird ein ein Verreißen des Ergebnisses verhindert.
Jetzt muss das Ergebnis nur noch aufbereitet werden, das heißt möglichst schnell/effizient auf 320x240 runterrechen, zurzeit sind es nur die zugeschnittene Werte des ADC.

Außerdem kam eine cls() und eine fillScr() hinzu, sie sind eigendlich beide gleich, bis auf die Kleinigkeit, dass cls() das Textarray mit Leerzeichen füllt, bei fillScr() kann man sich das Zeichen aussuchen.

Die PrintInt() von MagicWSmoke arbeitet nicht so wie sie soll, beim festlegen der Ausgabelänge wird der hintere Teil abgeschnitten, nicht der vordere. Das wird meine nächste Aufgabe.

MisterMou
15.07.2012, 12:32
Inzwischen wurde die Auflösung des Touchscreens auf 320x240 runtergerechnet, außerdem kam ein Terminalbereich hinzu. In diesem wird per printTerminal() eine neue Zeile hinzugefügt, der Rest verschiebt sich, wie man es gewohnt ist.
In der Praxis sieht das dann so aus.
http://www.abload.de/thumb/bilderubji3.jpg (http://www.abload.de/image.php?img=bilderubji3.jpg)

Solange kein Interesse am Code besteht, werde ich ihn auch nicht aufbereiten und posten.