Braucht man vielleicht nicht unbedingt, ich hatte aber die Idee und habe es einfach mal umgesetzt . Man kann nun mit einer zusätzlichen Taste den C64u ein und ausschalten und einen Reset auslösen .
Folgendes "Gamessystem" , welches @Tommy_NRW entworfen hat, habe ich an meinem Commodore 64 Ultimate Starlight installiert
Es sind drei Taster integriert die an der Pinleiste P4 des C64 Ultimate angeschlossen sind .
Dort kann man von Links nach rechts folgende Funktionen auslösen : Freeze ( wenn ein entsprechenden Modul installiert ist ) , Menu, und Reset .
Hier die gibt es die 3D-Druck Dateien von @thommy_nrw https://www.printables.com/model/1633352-…cluding-buttons
Einen Threat dazu gibt es im Forum64 : https://www.forum64.de/index.php?thre…gamesystem-mod/
Dort habe ich dann auch von @Tommy_nrw die Platinen dazu bekommen, die Gerber dazu hat er leider nicht veröffentlich .
Ich finde dieses Gamesystem genial, das einzige was mir da noch fehlte war ein zusätzlicher Taster, damit ich auch den c64u einschalten bzw. ausschalten kann ohne an die Seite zu greifen
( ja das sind Luxus Probleme
)
Ich habe es jetzt einfach anders gelöst, das möchte ich hier mal dokumentieren .
Ich nutze, mit Hilfe eines kleinen Attiny85, den rechten Reset Taster um den C64u ein-/aus- zuschalten und um ihn zu resetten .
Ich horche mit dem Attiny85 ob der C64 gerade eingeschaltet wird . Dann wird der Taster nicht weiter vom Attiny beachtet .
Wenn ich im eingeschalteten Zustand den Taster drücke wird ein Reset ausgelöst, also ein weiterer Ausgang schaltet dann den Reset Ping ( right) am P4 Steckkontakt auf dem C64u Board . ( ist im Sketch beschrieben , weiter unten )
Man kann mit dieser kleinen Schaltung also mehrere Funktionen auf einen Taster legen, ich habe hier nur zwei Funktionen drauf gelegt. ( Ersetzen bzw. zusätzlichen Taster zum ein- und ausschalten des C64 U und Auslösung Reset des C64u )
Hier ein paar Bilder wie ich den Einbau vorgenommen habe :
Hier auf einer kleinen Lochraster Platine ist die Schaltung aufgebaut :
Ich habe einfach den internen USB Port für die Spannungversorgung und die Verbindung zu GND benutzt .
Ausserdem sieht man den Abgriff des eingebauten Ein-Taster des C64U rechts mit der weissen Klemme . Alles zurück baubar ohne an dem Board herumzulöten.
Die beiden anderen Verbindungen sind einmal der Taster im Gamesystem ( grünes Kabel und Orange für den Resetpin ( right ) am P4 Pinheader .
Hier sieht man den ResetPin am P4 Pinnender :
Das ist der Schaltplan :
Schaltplan-c64u-PowerReset.pdf
Und weil die Lochrasterplatine nicht so richtig schön aussieht, habe ich gleich mal eine neue Platine mit KiCad gezeichnet :
Die Platine habe ich so gebaut, das man den SMD Attiny85 in einem normalen Programmiergerät programmieren kann, dazu muss nur der Jumper offen sein der die Kondensatoren mit der Schaltung verbindet und man muss sie natürlich aus dem c64u nehmen und abklemmen
Die Platine ist 2 mm dick damit sie ohne Spiel in den USB Port passt .
Platine ist bestellt, ich hoffe das sie funktioniert, ich werde berichten wenn sie angekommen ist . ![]()
Hier die .Hex Datei für den Attiny85 Mad-Taster.ino.hex
und hier der Sketch
// ============================================================
// ATtiny85 - Tasterauswertung fuer Steuerung
// ------------------------------------------------------------
// Funktion:
// - Taster liegt an der Ein/Aus-Leitung des C64u
// und schaltet die Steuerung direkt ein/aus (4 s = aus)
// - Der ATtiny liest diese Leitung ueber R1 = 100k an PB2 mit
// - Kurzer Druck im Betrieb (< 1,5 s):
// Ausgang 2 (PB1) zieht 0,5 s auf Masse, danach hochohmig
// - Langer Druck: ATtiny tut nichts, Ausschalten macht die
// Steuerung selbst (uns geht dabei die Versorgung aus)
// - Einschalt-Tastendruck wird beim Booten ignoriert
//
// Hardware: ATtiny85, 1 MHz intern
// Fuses: LFUSE 0x62, HFUSE 0xDD (BOD 2,7 V), EFUSE 0xFF
// IDE: ATtinyCore, Board "ATtiny85", Clock "1 MHz internal"
// ============================================================
#include <avr/sleep.h>
#include <avr/interrupt.h>
const uint8_t BTN = 2; // PB2 = Pin 7: liest Ein/Aus-Leitung via 100k
const uint8_t OUT2 = 1; // PB1 = Pin 6: Ausgang 2, Open-Drain
const uint16_t T_DEBOUNCE = 25; // ms Entprellzeit
const uint16_t T_MAX_KURZ = 1500; // ms: nur kuerzere Druecke zaehlen
const uint16_t T_PULS = 500; // ms Pulsdauer Ausgang 2
ISR(PCINT0_vect) {} // leer - dient nur zum Aufwachen
bool pressed() {
return digitalRead(BTN) == LOW;
}
void setup() {
pinMode(BTN, INPUT); // KEIN Pullup - Leitung hat ihren eigenen
pinMode(OUT2, INPUT); // hochohmig = inaktiv
pinMode(0, INPUT_PULLUP); // PB0 unbenutzt
pinMode(3, INPUT_PULLUP); // PB3 unbenutzt
pinMode(4, INPUT_PULLUP); // PB4 unbenutzt
delay(50); // Versorgung stabilisieren lassen
// Der Tastendruck, der uns gerade eingeschaltet hat,
// darf kein Kommando ausloesen:
while (pressed()) {}
delay(T_DEBOUNCE);
}
void loop() {
// ---- Schlafen bis zum naechsten Tastendruck ----
GIMSK |= _BV(PCIE); // Pin-Change-Interrupt aktivieren
PCMSK |= _BV(PCINT2); // nur PB2
ADCSRA &= ~_BV(ADEN); // ADC aus (spart Strom)
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
sleep_enable();
sei();
sleep_cpu(); // ...zzz... (< 0,5 uA)
sleep_disable();
PCMSK &= ~_BV(PCINT2);
// ---- Aufgewacht: Taster auswerten ----
delay(T_DEBOUNCE);
if (!pressed()) return; // Prellen oder Stoerimpuls -> zurueck schlafen
uint32_t t0 = millis();
while (pressed()) {
if (millis() - t0 > 10000) break; // Notausstieg (Taster klemmt)
}
if (millis() - t0 < T_MAX_KURZ) {
// Kurzer Druck: Ausgang 2 fuer 0,5 s auf Masse ziehen
pinMode(OUT2, OUTPUT);
digitalWrite(OUT2, LOW);
delay(T_PULS);
pinMode(OUT2, INPUT); // wieder hochohmig
}
// Langer Druck: bewusst nichts tun
}
Display More