MCP4822以前是用Arduino控制的,今天有空改了一个,手上只有STC15W408AS,测试通过,但写得简陋,只作参 ...
谢谢chhds老师专门把Arduino控制修改为Keil c,已下载在看,编辑器是Keil uVision4运行卡,准备Keil c学习完转到Arduino。 chhds 发表于 2020-11-7 15:16
MCP4822以前是用Arduino控制的,今天有空改了一个,手上只有STC15W408AS,测试通过,但写得简陋,只作参 ...
chhds老师您好,看您示例是模块化编程昨天补课跟着书本学习了c模块化编程部分:L ,现在正在看您给的示例,软件打开一直卡,通过文本文件看.c和.h文件,发现少了一个intrins.h文件,可能这个原因造成Keil uVision4打开这个示例卡的原因,能否提供intrins.h文件谢谢。 IRF540 发表于 2020-11-6 16:41
那不就是个警告么,一般不理会,愿意加Void或者加个返回值也行 , 按说一样可以生成HEX,用的什么版本编译 ...
O(∩_∩)O哈哈~谢谢,昨天又做I2C读写24C04书本示例时也是出现警告是6个,特意生成HEX可以。上次不能生成HEX文件不再手头回头在试试,还是刚刚接触什么都不熟练。:handshake
补充内容 (2020-11-10 08:13):
重新把矩阵按键程序中的延时函数加 的void取消,出现一个警告后运行可以生成HEX。 pdshyh 发表于 2020-11-9 10:36
chhds老师您好,看您示例是模块化编程昨天补课跟着书本学习了c模块化编程部分 ,现在正在看您给的示 ...
我用的是Keil5,那个h文件可能不是在这个文件夹里的,你把MCP4822.h.c加到你的工程里试试 chhds 发表于 2020-11-9 13:12
我用的是Keil5,那个h文件可能不是在这个文件夹里的,你把MCP4822.h.c加到你的工程里试试
chhds您好, MCP4822是贴片还没焊接,跟书学习是STC52+Keil3,我用的是STC52+Keil4软件命令位置稍有不同其它都一样,看您Delay.c,支持1~255ms. 自动适应主时钟.和书本示例偏差大,MCP4822.h能看明白,
main.c的
void main(void)
{
.....
setVoltage(0, 4000);
.....
}
setVoltage(0, 4000)参数作用没明白,主要是MCP4822.c没看明白,知道SPI_init();等是通信函数setVoltage(0, 4000);是DA转换控制MCP4822,MCP4822.c的SPI通信部分也和书本示例偏差大,STC15+Keil5是否有好多函数直接使用就行,书本STC52+Keil3的SPI通信是软件根据时序软件控制的,差别比较大。:L pdshyh 发表于 2020-11-9 16:06
chhds您好, MCP4822是贴片还没焊接,跟书学习是STC52+Keil3,我用的是STC52+Keil4软件命令位置稍有不同 ...
setVoltage(0, 4000);---------0:设置MCP4822通道A输出(1:设置通道B输出);4000:设置MCP4822输出4000mV(数值在0-4095之间)
买个这样的座,可以很方便测试贴片集成块
chhds 发表于 2020-11-10 09:29
setVoltage(0, 4000);---------0:设置MCP4822通道A输出(1:设置通道B输出);4000:设置MCP4822输出400 ...
谢谢,烧录座刚刚下单买了一个16位的,昨天把MCP4822中文数据表截屏打印阅读,明白void setVoltage(u8 channel, u16 mv)的前半部把设置和电压数据读到command
u16 command = 0;
command |= channel << 15; //0:通道A 1:通道B
......
MCP4822_CS = 0;
SPI_write(command>>8);
SPI_write(command&0xFF);
while(!(SPSTAT & SPIF));
MCP4822_CS = 1;
SPI_write()写有点没弄明白,为什么移位等等操作,在看看书本的SPI通信示例。
还有void SPI_init(void)下面的SPI设置函数没找到.......
{
SPI_Master(); //设为主机
.......
SPI_Enable(); //1: 允许SPI
SPDAT = 0;
}
感谢chhds 老师指教,刚刚接触空白点太多。:handshake
补充内容 (2020-11-10 17:13):
intrins.h文件是C51单片机编程中函数文件找到了,卡应该是低版本软件问题。
补充内容 (2020-11-11 08:29):
刚刚看到 SPI_Master(); //设为主机
SPI_Enable(); //1: 允许SPI
这些都是STC15自带的SPI的内部函数,在STC15Fxxxx.H中找到了,还有AD,c51的reg52.h特别简单。 chhds 发表于 2020-11-7 15:16
MCP4822以前是用Arduino控制的,今天有空改了一个,手上只有STC15W408AS,测试通过,但写得简陋,只作参 ...
chhds 老师好这个是STC15或者 STM8/32 带硬件SDI的示例,我也专门买了片STC15F2K60S2-28就是手工太差,参照您的示例和书本DS1302时钟芯片SDI通信的例子比葫芦画瓢编程还没测试运行有几个警告。
#include<reg52.h> //包含52系列单片机头文件
#include<intrins.h> //包含52系列单片机函数头文件
#define uchar unsigned char//为宏定义,把unsigned char用uchar表示,方便书写
#define uint unsigned int //为宏定义,把unsigned int用uint表示,方便书写
sbit MCP4822_SCL = P2^5; //SCLK
sbit MCP4822_LDAC = P2^4; //LDAC
sbit MCP4822_SDI = P2^3; //SDI
sbit MCP4822_CS = P2^2; //cs
void setVoltage(uchar config, uint dat)
{
uint command = 0;
uchar i;
command |= config << 12; //config 0x01 --A通道 x2最高输出4096mV关闭输出0x00
//config 0x03 --A通道 x1最高输出2048mV关闭输出0x02
//config 0x09 --B通道 x2最高输出4096mV关闭输出0x08
command |= (dat & 0x0FFF); //config 0x0b --B通道 x1最高输出2048mV 关闭输出 0x0b 设置和数据到command
MCP4822_CS =1;//刚开始MCP4822_CS为高电平
MCP4822_LDAC =1 ; //MCP4822_LDAC为高电平
MCP4822_SCL =0; //刚开始MCP4822_SCL为低平
MCP4822_CS = 0;; //ce变为低电平,允许单片机向MCP4822中的寄存器写入设置参数和数据
_nop_(); //稍微延时(一个机器周期)
for (i=0; i<16;i++)
{
MCP4822_SCL=0;
//MCP4822_SDI=command&0x80>>15 ;
command=command<<1 ;
MCP4822_SDI=CY; // command<<1高位溢出最高位自动寄存在CY
MCP4822_SCL=1 ; //config 0x09 --B通道 x2最高输出4096mV关闭输出0x08
}
MCP4822_CS = 1; //设置参数和数据写完之后,把MCP4822_CS拉高,防止对写入的数据进行误操作
_nop_();//稍微延时
MCP4822_SDI=1; //释放MCP4822_SDI数据线
MCP4822_SCL=1; //释放sclk时钟线
MCP4822_LDAC=0; //输入存储器数据传递到DAC存储器。
MCP4822_LDAC=1;
}
处理后还有两个
Build target 'Target 1'
compiling MCP4822.c...
linking...
*** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS
SEGMENT: ?PR?_SETVOLTAGE?MCP4822
*** WARNING L10: CANNOT DETERMINE ROOT SEGMENT
Program Size: data=8.0 xdata=0 code=56
"MCP4822" - 0 Error(s), 2 Warning(s).
在线翻译:***警告L16:未分类的段,忽略了覆盖过程
区隔:?PR?_SETVOLTAGE?MCP4822
***警告L10:无法确定根段
MCP4822写是由高位依次到低位我用左移后MCP4822_SDI=command&0x80>>15 ;还有command<<1左移后高位进入 MCP4822_SDI=CY有点拿不准。
这两个警告在线翻译不准确,你可以把警告或错误的内容复制到百度上搜索一下,就知道意思,也有解决办法了。 case 语句最后加一句case else: 吧 chhds 发表于 2020-11-11 19:31
这两个警告在线翻译不准确,你可以把警告或错误的内容复制到百度上搜索一下,就知道意思,也有解决办法了。
谢谢,百度后基本知道意思,也有解决办法,发现少了main ()主函数:Q wiisir 发表于 2020-11-11 19:48
case 语句最后加一句case else: 吧
谢谢,对用到case 注意。:handshake
页:
1
[2]