Moin,
Ich bin seit einigen Monaten ein Projekt mit einem Commodore SID
(MOS6581)
aufzubauen. Der SID wird dabei mit einem Atmel AVR ATMega gesteuert.
Adressleitungen sind an PORTA angeschlossen, Daten an PORTC
und PORTD5 ist CLK und PORTD7 ist /CS. Reset ist an VCC
angeschlossen und R/W an GND.
Trotzdem kommt mit dem Testprogramm kein Ton raus.
Der C-Source (nur provisorisch zum testen) sieht folgendermaßen aus:
hp-freund schrieb:> Prüf mal:>> while(!PORTD5){}; // Wait for sync
Was genau meinst du?
Auf PORTD5 liegt das CLK-Signal, welches durch den Timer0 generiert
wird.
PORTD5 ist fest definiert auf 5, d.h. darin wird nicht der Zustand des
5. Pins von Port D wiedergespiegelt. Das ist nur eine Hilfe um die
Pin->Bitzuordnung wegzuabstrahieren.
Mit
while (!(PORTD & (1<<PORTD5))) {}
bzw.
while (PORTD & (1<<PORTD5)) {}
könnte es besser gehen.
Thorsten schlägt noch vor, PIND zu verwenden, da bin ich mir allerdings
gerade nicht sicher. Der Port ist ja als Output konfiguriert, von daher
klingt PORTD eigentlich schon ganz sinnvoll...
Viele Grüße,
Simon
Nachtrag: Gerade nochmal nachgeguckt, PIND sollte funktionieren:
"Independent of the setting of Data Direction bit DDxn, the port pin can
be read through the PINxn Register bit"
Also, ich lese das Datenblatt so, dass er die Daten bei fallender CLK
sampled. Solange hältst Du aber das CS nicht.
Versuch mal hinzukriegen, dass die Pegelwechsel sauber in der Mitte der
Clock-Pulse passieren. Sobald Du Dich da fix an die Flankenwechsel der
CLK hängst, können sehr schnell irgendwelche Zufallseffekte die
Kommunikation verhindern.
Viele Grüße,
Simon
Simon Budig schrieb:> Versuch mal hinzukriegen, dass die Pegelwechsel sauber in der Mitte der> Clock-Pulse passieren. Sobald Du Dich da fix an die Flankenwechsel der> CLK hängst, können sehr schnell irgendwelche Zufallseffekte die> Kommunikation verhindern.
Das habe ich in der mos6581.c versucht zu erreichen:
Bisher noch kein Erfolg. Aber trotzdem vielen Dank fuer die bisherigen
Tips.
Ich hab leider nur einen 8-Kanal Logic-Analyzer hier.
Sonst wuerde ich gerne auch einen Screenshot von
DATA + ADDR + CLK + CS zeigen.
Guck Dir mal Deinen Screenshot vom Oszi an: Da wird bei +8us das CS auf
low gezogen. Bei +8.25 (oder so) geht der schon wieder high und das
kommt mir komisch vor. Ich vermute, dass er frühestens bei +9us wieder
high gehen sollte, damit der SID eine Chance hat, den Registerwert bei
+8.75 zu samplen.
Gegebenenfalls bau das mal auf eine harte Abfolge von Befehlen mit NOPs
dazwischen um, um das Timing sauber hinzukriegen.
Viele Grüße,
Simon