ATtiny2313でのステレオサウンド再生テストです。
FT245RLモジュールと、ATtiny2313を使い、きわめて簡単な回路でやってみました。 データは単に垂れ流しているだけです。 これで少しだけBitBangモードの使い方がわかったような気がします。 回路はこんな感じ。 端子はすべてFT245RLのものです。
ポートが8ビットなので、LSBの1ビットをLRチャネルの選択に使い、実質7ビットですが、サンプリング周波数は結構高いので、それなりに聞こえます。 ただ、結構プチプチとDCっぽいノイズが乗りますね。 LPFのカットオフはデューティ比50%の時に約16kHzなのですが。
AVRを20MHzで使っているので、PWMの周波数は次のようになります。
20,000,000 / 256 = 78,125 (Hz)
そこで、ffmpegを使い、次のようにして8ビットステレオファイルを作ります。
ffmpeg -i ソースファイル -f rawvideo -acodec pcm_u8 -vn -ar 39062 出力ファイル
この出力ファイルを次のようなソースで吐き出せばokです。
#include <windows>
#include <stdio.h>
#include <sys/unistd.h>
#include "ftd2xx.h"
int main(int argc, char **argv) {
FT_HANDLE ftHandle;
FT_STATUS ftStatus;
DWORD written;
unsigned int count = 0, i;
unsigned char val[4096];
FILE *in;
if (argc < 2) {
fprintf(stderr, "Usage: %s \n", argv[0]);
return 1;
}
if (!(in = fopen(argv[1], "rb"))) {
fprintf(stderr, "Error: opening input: %s\n", argv[1]);
return 1;
}
ftStatus = FT_Open(0, &ftHandle);
if (ftStatus != FT_OK) {
fprintf(stderr, "Error: opening USB device\n");
return 1;
}
ftStatus = FT_SetBitMode(ftHandle, 0xff, 1);
if (ftStatus != FT_OK) {
fprintf(stderr, "Error: initializing USB device\n");
return 1;
}
ftStatus = FT_SetUSBParameters(ftHandle, 4096, 0);
if (ftStatus != FT_OK) {
fprintf(stderr, "Error: setting USB buffer size\n");
return 1;
}
ftStatus = FT_SetBaudRate(ftHandle, 78125 / 2 / 2);
if (ftStatus != FT_OK) {
fprintf(stderr, "Erro: setting baud rate\n");
return 1;
}
while (1) {
if (!fread(val, 4096, 1, in)) {
break;
}
for (i = 0; i < 4096; i++) {
if (i % 2) {
val[i] |= 1; // right
} else {
val[i] &= 0xfe; // left
}
}
FT_Write(ftHandle, val, 4096, &written);
if (written == 0) {
break;
}
}
FT_Close(ftHandle);
fclose(in);
return 0;
}
AVR側はきわめて簡単で、次のようなソースになります。
#include <avr/io.h>
#include <avr/interrupt.h>
ISR(TIMER0_OVF_vect) {
unsigned char val = (PINB & 0xfb) | (PIND & 0x04);
unsigned char channel = val & 0x01;
val &= 0x0fe;
if (channel) {
OCR0A = val; // right
} else {
OCR0B = val; // left
}
}
int main() {
PORTB = 0xff;
PORTD = _BV(PD2);
DDRB = _BV(PB2);
DDRD = _BV(PD5);
TCCR0A = 0b10100011; // OSCA enable, OSCB enable, fast PWM
TCCR0B = 0b00000001; // OSC=fCPU
TIMSK = _BV(TOIE0);
sei();
while (1);
return 0;
}
FT245RLのボーレートの設定が、サンプリング周波数の半分(78125/4)なのが謎。 これをサンプリング周波数と同じに設定してしまうと、再生が倍速になってしまいます。
匿名
画面が真っ暗、でもカーソルは出てる状況。
探して、ここにたどり着きました。
パスワード入力で、復活!
修理に出す寸前でした。ホントにありがとう!