我正在构建一个鼓机,我已经存储了一个带有kick声音的示例头文件,它的值介于0和170之间。我想通过SPI将其发送到10位MCP4811 DAC,然后将其输出到3.5毫米音频插孔。
我有我的MISO,MOSI,SCK和复位引脚连接到我的USB编程器以及DAC。
这里是存储在"samples. h"中的音频文件的片段。
unsigned const char sample_1[2221] PROGMEM = {0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, ...}
unsigned int sample_len[1] = {2221}
因此,它是2221位的样本。我想用SPI发送到DAC,频率=22 kHz。
我使用的是一个16兆赫的晶体,所以我设置了相应的保险丝来使用它。
我使用的计时器溢出22千赫。
volatile unsigned int sample_count[1] = {0};
volatile unsigned int audio_out = 0;
volatile unsigned char spi_junk;
int main (void)
sei();
DDRB = 0b10110000; //Set MOSI, SCK and SS as output.
PORTB = (1 << PINB4) //active low on SS.
TIMSK1 = (1<<OCIE1A); //Enable interrupt
TCCR1B = (1<<WGM12) | (1<<CS11); // set CTC mode and divide clk by 8
OCR1A = 91; //16 MHz/(8*91) ~ 22068 Hz
//SPI Init
SPCR = (1<<SPE) | (1<<MSTR); //master, 8 MHz
SPSR = (1<<SPI2X);
ISR (TIMER1_COMPA_vect) {
audio_out = 0;
//If play_track == 1, then the sound should be played back.
if (play_track && sample_count[0] < sample_len[0]){
audio_out += (pgm_read_byte(&(sample_1[sample_count[0]++)));
// send audio_out to 10-bit DAC on SPI
PORTB &= ~(1<<PINB4); // B.4 (DAC /CS)
SPDR = (char) ((audio_out >> 6) & 0x000f); //byte 1 0 0 0 0 b9 b8 b7 b6
while (!(SPSR & (1<<SPIF)));
spi_junk = SPDR;
SPDR = (char) ((audio_out & 0x003f) << 2); //byte 2 b5 b4 b3 b2 b1 b0 0 0
while (!(SPSR & (1<<SPIF)));
spi_junk = SPDR;
PORTB |= (1<<PINB4);
}
我的密码设置是。
Atmega644-
MOSI -> SDI
SCK -> SCK
SS -> /CS
关于MCP4811
Vdd -> 5V
Vss -> GND
V_out -> Audio jack.
MCP4811上的其余引脚未连接到任何设备。
我已经看到,通过在液晶屏上显示audio_out值,audio_out正在按预期工作。但是没有输出到DAC。有人看到可能出了什么问题吗?
匿名用户
代码中没有SPI初始化。
添加到main()
SPSR = (1 << SPI2X); // double speed (to get maximum of 8MHz output)
SPCR = (1 << SPE) | (1 << MSTR); // 1:1 prescaler, master mode, SPI mode 0, SPI enable
代码中还有几点注释:
仅在完成所有初始化后使用sei(),以避免未初始化外设上发生中断。
最好先设置PB4高,然后将其设置为输出,以避免两个命令之间的PB输出低:
PORTB = (1 << PINB4) //active low on SS.
DDRB = 0b10110000; //Set MOSI, SCK and SS as output.
你这里的线
SPDR=(字符)(音频输出
将¨SHDN设置为0,这将关闭DAC
0=关闭设备。模拟输出不可用。VOUT引脚连接到500千欧(典型)
将位12改为1
SPDR=(字符)(音频输出
来自数据表
1=激活模式操作。VOUT可用。
我使用SPI通信尝试连接我的Arduino Mega 2560作为主从ADC芯片()在外部时钟模式,但我一直收到相同的值或所有零每当我运行我的代码。还有一个触摸屏(工作)连接。除了与Arduino的ADC芯片通信外,一切正常。 我尝试删除定义头,并改变时钟。也不要改变任何东西(这可能是因为其他错误)。 错误包括RB1=255;RB2=255;RB3=255或全部为零。
有人能找出为什么我的不能工作。也许我错过了什么。我意识到这可能是愚蠢的没有任何更多的上下文比我所展示的,但请您询问,我将很乐意提供更多。 这是一段很大的代码,所以我不知道如何用它生成SSCE。您正在查看的是子类的构造函数,它包含3个面板。此时,只是一个。方法打开一个filechooser,然后加载选定的图像,该图像被绘制到上。图像显示良好,一切正常,除了我调整窗口大小时,没有滚动条。
我今天想使用,但出现了如下错误: 所以我想我应该清除并重新安装(如下所示)https://www.rosehosting.com/blog/how-to-install-pip-on-ubuntu-16-04/)但仍然得到: 我怎样才能提高我的水平
下面是一个链表的简单实现。我刚刚添加了相关代码。首先,我向列表中添加一些值,10,990和10000。当我搜索相同的值时,对于key=10,我得到true,但是对于key=990和key=10000得到false,尽管它应该是true。另外,如果我将第二个值从990更改为99,并搜索key=99,这一次我得到的是true。 我不确定是否使用泛型类型。我想我在那里做错了什么。因为如果我用int替换泛
问题内容: 首先,创建数据库。 我将“南”添加到已安装的应用程序中。然后,我转到本教程:http : //south.aeracode.org/docs/tutorial/part1.html 本教程告诉我要这样做: 太好了,现在我迁移了。 但这给了我这个错误… 因此,我使用Google(它永远都行不通。因此我在Stackoverflow上问了870个问题),并得到以下页面:http : //gr