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
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
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
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é
>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.
@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
> @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.
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
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 ^^
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
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.
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
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.
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
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
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.
@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
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.
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
Warum verschwindet der Anhang wenn man auf Vorschau klickt?
Ach ja: Warum besteht das Init-Paket beim GBA eigentlich aus 10 bit?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.