欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
請教一下大佬們關于IAP15w4k58s4型號單片機比較器的問題
[打印本頁]
作者:
小烏鴉
時間:
2019-12-25 15:54
標題:
請教一下大佬們關于IAP15w4k58s4型號單片機比較器的問題
求大佬幫幫忙,我使用的是IAP15w4k58s4單片機,進行掉電保存驗證,結果測試比較器沒起作用怎么回事,燒錄哪里我已經設置了允許低壓中斷還有允許低壓eeprom操作,不知道還有哪里出了問題,感激不盡
#include "STC15W4K.H"
#include "intrins.h"
#include "time_uart.h"
#include <stdio.h>
#define uint unsigned int
#define uchar unsigned char
#define CMD_IDLE 0 //空閑模式
#define CMD_READ 1 //IAP字節讀命令
#define CMD_PROGRAM 2 //IAP字節編程命令
#define CMD_ERASE 3 //IAP扇區擦除命令
#define ENABLE_IAP 0x83 //ifSYSCLK<12MHZ
#define IAP_address 0x0400
//sfr CMPCR1 = 0xE6; //比較器控制寄存器1
#define CMPEN 0x80 //比較器模塊使能
#define CMPIF 0x40 //比較器中斷標志位
#define PIE 0x20 //比較器上升沿中斷使能位
#define NIE 0x10 //比較器下降沿中斷使能位
#define PIS 0x08 //比較器正極選擇位
#define NIS 0x04 //比較器負極選擇位
#define CMPOE 0x02 //比較器輸出控制位
#define CMPRES 0x01 //比較器比較結果位
//sfr CMPCR2 =0xE7; //比較器控制寄存器2
#define INVCMPO 0x80 //比較器結果反向輸出控制位
#define DISFLT 0x40 //比較器輸出端濾波使能位
#define LCDTY 0x3F //比較器輸出的區抖時間控制
void delayms(uint n);
void iap_idle();
uint iap_readbyte(uint addr);
void iap_writebyte(uint addr,uint dat);
void iap_erase_sector(uint addr);
uint num;
void cmp_iar() interrupt 21 using 1
{
CMPCR1&=~CMPIF; //掉電后觸發下降沿中斷,向flash寫入數據
iap_erase_sector(0x400);
iap_writebyte(0x400,num);
}
void main()
{
P5M0=0;
P5M1=0;
P55=1;
num=9;
init_uart();
CMPCR1=0; //初始化比較器寄存器1和2
CMPCR2=0;
CMPCR1&=~PIS; //選擇外部管腳P55 CMP+作為比較器正極輸入源
CMPCR1&=~NIS; //選擇內部BandGap電壓作為比較器負極輸入源
CMPCR1&=~CMPOE; //禁用比較器的比較結果輸出
CMPCR2&=~INVCMPO; //比較器比較結果正常輸出到P12
CMPCR2&=~DISFLT; //使能比較器輸出端0.1us濾波電路
CMPCR2&=~LCDTY; //比較器結果不去抖動直接輸出
//CMPCR1|=PIE; //使能比較器上升沿中斷
CMPCR1|=NIE; //使能比較器下降沿中斷
CMPCR1|=CMPEN; //使能比較器
EA=1;
// if(iap_readbyte(0x400)!=9)
// iap_erase_sector(0x400);
while(1)
{
if(iap_readbyte(0x400)==9)
{
// CMPCR1&=~CMPEN; //失能比較器
while(1)
{
delayms(1000);
SBUF='0';
while(!TI);
TI=0;
}
}
if(CMPCR1&CMPRES) //正常狀態CMP也就是P55大于BandGap電壓,沒問題
{
delayms(1000);
SBUF='9';
while(!TI);
TI=0;
}
else //掉電后,我以為可能程序還會走一點,結果中斷沒進入這里也沒進入
{
iap_erase_sector(0x400);
iap_writebyte(0x400,num);
}
}
}
void delayms(uint n)
{
uint j,k;
for(j=0;j<n;j++)
for(k=0;k<111;k++); //時鐘頻率11.0592MHZ
}
//關閉IAP
void iap_idle()
{
IAP_CONTR=0;
IAP_CMD=0;
IAP_TRIG=0;
IAP_ADDRH=0x80;
IAP_ADDRL=0;
}
//從ISP IAP EEPROM區域讀取一個字節
uint iap_readbyte(uint addr)
{
uint dat;
IAP_CONTR=ENABLE_IAP;
IAP_CMD=CMD_READ;
IAP_ADDRL=addr;
IAP_ADDRH=addr>>8;
IAP_TRIG=0x5A;
IAP_TRIG=0xA5;
_nop_();
dat=IAP_DATA;
iap_idle();
return dat;
}
//寫一字節數據到ISP IAP EEPROM區域
void iap_writebyte(uint addr,uint dat)
{
IAP_CONTR=ENABLE_IAP;
IAP_CMD=CMD_PROGRAM;
IAP_ADDRL=addr;
IAP_ADDRH=addr>>8;
IAP_DATA=dat;
IAP_TRIG=0x5A;
IAP_TRIG=0xA5;
_nop_();
iap_idle();
}
//扇區擦去
void iap_erase_sector(uint addr)
{
IAP_CONTR=ENABLE_IAP;
IAP_CMD=CMD_ERASE;
IAP_ADDRL=addr;
IAP_ADDRH=addr>>8;
IAP_TRIG=0x5A;
IAP_TRIG=0xA5;
_nop_();
iap_idle();
}
作者:
Y_G_G
時間:
2019-12-25 16:30
STC的電壓比較器的使用方法太反人類了,要設定一大堆寄存器,而且,輸出結果并不是單純的+-兩個端口的電壓大小關系,太扯了
掉電保存的話,還是用外部中斷吧,如果中斷不夠用,那就直接檢測某個端口的電平狀態吧,反正都比電壓比較器好使
作者:
小烏鴉
時間:
2019-12-25 19:20
我直接通過杜邦線拉低P55能進入中段,說明比較器可以用,而現在問題是我驗證用的單片機是最小系統的板子,是不是這個比較器需要外部電路才可實現,之前我是直接斷電驗證的,我以為本身芯片里面就會配置有啥的,這樣就斷電后還可以運行一小會這樣
作者:
wulin
時間:
2019-12-25 21:11
掉電保存需要外部硬件支持。最簡單的方法是供MCU的VCC有足夠大的電容,當檢測到外部掉電時,立即把相關數據保存在EEPROM中。一般維持1~2秒VCC無明顯下降,足可以保存1000個字節。并不是樓主認為的利用低壓檢測功能來完成此項工作。
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1