Forum: Mikrocontroller und Digitale Elektronik Erfahrungen mit GameBoy Drucker / Printer?


von André W. (sefiroth)


Lesenswert?

Ahoi!

Ich habe mir für ein AVR Projekt bei ebay eine Gameboy Kamera 
ersteigert. Bei der Auktion ist auch ein GameBoy Drucker dabei, wo ich 
jetzt überlege, ob ich den nicht auch irgendwie verwenden kann...

Zur Kamera habe ich schon sehr detaillierte Dokumentationen gefunden, 
aber leider noch nichts zum Drucker. Daher wollte ich mal rumfragen, ob 
schon jemand (erfolgreich) den GameBoy Drucker angesteuert hat oder 
Informationen dazu hat. Der Drucker wird soweit ich weiß nicht wie die 
Kamera in den Spiele-Slot gesteckt, sondern über die serielle "Link" 
Schnittstelle angeschlossen. Damit endet mein Wissen aber auch schon ^_^

Mögliche Anwendungen:
Ist im Zeitalter der LCD-Displays, Chipkarten und USB-Sticks zwar etwas 
nostalgisch, aber ich fände es witzig, wenn z.B. eine 
Überwachungsschaltung schwarz auf weiß protokolliert, ob jemand den Raum 
betreten hat :-) Wobei natürlich noch abzuwarten ist, wie hoch die 
Auflösung des Druckers ist...
Das GameBoy-Druckerpapier ist übrigens selbstklebendes Thermopapier. 
Kann man  auch nette Sticker mit machen g

von Sigint 112 (sigint)


Angehängte Dateien:

Lesenswert?

Hallo Andre,
   dein Beitrag ist ja schon etwas älter, aber ich hab auch vor kurzem 
ne GB-Cam inklusive Printer bekommen und die gleiche Idee gehabt. Ich 
bin schon etwas weiter, da ich genauere Infos zum Protokoll finden 
konnte.
Dieses ist recht einfach und sollte eigentlich kein Problem sein (dachte 
ich). Ich hab also direkt angefangen mal etwas in C zu proggen und hatte 
natürlich gehofft, daß es direkt läuft. (Programm folgt)
Seltsamerweise bekomme ich bis heute nicht den Printer dazu etwas zu 
machen.
Ich hab mal die Signale mit meiner Soundkarte aufgezeichnet, konnte aber 
keinen entscheidenden Unterschied feststellen. Der Printer sendet 
einfach kein ACK...

Also meine Frage an alle: Ist die serielle Schnittstelle vom Gameboy 
extrem zeitkritisch, oder hab ich irgendwo ein anderes Problem. Was mich 
stört, ist die Tatsache, daß nirgendwo genaue Infos über die 
elektrischen Eigenschaften der Schnittstelle zu finden sind.
Vielleicht weiss ja jemand eine Lösung für mein Problem.

Gruß,
  SIGINT

von Sigint 112 (sigint)


Angehängte Dateien:

Lesenswert?

Das Programm

von Sigint 112 (sigint)


Angehängte Dateien:

Lesenswert?

Die ersten zwei Bytes eines Datenpaketes. Die erste Sequenz ist vom GB 
die zweite von meiner Schaltung.

P.S.: Die Signalleitungen vom Printer hängen an PortC:

PC0 - SIN
PC1 - SOUT
PC2 - CLK

ATmega8 mit internen 8MHz

von André W. (sefiroth)


Lesenswert?

Hallo SIGINT,

leider habe ich in der Zwischenzeit nichts mit meinen Cams bzw. dem 
Drucker gemacht (keine Zeit, zu faul und andere Projekte), daher kann 
ich Dir leider nicht weiterhelfen.

Aber ich bin anch wie vor an dem Thema interessiert!

Gruß, André

von Karsten B. (k-duke)


Lesenswert?

>Ist die serielle Schnittstelle vom Gameboy
>extrem zeitkritisch

Ich kann dazu sagen... vielleicht nicht extrem, aber doch sehr 
zeitkritisch.
Da ich mich ja mit Homebrew für den Gamebox beschäftige (inzwischen nur 
noch nintendo DS) weiß ich, dass viele Leute, die Programme über das 
Link-Kabel an den Advance schicken wollten Probleme mit den Timings am 
Com-Port hatten.
Bei mir persönlich funktionierte es auf Anhieb, aber das tut ja nichts 
zur Sache.

von Sigint 112 (sigint)


Lesenswert?

@Andre: Vielleicht bekommen wir den Drucker ja zusammen dazu etwas zu 
sagen :-)
Infos über den Drucker gibt zum Glück ja im Netz. Leider find ich aber 
keine genauen Dokus zum Link-Port.

@Karsten: Ist die Schnittstelle vom GBA identisch zum GB-Classic?!? Was 
mich aber stark wundert ist die Tatsache, daß es extra eine 
Clock-Leitung gibt. Warum ist die Verbindung dann zeitkritisch? Im Netz 
hab ich mehrfach gesehen, daß die Schnittstelle "einfach nur" ein 
Schieberegister im Sender und Empfänger ist, dessen Inhalte durch die 
Clock, SI und SO Signale ausgetauscht werden. Beim GB-Printer ist der GB 
der Master und erzeugt die Clock-Signale.
Soweit zu meiner Theorie... aber irgendwie will das trotzdem nicht 
funktionieren. Wenn ich meinen Tastkopf wieder habe, dann werd ich mal 
die Timings bestimmen und das Programm entsprechend anpassen.

Gruß,
  SIGINT

von Karsten B. (k-duke)


Lesenswert?

> @Karsten: Ist die Schnittstelle vom GBA identisch zum GB-Classic?!?
Das weiß ich nicht genau. Ist aber durchaus möglich, da Nintendo lange, 
lange an ihren eingesessenen Anschlüssen festhält. So auch z.B. bei dem 
Composite-Kabeln für Ihre Konsolen. Vom SNES über über den N64 bis hin 
zum GC wurde der Anschluss nicht geändert. Das ist im Computer- (bzw. 
Konsolen-)Markt eine höllisch lange Zeit.


>Was
> mich aber stark wundert ist die Tatsache, daß es extra eine
> Clock-Leitung gibt. Warum ist die Verbindung dann zeitkritisch?
Ich könnte mir gut vorstellen, dass bei einer zu hohen Geschwindigkeit 
der Gameboy nicht mehr mitkommt mit dem auslesen.
Das könnte genauso gut für die Gegenstelle stimmen.
Ich kann mich noch gut daran erinnern, dass das Programm, das ich zur 
Datenübertragung nutzte eine Option hatte um ein Timing (und damit auch 
die Übertragungsgeschwindigkeit) einzustellen. War das Timing (also 
wahrscheinlich der Clock) zu hoch kam nur noch wirres Zeug am GBA an.
Probier mal das ganze langsamer laufen zu lassen. Vielleicht tut sich 
dann etwas.

> Im Netz
> hab ich mehrfach gesehen, daß die Schnittstelle "einfach nur" ein
> Schieberegister im Sender und Empfänger ist, dessen Inhalte durch die
> Clock, SI und SO Signale ausgetauscht werden.
Ich meine auch sowas in der Art gelesen zu haben.


Da ich inzwischen auch irgendwie Interesse an diesem Drucker entwickelt 
habe werde ich mich mal wieder in dem Bereich einlesen. Das Problem:
Ich habe keinen GB-Classic mehr. Aber ich denke den kann ich relativ 
schnell irgendwo besorgen.

von Sigint 112 (sigint)


Lesenswert?

Hi zusammen,
  ich hab jetzt mal mein Programm auf den Gameboy portiert, und was soll 
ich sagen: Es läuft. Wenn ich also nur die Funktion "transmit()" für den 
Gameboy anpasse, dann druckt der Drucker. Also kann es sich eigentlich 
nurnoch um ein Timingproblem handeln, oder?
Was mich wundert ist die Tatsache, daß ich am Anfang mit einem ganz 
langsamen Timing angefangen habe. Es kann also sein, daß der Drucker das 
genaue Timing des Gameboy erwartet. Ich werd das mal versuchen zu 
messen.

Als nächstes muss ich mir noch einfallen lassen, wie ich Bilder mit dem 
begrenzten Speicher des AVR drucken kann.

Gruß,
  SIGINT

P.S.: GameBoy Development Kit zum compilieren

von Sigint 112 (sigint)


Angehängte Dateien:

Lesenswert?

Hmmm, hier das File

von Karsten B. (k-duke)


Lesenswert?

Das hört sich ja shcon sehr vielversprechend an.
Leider habe ich weder einen Gameboy Classic, noch einen der Drucker 
ergattern können.

Aber mal eine Frage... hast du denn bereits nach GB-Homebrew-Foren 
gesucht?
Ich wette da wird man noch um einiges klüger ^^

von Sigint 112 (sigint)


Lesenswert?

Naja,
  sehr vielversprechend ist das eigentlich nicht. Ich hab jetzt mal 
versucht das Timing nachzubauen, aber der Drucker reagiert immer noch 
nicht. Für mein Verständniss müsste das Timing auch relativ unwichtig 
sein, da ja die CLK Leitung zur synchronisation verwendet wird.
Ein passendes Homebrew-Forum hab ich bis jetzt noch nicht gefunden... 
der Gameboy ist halt total veraltet und nur wenige verwenden den noch 
zum basteln. Ich bleib aber am Ball und melde mich bei Neuigkeiten 
wieder.

