[Tutorial für NES] Reset über Controller mit PIC 12F629

  • Moin Community,


    angefangen hat es am 08.12.2013 im Circuit-Board als mi213 bei dem Design für ein Controllerreset brauchte. Verwirklichen wollte er das ganze auf dem Attiny85. micro hatte ihm stark unter die Arme gegriffen und recht schnell war dann auch n passende Version fertig ;). Parallel dazu wollte ich dann noch den Controllerreset für den PIC 12F629 fertig machen. mein PICKit 3 braucht halt auch seine Daseinsberechtigung :D.


    Hier kann man nochmal einiges Nachlesen: http://circuit-board.de/forum/viewtopic.php?f=19&t=12108


    Nach dem Umbau kann die Konsole per A+B+Start+Select resettet werden! Der Nachbau dauert keine Stunde :)


    Und nun zum eigentlichen Tutorial :)


    Hinweis:
    Das Tutorial ist hauptsächlich für das europäische NES geschrieben, welches auch in den Bildern gezeigt wird. Es kann jedoch beliebig adaptiert werden.



    0. Benötigte Werkzeuge und Materialien


    Prinzipiell ist die Liste der Werkzeuge und Materialien doch recht übersichtlich ;)


    • PIC 12F629
    • 100nF Kerko
    • Lötausrüstung
    • Schraubendreher (Kreuz)
    • Optional: Sockel für den PIC


    Natürlich sollte man den PIC auch beschreiben können!



    1. PIC beschreiben und vorbereiten


    Zunächst muss der PIC natürlich beschrieben werden! Das Hex-File habe ich in meiner Dropbox zur Verfügung gestellt und kann hier downgeloaded werden: https://dl.dropboxusercontent.…_IGR_Tutorial/nes_igr.zip


    Benötigt wird nur das Hex-File, wer am Assemblercode herum schreiben möchte, kann dies gerne tuen ;)


    Hinweis:
    Der PIC läuft mit seinem internen Takt von 4Mhz! Dieser wird über das sogenannte OSCCAL-Register kalibriert. Da dieser am Anfang des Programms abgefragt wird, ist es essenziell wichtig, dass dieses Register NICHT überschrieben wird bei der Programmierung des PICs! Gerade wer Programmiergeräte verwendet, die nicht von Microchip sind, sollte tunlichst darauf achten!!!


    Zur Vorbereitung des PICs ist nicht viel zu sagen - es kann in zwei Schritte geteilt werden:

    • Kerko von 100nF zwischen Pin 1 (Vcc) und Pin 8 (GND) löten, damit der interne Oszillator auch mit 4MHz arbeitet
    • Pin 4 muss entsprechend des Resettyps auf GND oder Vcc gelegt werden.
      Konkret heißt das:
      • Konsole hat "/Reset" (Famicom): Pin 4 auf GND legen, d.h. mit Pin 8 verbinden
      • konsole hat "Reset" (NES): Pin 4 auf Vcc legen, d.h. mit Pin 1 verbinden



    2. Vorbereiten der Konsole


    Wie man die Konsole aufschraubt, muss ich sicherlich nicht ausdrücklich beschreiben. Ich habe auch keine Fotos. einfach solange Kreuzschrauben lösen (das sind ein Paar), bis man das Mainboard in der Hand hat :D


    Hinweis:
    Es gibt zwei längere Schrauben an der Modulmechanik. Diese müssen natürlich anschließend zwingend auch wieder an Ort und Stelle platziert werden! Generell gilt jedoch, dass alle Schrauben wieder dort hin sollten, wo sie waren, weil die Gewinde im NES aus Plastik sind - am Besten entsprechend der Position im NES auf einem separatem Tisch hinlegen...


    Auf der Rückseite sind dann ein Paar ICs, an die wir gemütlich einige Litzen vorbereiten können. Die Litzen erst mal nicht zu kurz wählen. Hier einmal in der Übersicht:



    Wir müssen an folgende ICs ran:

    • CPU
    • CIC (hier habe ich beispielhaft die Litzen für Vcc und GND angebracht)
    • 74HC368 (U7)


    Los gehts ;)


    2.1. Vorbereitung an der CPU


    Hier eine Litze an Pin 39 und eine Litze an Pin 36 anlöten. damit alles super sitzt, sollte natürlich Pin und Litze verzinnt sein.



    2.2. Vorbereitung am CIC


    Hier kommen insgesamt drei Litzen ran - eine für Vcc, eine für GND und eine für den Reset.

    • Vcc liegt an Pin 16 an
    • GND liegt an den Pins 12 - 15 an (ich habe Pin 12 gewählt)
    • Resetsignal kommt beim CIC an Pin 7 an


    An den drei Stellen bereiten wir Litzen vor.



    Pin 7 sieht so komisch aus, weil ich den Pin vom Mainbpard getrennt hatte, um den Switchless-Mod für die RGB-Platine zu testen. Pin 7 habe ich mit einem kleinen Draht jetzt aber wieder mit der Durchkontaktierung verbunden, weil ich den Pin nicht zurück biegen wollte.


    Anmerkung:
    Vcc und GND können natürlich noch an vielen Stellen im NES entnommen werden!
    Wer in seinem NES noch nicht den Lockout-Chip deaktiviert hat, kann dies gleich mitmachen: einfach Pin 4 des CIC vom Mainboard trennen. Wer es ganz sauber haben will, verbindet den Pin 4 noch mit GND (ich habe dazu Pin 14 gewählt). Dann kann man auch PAL-A und US-Spiele an seiner PAL-B NES zocken ;)


    2.3. Vorbereitung am 74HC368 (U7)


    Oben rechts am Mainboard befinden sich zwei 74HC368 - einer für Player 1 (U7) und einer für Player 2 (U8). Da der Controllereset für Player 1 sein soll, machen wir uns an U7 zu schaffen und löten eine Litze an Pin 2.




    3. PIC 12F629 einbauen


    Nachdem wir nun die Litzen vorbereitet haben, suchen wir uns ein gemütliches Plätzchen für den PIC aus. Ich habe den Bereich zwischen CPU und und PPU aus. Ich habe den PIC mit Heißkleber fixiert. Im Überblick schaut das ganze jetzt so aus.



    Damit man nicht jede Litze einzeln nachverfolgen muss, hier nochmal in Detail :D



    Im asm-File ist das ganze wie folgt dokumentiert:

    Code
    ;   pin configuration: (controller port pin) [Mainboard pin]
    ;                                ,------_-----.
    ;           +5V (7) [CIC Pin 16] |1          8| GND (1) [CIC Pin 15]
    ;   Reset in/out (-) [CIC Pin 7] |2  GP5 GP0 7| serial data in (4) [U7 74HC368 Pin 2]
    ;              not connected out |3  GP4 GP1 6| latch in (3)[CPU Pin 39]
    ;                  Reset type in |4  GP3 GP2 5| clk in (2) [CPU Pin 36]
    ;                                `------------'



    4. Abschließende Schritte


    nun ist der Mod fertig :) Vor dem Zusammenschrauben des NES am Besten noch einmal testen. Der Reset wird mit der Tastenkombination


    A+B+Start+Select


    ausgelöst. Beim Reset geht die Power-LED kurz aus, was aber normal ist. Das ist mir auch vorher noch nie aufgefallen ;).


    Wenn alles funktioniert, kann der NES wieder zu gemacht werden!

    Viel Erfolg beim Nachbauen :D


    An dieser Stelle nochmal vielen Dank an mi213 für die Idee und an micro für die Oszi-Bilder 8)

  • Zitat

    Beim Reset geht die Power-LED kurz aus, was aber normal ist.

    Deutet aber eher auf einen Kurzschluss hin. Bei einem normalen Reset, leuchtet das Licht weiter.


    Normalerweiße hätte man Latch auch weglassen können.

  • Gut ich ging von einer Super-Nintendo aus. Verwechsle immer "Famicom" mit SNES.


    Aber gerade für Anfänger sollte man darauf achten möglichst wenige Kabel zu verwenden, die gelötet werden müssen.
    Und es ist natürlich leichter mit Latch zu arbeiten, aber es geht auch ohne.

  • Und wie willst du das machen? Das geht meiner Meinung nach nicht!


    Außerdem ist nun eine Litze mehr nicht wild & durch die großen Bauelemente wirklich extrem einfach!!!


    Edit: Nach längerem Überlegen - es geht doch. Da müsste man aber die Zeit zwischen zwei Impulsen an der Clock mit messen. Da das ganze eh schon recht zeitkritisch ist, behaupte ich mal, dass die 4Mhz interner Takt (pro Instruktion 4 Takte, d.h. 1us pro Instr.) nicht reichen werden! da müsste man n externen Takt anfügen und man hätte an Lötarbeit nichts gewonnen, eher verloren! Es bleibt dir natürlich frei, den Assemblercode zu modifizieren, dass du den Latch nicht brauchst, wenn dir die eine Litze eine Litze zu viel ist :P.


    OT: Für den N64 IGR braucht man n externen 20MHz Takt, um die '0' und '1' aufzulösen - da habe ich mir übrigens schon Materialien besorgt... Der kommt als nächstes dran.


    VG ;)

  • Sollte keine Kritik oder so sein.
    Aber wie du ja sicherlich weißt, werden vom Shiftregister am Controller, bei nichts drücken nur Nullen ausgegeben. Jetzt könntest du mit dem PIC einfach kontrollieren ob sich in diesem Shiftregister 4 Einsen hintereinander befinden. Dann wäre nur möglich
    "11110000" also A + B + Select + Start
    "01111000" also B + Select + Start + Nach oben
    "11100001" also A + B + Select + Rechts


    Mehr Möglichkeiten gibt es nicht, da man ja nur immer eine der Richtungstasten benutzen kann.
    Und zufällig drückt man diese Tasten auch nicht :D

  • Bei Nichtdrücken wird eine '1' ausgegeben :P


    Aber wie ich schon sagte: bei deiner vorgeschlagenen Methode reicht der interne Takt nicht aus. Mit Einlesen und Sprüngen brauche ich 11us - Zeit habe ich 12us, bei manchen 24us (siehe Oszi-Bilder aus dem ersten Link). Müsste ich jetzt noch eine Abfrage mehr machen, bräuchte man nochmal durch Timerreset 2us mehr, also insg. 13us - das reicht mir für die meisten Spiele nicht... Ich muss ja immer n Timer neustarten, der bei längerer Pause n Interrupt auslöst - so ohne Latch weiß man ja nicht ohne weiteres, wo der Anfang ist. Deswegen würde ich mit dem Timer n "größere" Lücke zwischen zwei Clockpulsen detektieren. Den es sagt mir ohne Latch keiner, dass die erste gemessene Clk auch die erste war - stumpf bis 8 zählen ist meiner Meinung nach unklug! Ne, da ist mir die eine Litze für das Latch doch lieber :)


    Achso: wenn man nicht bei Latch die erste Taste ausliest rückt das 'A' ans Ende der Reihe ;)


    PS: Aber danke für die Idee ;) so ähnlich wird das beim N64 laufen müssen :D Da werde ich ja nur Data haben.
    PPS: Klar war das Kritik, aber Kritik ist bei mir nicht gleich negativ behaftet - konstruktive Kritik ist doch immer noch die beste Kritik und förderlich für gute Mods :thumbup: