Funktionsweise der Paddle Eingänge ?

Es gibt 8 Antworten in diesem Thema, welches 1.291 mal aufgerufen wurde. Der letzte Beitrag (17. Juli 2023 um 22:09) ist von Stefan Both.

  • Ich glaube, ich habe etwas Grundlegendes an der Funktionsweise des PotX und PotY Eingangs nicht verstanden.

    Auf der Suche nach einer Lösung für das CommoPad habe ich noch mal das Oszilloskop angeklemmt.

    Wenn ich NICHTS an den JoystickPort1 anklemme

    ausser das Oszilloskop, kommt folgendes Ergebnis:

    Bitte melde dich an, um diesen Anhang zu sehen.

    Bitte melde dich an, um diesen Anhang zu sehen.

    Bitte melde dich an, um diesen Anhang zu sehen.

    Bitte melde dich an, um diesen Anhang zu sehen.

    Warum habe ich eine Frequenz von etwa 2MHz auf PotX und PotY liegen?

    Ich habe geglaubt, dass im C64 ein analoger Schalter sitzt, der immer wieder zuschaltet.

    Intern wird hierbei ein Kondensator geladen.

    Die erreichbare Ladung hängt von der Stellung des Potis ab, der im Paddle sitzt.

    Dann schaltet der analoge Schalter wieder aus.

    Die ENTLADEZEIT wird vom C64 gemessen.

    Dadurch erkennt der C64 welche Paddlestellung angelegen haben muss.

    Warum liegt dann eine "verzerrte Rechteckspannung" an, wenn ich völlig ohne Last

    mit dem Oszilloskop zwischen GND und PotX/PotY messe ???

    Mit der Bitte um Hilfe

    Stefan

  • Die Poti hängen direkt am SID, d.h. man müsste dann schauen was im SID damit passiert, dort wird wohl ein Analog/Digital-Wanlder drin stecken, der den analogen Spannungswert am POT X und POT Y in einen digitalen Wert umwandelt - die verzerrte Rechteckspannung wird die Abtastfrequenz an POT X und Y sein:

    Hier steht mehr dazu:

    Bitte melde dich an, um diesen Link zu sehen.

    Bitte melde dich an, um diesen Anhang zu sehen.

    Bitte melde dich an, um diesen Anhang zu sehen.

  • Die POTX/Y-Eingänge sind keine normalen Analogeingänge, sondern messen die Spannung indirekt über die Zeit, die zur Entladung eines Kondensators benötigt wird. Dazu muß der Multiplexer vor dem Auslesen der Werte für ein paar hundert Mikrosekunden mit dem richtigen Port (an dem das Paddle bzw. die Maus angeschlossen ist) verbunden sein, damit die Messung funktioniert.

    Dazu kommt, daß es nur ein POTX und ein POTY gibt, aber zwei Joystickports. Um die 2x2 Eingänge der Joystickports mit den 2 Eingängen des SID zu verbinden, wird ein Analogschalter 4066 benutzt.

    Zum Durchschalten der beiden Joystickports werden die Leitungen PA6 und PA7 benutzt, die aber auch zur Tastaturmatrix gehören.

    Im Kernal wird PA7 nach dem Keyscan explizit auf low geschaltet (um Run/Stop zum Abbrechen von Laderoutinen usw. pollen zu können). Also ist PA7 die meiste Zeit low und PA6 die meiste Zeit high. Damit sind PotX/PotY von PortA die meiste Zeit mit PotX/Y des SID verbunden, aber manchmal mal auch kurz nicht.

    @Bitte melde dich an, um diesen Link zu sehen.:

    Sicher, daß es 2MHz sind???

    Ich hatte 2020 mit meinem alten HMO-Scope mal eine Messung an PotX/Y gemacht:

    Bitte melde dich an, um diesen Anhang zu sehen.  Bitte melde dich an, um diesen Anhang zu sehen.

    Leider sind sie ziemlich verrauscht und ich habe ich mir dazu nichts notiert, aber die linke Messung scheint die zu erwartenden 60Hz des Keyscans zu zeigen.

    Bin mir gerade nicht mehr ganz sicher, wie die Messung rechts dazu im Zusammenhang steht, aber ich denke, daß das eine ~40µs-Umschaltung des Multiplexers im Detail zeigen sollte.

    Ich hatte später für mein Bitte melde dich an, um diesen Link zu sehen. u.a. mal diverse Messungen des Kernal-Keyscans gemacht und da sieht man, daß der Keyscan ohne gedrückte Taste PA0..PA6 für ~38.6µs auf low schaltet.

    Bitte melde dich an, um diesen Anhang zu sehen.

    Und PA6 wirkt halt auf den Multiplexer:

    Bitte melde dich an, um diesen Anhang zu sehen.

  • Bitte melde dich an, um diesen Anhang zu sehen.

    Ich bekomme Hirnkrebs...

    Das heißt, dass die Firmware PIN 2 und Pin 3 erst auf Input schaltet.

    Dadurch einen Messdurchgang entdeckt, dafür hat Jan den Interrupt-Kram

    in der Firmware. Der löst dann blitzschnell zum richtigen Zeitpunkt aus und

    schaltet 2 und 3 auf Output und zieht die Ausgänge auf LOW.

    So wird dann der Ladevorgang (gegenüber einem Poti) "invertiert" kontrolliert.

    Link zur Beschreibung unter: Bitte melde dich an, um diesen Link zu sehen.

    hmmm...

    Das wird nix mit dem LowPassfilter.

    Ich bau aus Interesse noch nen (echten) DAC an einen Arduino, nur um zu Testen,

    ob der Wert dann stabiler ist - mal sehen.

    Stefan

  • Die 1351 macht auch sowas in der Art. Sie erkennt die Entladung des Kondensators und lädt ihn dann gezielt auf. Je länger der Ladezyklus, desto höher die Spannung.

    Bitte melde dich an, um diesen Link zu sehen.

  • @Bitte melde dich an, um diesen Link zu sehen.:

    Sicher, daß es 2MHz sind???

    Ich hatte 2020 mit meinem alten HMO-Scope mal eine Messung an PotX/Y gemacht:

    Nein, Du hast Recht. Es sind (etwa) 2 Wellen/ Cm

    bei einer T Einstellung von 1mS.

    Khz. NICHT Mhz...

  • Die 1351 macht auch sowas in der Art.

    Der Modus funktioniert zufriedenstellend gut.

    Prinzipiell funktioniert es ja auch im KoalaPad modus. Linienmodus, Rechteck, was auch immer.

    Hier wird VOR der Zeichenbewegung geklickt, dann die Entfernung zurückgelegt, und DANACH wieder geklickt.

    Nur beim Freihandmodus verschluckt sich die Abfrage. Wenn die KoalaPad Taste gedrückt bleibt

    WÄHREND die (zu malende) Strecke zurück gelegt wird.

    Ich hab das Gefühl, dass bei dauernder Abfrage der Taste die Interrupt Routine durcheinander kommt.

    Stefan

  • Ich glaube, ich habe ein Verdächtigen ausgemacht. Soweit ich mich erinnern kann, nutzt Jan eine delay-funktion um die Abfrage des touchfields auf 20 Abfragen pro Sekunde zu begrenzen. Delay im Zusammenspiel mit einer Interrupt Routine führt zu allen möglichen Ergebnissen.

    Das könnte für so alles mögliche die Erklärung sein.

  • Ich hab den Abend mit Coden verbracht.

    Das delay(5) hab ich durch eine millis() Funktion

    ersetzt. Keine Änderung.

    Das delay() ist aber lt. Google nur INNERHALB einer Interrupt Routine ein Problem.

    (Hab ich anders in Erinnerung - egal)

    Ich ändere den Code mal so ab, wie ich ihn programmieren würde (Auch die Abfrage der Buttons)

    Stefan