这是我的第一个问题,因为我不熟悉编码。
好吧,我正在尝试在SPI中使用MCP数字电位器。当我使用PIC16,用C语言编写时,我了解到XC8库无法包含在PIC16项目中......所以我想我会通过点击,了解我的工作来学习很多东西......
但......似乎没有用!所以我制作了一个有一些延迟的LED版本,以便了解发生了什么。
我有两个问题:首先,“命令”数据似乎没有被转移。事实证明,我只能看到第一位的闪光灯。 “时钟”指示灯工作正常,闪烁8次。
另外,我不明白为什么我的无限循环不是无限的。我得到几个周期然后回调主函数,依此类推。它与我的延迟有关,因为当我改变延迟时它会改变周期数。
这是我的代码:
#include <stdio.h>
#include <pic16f18875.h>
#define temoin LATAbits.LATA0
#define CS LATAbits.LATA1
#define CLK LATAbits.LATA2
#define DAT LATAbits.LATA3
#define MASK = 0x80 //isolate the MSB
unsigned char commande = 0b10011000; //led sequence to be observed (command)
void delay(void)
{ int f, g;
for(f=0;f<1000;f++)
{
for(g=0;g<1;g++)
{ } } } //simple delay
void main()
{
int i;
//init
TRISA=0x00; //porta as output
LATA = 0x00; //init all bits to 0
CS=0; //enable writing
//send command
for (i=0; i<8; i++) //browse through the command byte
{
if (commande & MASK) //read msb and compare
DAT = 1;
else
DAT = 0;
CLK=1; //clock signal
delay();
CLK=0;
delay();
commande <<=1; //left shift, read next bit
}
CS = 1;
while (1) //just a heartbeat
{
temoin = 1;
delay();
temoin = 0;
delay();
}
}
我真的在网上找到了很多信息,但没有一个对我很好。我可能只缺乏特殊的C语言知识,但我不知道是什么。
提前致谢!
干杯
答案 0 :(得分:0)
我很确定你的问题只是你的#define MASK = 0x80 //isolate the MSB
^- ???
搞砸了:
if (commande & MASK) //read msb and compare
该等号最终被视为定义的一部分,因此预处理器将扩展
if (commande & = 0x80) //read msb and compare
为:
commande
这根本不是你想要的!最终会修改if
语句中的0x80
,屏蔽低于=
的所有位。
删除定义中的batman
应解决此问题。
关于另一部分 - 无限循环不是无限 - 确保您的处理器没有启用看门狗定时器。您可能需要在熔丝位中禁用它。