ATtiny2313の実験回路を作ったので、ちょいと回路を変更してPWM出力をしてみました。
変更はきわめて簡単で、実験回路のPB2/OC0A(14番ピン)をD2から外し、RCAコネクタの信号線(内側)に入れます。 RCAコネクタのもう片方はGNDに接続します。
本体からの入力が1ビット使えなくなってデータが不正確になりますが、この際気にしないことにしましょう。
音質を気にするならローパスフィルタを設けるべきですが、とりあえずこれだけでも音は出ます。 ただ、出力電圧が高いので本当は抵抗を入れたほうがいいでしょうね。
とりあえず8bitカウンタを使ったPWMなのですが、この場合は以下のいずれかになるようです。
- 周波数一定、デューティ比を変化できる...音質が変化
- デューティ比一定(50:50)、周波数を変化できる...音程が変化
周波数とデューティ比の両方を可変にするには、16bitカウンタを使う必要があるようです。
なお、デューティ比50:50の出力は、まるでPSGそのものです。 ファミコンのあの独特の音も出せそうですね。
プログラムはこんな感じです(AVR Studioのアセンブラ使用)。
.include "tn2313def.inc" .def regB = r16 .def regD = r17 .def Temp = r18 .org 0 rjmp RESET rjmp 0 in regB, PINB ; input from PC (bit4, 3, 1, 0) in regD, PIND ; input from PC (bit7, 6, 5) andi regB, 0x1f andi regD, 0x70 lsl regD or regB, regD ; regB = input out OCR0A, regB reti RESET: ;; port setup ldi Temp, 0x1b ; 00011011 out PORTB, Temp ldi Temp, 0x74 ; 01110100 out PORTD, Temp ldi Temp, (1 << PB2) out DDRB, Temp ldi Temp, 0x00 out DDRD, Temp ;; PWM setup (change here to make duty or frequency controllable) ldi Temp, 0b01000011 ; OC1A enable, 8bit PWM out TCCR0A, Temp ldi Temp, 0b00001100 ; I/O clk/256, OCR0A=frequency control out TCCR0B, Temp ;; interrupt setup ldi Temp, (1 << ISC11) out MCUCR, Temp ldi Temp, (1 << INT1) out GIMSK, Temp sei LOOP: rjmp LOOP
ご参考まで。
匿名
画面が真っ暗、でもカーソルは出てる状況。
探して、ここにたどり着きました。
パスワード入力で、復活!
修理に出す寸前でした。ホントにありがとう!