eine Videospielkonsole basiert auf einem atmega328 microcontroller
| Teile | Zweck |
|---|---|
| Atmega328 | Controller |
| 64 LEDs | Display |
| 4 Buttons | Input |
| 1 Lautsprecher | Audio |
Das Gerät hat ein kompaktes Betriebssystem, das hauptsächlich von Timer-Interrupts gesteuert wird.
das Display Rendert so automatisch die Pixel aus dem gfx Buffer.
für Audio wird der Sound-buffer genutzt.
in dem Frequenz und Dauer pro Ton gespeichert wird
Das Spiel wird aus einer Liste aller Programme ausgewählt.
um ein Spiel hinzuzufügen. definiere es in einer C-Funktion.
und hänge den pointer an das Programm-Array an.
Die Anzeige wird aus einem Pixelbuffer gerendert.
Es gibt 3 verschiedene Buffer, Eine pro Helligkeit.
union {
struct {
uint8_t bright[8];
uint8_t medium[8];
uint8_t faint[8];
}array;
uint64_t number[3];
} gfx_buffer;
nun wird das Bild auf dem Bildschirm angezeigt.
ISR(TIMER0_OVF_vect){ // gfx
counter++;
PORTB = 0;
PORTD = ~(1 < (counter%8)) ;
PORTB = gfx_buffer.array.faint[(counter % 8) ];
}
ISR(TIMER0_COMPA_vect){ // gfx
PORTB = gfx_buffer.array.medium[(counter % 8) ];
}
ISR(TIMER0_COMPB_vect){ // gfx
PORTB = gfx_buffer.array.bright[(counter % 8) ];
}
der Pointer zum Spiel wird in ein Array eingefügt,
der Name für das Auswahlmenü in ein anderes Array, mit gleichem Index.
die Namen müssen im Bereich
hex 30-5a (dez 48-90)
die Kodierung ist:
// 0x40 ........................................... 0x5a
// 0123456789! ABCDEFGHIJKLMNOPQRSTUVWXYZ
Ascii / utf-8:
// 0x40 ........................................... 0x5a
// 0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ
die Schriftart ist als 5x4 Glyphen mit einem Bit pro Pixel
und 1 Byte pro Zeile der Glyphe definiert. (4 Bits pro Zeile sind ungenutzt)
uint8_t numbers[] = {
// 0
0b0010,
0b0101,
0b0111,
0b0101,
0b0010,
// 1
0b0110,
0b0010,
0b0010,
0b0010,
0b0111,
// ...
// Z
0b0111,
0b0001,
0b0010,
0b0100,
0b0111,
};
void (*games[])() ={ // function pointers to each program
game_snake,
game_paint,
game_alphabet,
game_music,
};
char* game_names[] = {
"==SNAKE==",
"==PAINT==",
"==ABC==",
"==MUSIC==",
// the '=' will be displayed as empty space
};
das Spiel lässt sich jetzt im Startmenü auswählen