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:
1 | #include <avr/io.h> |
2 | #include <util/delay.h> |
3 | |
4 | |
5 | // 1MHz CLK for SID on PORTD5 (OC1A) |
6 | void initTimer(void) |
7 | { |
8 | TCNT0 = 0; |
9 | OCR1A = 7; |
10 | TCCR1B = 0b00001001; |
11 | TCCR1A = 0b01000000; |
12 | } |
13 | |
14 | void initMos(void) |
15 | { |
16 | DDRA = 0xFF; // ADDR |
17 | DDRC = 0xFF; // DATA |
18 | DDRD |= (1 << PIND7); // CS |
19 | |
20 | PORTA = 0x00; |
21 | PORTC = 0x00; |
22 | |
23 | PORTD |= (1 << PIND7); // Initialize with /CS on. |
24 | } |
25 | |
26 | void writeMos(uint8_t addr, uint8_t data) |
27 | { |
28 | PORTA = addr; |
29 | PORTC = data; |
30 | while(!PORTD5){}; // Wait for sync |
31 | PORTD &= ~(1 << PIND7); |
32 | while(PORTD5){}; // Wait for sync |
33 | PORTD |= (1 << PIND7); |
34 | } |
35 | |
36 | void testSID(void) |
37 | { |
38 | writeMos(24, 15); |
39 | writeMos(0, 196); |
40 | writeMos(1, 9); |
41 | writeMos(5, 105); |
42 | writeMos(6, 252); |
43 | writeMos(4, 33); |
44 | } |
45 | |
46 | int main(void) |
47 | { |
48 | _delay_ms(1000); |
49 | DDRD |= (1 << PB5); |
50 | initMos(); |
51 | initTimer(); |
52 | while(1) |
53 | { |
54 | testSID(); |
55 | |
56 | _delay_ms(2000); |
57 | _delay_ms(2000); |
58 | _delay_ms(2000); |
59 | } |
60 | } |
Hier noch das original Timing-Diagramm: http://www.waitingforfriday.com/index.php/Commodore_SID_6581_Datasheet#6581_.28SID.29_Timing Oder verstehe ich das falsch?