www.mikrocontroller.net

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

Autor: André Wippich (sefiroth)
Datum: 04.01.2008 12:26

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
Autor: Sigint 112 (sigint)
Datum: 05.05.2008 19:38
Dateianhang: gb-printer.txt (18,8 KB, 95 Downloads)

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
Autor: Sigint 112 (sigint)
Datum: 05.05.2008 19:39
Dateianhang: GB_Printer.zip (16,3 KB, 19 Downloads)

Das Programm
Autor: Sigint 112 (sigint)
Datum: 05.05.2008 19:41
Dateianhang: test_gbprn.wav (654 Bytes, 43 Downloads)

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
Autor: André Wippich (sefiroth)
Datum: 05.05.2008 23:23

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é
Autor: Karsten B. (k-duke)
Datum: 05.05.2008 23:34

>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.
Autor: Sigint 112 (sigint)
Datum: 06.05.2008 17:12

@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
Autor: Karsten B. (k-duke)
Datum: 06.05.2008 17:34

> @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.
Autor: Sigint 112 (sigint)
Datum: 06.05.2008 21:03

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
Autor: Sigint 112 (sigint)
Datum: 06.05.2008 21:05
Dateianhang: printer.zip (5,8 KB, 15 Downloads)

Hmmm, hier das File
Autor: Karsten B. (k-duke)
Datum: 08.05.2008 09:59

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 ^^
Autor: Sigint 112 (sigint)
Datum: 08.05.2008 15:20

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
Autor: Sebastian (Gast)
Datum: 08.05.2008 15:30

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.
Autor: Sigint 112 (sigint)
Datum: 08.05.2008 19:12

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/ga...

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
Autor: Sigint 112 (sigint)
Datum: 08.05.2008 19:53
Dateianhang: Bild017.jpg (379,9 KB, 47 Downloads)
preview image for Bild017.jpg

Bild1
Autor: Sigint 112 (sigint)
Datum: 08.05.2008 19:54
Dateianhang: Bild018.jpg (22,7 KB, 23 Downloads)
preview image for Bild018.jpg

Bild2
Autor: Sigint 112 (sigint)
Datum: 08.05.2008 19:57
Dateianhang: Bild019.jpg (25,7 KB, 21 Downloads)
preview image for Bild019.jpg

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.
Autor: Sigint 112 (sigint)
Datum: 12.05.2008 15:43
Dateianhang: GB_Printer.zip (17,4 KB, 4 Downloads)

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
Autor: Marco (Gast)
Datum: 13.05.2008 19:29

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:
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:8100
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
[...]

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
Autor: Marco (Gast)
Datum: 13.05.2008 20:21

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.
Autor: SIGINT 112 (Gast)
Datum: 13.05.2008 22:29

@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
Autor: SIGINT 112 (Gast)
Datum: 13.05.2008 22:37

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.
Autor: Marco (Gast)
Datum: 16.05.2008 20:26

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
Autor: Marco (Gast)
Datum: 16.05.2008 20:27
Dateianhang: trace.PNG (13,8 KB, 21 Downloads)
preview image for trace.PNG

Warum verschwindet der Anhang wenn man auf Vorschau klickt?
Autor: Marco (Gast)
Datum: 16.05.2008 21:00
Dateianhang: 10bit.PNG (587 Bytes, 26 Downloads)
preview image for 10bit.PNG

Ach ja: Warum besteht das Init-Paket beim GBA eigentlich aus 10 bit?
Autor: Marco (Gast)
Datum: 16.05.2008 21:00

byte meinte ich
Autor: Sigint 112 (sigint)
Datum: 17.05.2008 12:28

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

Antwort schreiben

Die Angabe einer Email-Adresse ist freiwillig. Wenn Sie automatisch per Email über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Suchfunktion und Betreffsuche benutzen - vielleicht gibt es schon einen ähnlichen Beitrag
  • Aussagekräftigen Betreff wählen
  • Im Betreff angeben um welchen Controllertyp es geht (AVR, PIC, ...)
  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang
  • JPEG-Dateien (.jpg) nur für Fotos und Scans verwenden
  • Schaltpläne, Screenshots usw. als PNG oder GIF anhängen

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [pre]vorformatierter Text (z.B. Code in anderen Sprachen)[/pre]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel





Hinweis: der Originalbeitrag ist mehr als 6 Monate alt.

webmaster@mikrocontroller.netImpressumWerbung auf Mikrocontroller.net