Gruß,
  SIGINT

von Sebastian (Gast)


Lesenswert?

Nur mal als bloßer Verdacht: Vielleicht liegt das Taktsignal immer an, 
und die Daten werden lediglich damit synchronisiert? Bei der seriellen 
Schnittstelle alter Psion-Organizer (Serie 3) ist das ähnlich: Das 
Taktsignal der Schnittstelle taktet die CPU der angeschlossenen 
Erweiterung.

von Sigint 112 (sigint)


Lesenswert?

Hi Sebastian,
   beim Gameboy ist das anders. In Ruhestellung ist die Taktleitung 
HIGH... erst wenn was übertragen werden soll wird ein Takt erzeugt. Das 
kann man gut in der WAV-Aufnahme weiter oben erkennen. Ich bin mir 
sicher, daß die Daten, die ich sende, richtig sind da das Programm auf 
einem Gameboy ohne Probleme läuft. Wenn ich die Signale auf meinem Oszi 
betrachte finde ich aber keinen signifikanten Unterschied. Ich werd mal 
versuchen ein Bild zu posten.
Hier noch der Aufbau der Schnittstelle.
http://www.weblearn.hs-bremen.de/risse/RST/SS99/gameboy/Bilder/blockdiagramm_serielle.gif

Info:
"
When the internal clock is selected, it drives the clock pin on the game 
link port and it stays high when not used. During a transfer it will go 
low eight times to clock in/out each bit.
Initiating a serial transfer with external clock will wait forever if no 
external clock is present. This allows a certain amount of 
synchronization with each serial port.
"

Wenn ich das also richtig verstehe, dann wird die serielle Übertragung 
des GB-Printer extern durch den GB getaktet und die Verbindung 
zeitunkritisch.
Der Printer ist immer Slave, der GB Master.
Aber es funktioniert einfach nicht.

Gruß,
  SIGINT

von Sigint 112 (sigint)


Angehängte Dateien:

Lesenswert?

Bild1

von Sigint 112 (sigint)


Angehängte Dateien:

Lesenswert?

Bild2

von Sigint 112 (sigint)


Angehängte Dateien:

Lesenswert?

Bild3

Alle Bilder sind vom GB. Bild1 zeit 2Byte, die übertragen werden.
Bild2 zeigt den begin der Übertragung der Bilddaten.
Bild3 zeit ein Byte im Detail.

Oben CLK
Unten SOUT

SOUT ändert sich bei falender CLK Flanke.
Die Daten werden bei steigender Flanke vom GB-Printer übernommen.
Timing soll angeblich unkritisch sein.

von Sigint 112 (sigint)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,
   ich bin wieder zurück mit einer guten und einer schlechten Nachricht:
Die gute Nachricht ist, daß mein GB-Printer nach langem 
rumexperimentieren nun reagiert und ein ACK zurückgibt. Anscheinend ist 
das Timing doch wichtiger, als ich vermutet hatte. Die schlechte 
Nachricht ist allerdings, daß ich beim ausführen des Print-Commandos 
immer einen Fehler bekomme und nichts gedruckt wird.

ACK ohne Fehler: 0x81 0x00
ACK mit Fehler: 0x81 0x10

Ich kann nirgendwo finden, was der Fehler bedeutet...

Gruß,
  SIGINT

P.S.: Serielle Schnittstelle: 2400Baud 8-N-1

von Marco (Gast)


Lesenswert?

Hallo,

etwas ähnliches hatte ich auch vor und bin erstaunt einen halbwegs 
aktuellen Thread aufzufinden.
Das sich momentan ein paar Leute gleichzeitig Gedanken machen ist toll. 
Vielleicht wird ja etwas draus!

Sigint 112: Dein Programm läuft schon einige Minuten und mein Drucker 
gibt immer 8100 zurück:
1
GB - Printer
2
Transmission started
3
CMD:01 LEN:0000 CHKSUM:0001 ACK:8100
4
CMD:04 LEN:0280 CHKSUM:A986 ACK:8100
5
CMD:04 LEN:0000 CHKSUM:0004 ACK:8100
6
CMD:02 LEN:0004 CHKSUM:018D ACK:8100
7
Data sent
8
CMD:0F LEN:0000 CHKSUM:000F ACK:8100
9
CMD:0F LEN:0000 CHKSUM:000F ACK:8100
10
CMD:0F LEN:0000 CHKSUM:000F ACK:8100
11
CMD:0F LEN:0000 CHKSUM:000F ACK:8100
12
[...]

Ich habe mich zwar noch nicht durch den Code gekämpft, aber bim 
Simulieren ist mir aufgefallen, dass deine wait_us() z.B. anstelle von 
erwarteten 200us laut Stopwatch fast die zehnfache Zeit wartet.

Die Tage lese ich mich mal in den Code ein.

Grüße,
Marco

von Marco (Gast)


Lesenswert?

P.S.: Hat eigentlich jemand genauere Daten zur Druckmachanik? Lauf 
Aufdruck ist es ein Seiko MTP102-J160.
Die MTP Serie wird immernoch hergestellt und am ähnlichsten wäre der 
MTP102-16 - der hat aber anstelle von 16x160 nur 7x110 Punkte pro Zeile.

von SIGINT 112 (Gast)


Lesenswert?

@Marco: Hey, endlich hat mal jemand das Programm getestet.
Druckt dein Drucker denn? Die ACKs sind naemlich in Ordnung. Die 81 
sendet der Drucker immer und dann einen Fehlercode. 00 bedeutet "kein 
Fehler"!
Mich wundert nur, dass nach "Data sent" kein ACK:8102 auftaucht... das 
bedeuter, dass der Drucker druckt. Es wird nur ein Testmuster gedruckt.
Zum Thema Timing: Taktzyklen zaehlen ist nicht mein Ding... kann 
sein,dass die Warteroutinen absoluter Murks sind. Aber der Drucker 
antwortet seltsamerweise. Bei mir sieht die Uebertragung aber so aus:

GB - Printer
Transmission started
CMD:01 LEN:0000 CHKSUM:0001 ACK:8100
CMD:04 LEN:0280 CHKSUM:A986 ACK:8100
CMD:04 LEN:0000 CHKSUM:0004 ACK:8100
CMD:02 LEN:0004 CHKSUM:018D ACK:8110
Data sent
CMD:0F LEN:0000 CHKSUM:000F ACK:8100
CMD:0F LEN:0000 CHKSUM:000F ACK:8100
CMD:0F LEN:0000 CHKSUM:000F ACK:8100
CMD:0F LEN:0000 CHKSUM:000F ACK:8100

Gruss,
  SIGINT

von SIGINT 112 (Gast)


Lesenswert?

P.S.: Zum Thema wait_us()... die Funktion soll vielfache von 100us 
Warten. Der Funktionsname ist schlecht gewaehlt. Trotzdem ist die 
Funktion aboluter Murks: Ich hab das Timing nur grob ausgetestet. Ich 
werd das bei Gelegenheit verbessern.

von Marco (Gast)


Lesenswert?

Leider hatte ich bisher wenig Zeit, aber ich habe mit Digitrac (0€ LA 
für den Parallelport) die Init-sequenz vom GBA mit der vom AVR 
verglichen.
Die Timings sind nach etwas Feintuning mit 120 und 130us fast identisch.

Genauer kann ich es nicht messen und genauer kann man es mit der wait_us 
Funktion nicht einstellen :).

Auch die Daten stimmen mit dem, was der GBA sendet überein.
Warum der Drucker aber nicht druckt habe ich auch noch nicht 
herausgefunden.

Ich bleibe dran.
Marco

von Marco (Gast)


Angehängte Dateien:

Lesenswert?

Warum verschwindet der Anhang wenn man auf Vorschau klickt?

von Marco (Gast)


Angehängte Dateien:

Lesenswert?

Ach ja: Warum besteht das Init-Paket beim GBA eigentlich aus 10 bit?

von Marco (Gast)


Lesenswert?

byte meinte ich

von Sigint 112 (sigint)


Lesenswert?

Hi Marco,
  sehr interesannte Aufnahmen. Die Software muss ich mir auch mal 
anschauen.
Das die Übertragung 10Byte lang ist liegt daran, da die letzten beiden 
Bytes dazu verwendet werden den Status vom Printer abzufragen. (Die 0x81 
und der Statuscode) Steht so aber in der "gb-printer.txt".

"
4. ACKNOWLEDGEMENT

An acknowledgement is a two-byte data sent from GB Printer to GB after
a command packet to notify the status of the Printer.  The first byte
is the acknowledgement code and the second is the status code.
"

Die Tatsache, daß du ein gültiges ACK bekommst und der Drucker trotzdem 
nicht reagiert verwundert mich sehr. Das Problem MUSS aber in der 
Übertragung liegen, da die Software, nativ auf einem Gameboy, läuft. Ich 
hab lediglich die transmit() - Routine ausgetauscht.
Ich bin mir nicht sicher, ob die Hardwareschnittstelle nicht ein paar 
Besonderheiten besitzt. Vielleicht wird irgendein Zustand verwendet um 
das Schieberegister im Printer zu resetten. Sowas wie eine 
Startbedingung beim I2C... nur hab ich bis jetzt noch nichts 
herausfinden können.

Gruß,
  SIGINT

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.