最近两周用了两个IC(PIC16系列与STM8S系列)做了个产品,首次接触,遇到些问题,总结如下:
1:PIC16模拟串口发送数据,一定要在中断服务函数中执行
static void interrupt SystemISR(void)
{
if(TMR0IE && TMR0IF) //32MHz 104us
{
if(txCount)
//检测数据是否发送完毕
{
TXD=(txData&0x01);
//输出数据
txData=(txData>>1);
//移位数据
--txCount;
}
else //发送完毕后进行停止位发送
{
if(txFlag)
{
TXD=1;
txFlag=false;
}
else
{
TMR0IE=0; //发送完毕后关闭定时器中断
}
}
TMR0 = 0xcf;
//初值
TMR0IF=0;
}
}
//模拟串口发送一个byte
void emulatedUardSendChar(unsigned char data)
{
while(TMR0IE);//等待上一次数据发送完毕
TXD=0; //发送起始位
TMR0 = 0xcf; //初始值
TMR0IF = 0;
//清零定时器中断
TMR0IE = 1;
//定时器0中断使能
txData = data; //转移数据到发送缓存
txCount = 8; //预置需要发送的位个数(8位数据)
txFlag = true; //数据发送完毕标志
}
2:ADC采样50HZ的正弦波
ADC时时采样,50HZ就是20ms一个周期,可以连续采样2个周期,40ms采样300次,找出其中最大值与最小值计算出有效值,这是不太精确的方式,暂时这样解决。
上述方法不是很精确,找到一种更精确的方法。
20ms一个周期内采样40个点,500us一次,对40个值平方求和再开方就能求出真实有效值,不只是对于正弦波,进而求出电压值。
3:STM8S FLASH大小只有8K,代码编译经常超出其大小。
其一:尽量少用库函数,直接写寄存器
其二:IAR都有其优化级别,选最高。
其三:代码尽量不要冗余。