找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 2254|回復(fù): 3
打印 上一主題 下一主題
收起左側(cè)

請(qǐng)教一下大佬們關(guān)于IAP15w4k58s4型號(hào)單片機(jī)比較器的問(wèn)題

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:660830 發(fā)表于 2019-12-25 15:54 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
求大佬幫幫忙,我使用的是IAP15w4k58s4單片機(jī),進(jìn)行掉電保存驗(yàn)證,結(jié)果測(cè)試比較器沒(méi)起作用怎么回事,燒錄哪里我已經(jīng)設(shè)置了允許低壓中斷還有允許低壓eeprom操作,不知道還有哪里出了問(wèn)題,感激不盡

#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字節(jié)讀命令
#define CMD_PROGRAM        2                 //IAP字節(jié)編程命令
#define CMD_ERASE        3                 //IAP扇區(qū)擦除命令
#define ENABLE_IAP  0x83         //ifSYSCLK<12MHZ

#define IAP_address                0x0400

//sfr CMPCR1 = 0xE6;                //比較器控制寄存器1
#define CMPEN        0x80        //比較器模塊使能
#define CMPIF         0x40        //比較器中斷標(biāo)志位
#define PIE                0x20        //比較器上升沿中斷使能位
#define NIE                0x10        //比較器下降沿中斷使能位
#define PIS                0x08        //比較器正極選擇位
#define NIS                0x04        //比較器負(fù)極選擇位
#define CMPOE        0x02        //比較器輸出控制位
#define CMPRES        0x01        //比較器比較結(jié)果位

//sfr        CMPCR2        =0xE7;                //比較器控制寄存器2
#define INVCMPO        0x80        //比較器結(jié)果反向輸出控制位
#define        DISFLT        0x40        //比較器輸出端濾波使能位
#define LCDTY        0x3F        //比較器輸出的區(qū)抖時(shí)間控制
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;                           //掉電后觸發(fā)下降沿中斷,向flash寫入數(shù)據(jù)
           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;                //選擇內(nèi)部BandGap電壓作為比較器負(fù)極輸入源
        CMPCR1&=~CMPOE;                //禁用比較器的比較結(jié)果輸出
        CMPCR2&=~INVCMPO;        //比較器比較結(jié)果正常輸出到P12
        CMPCR2&=~DISFLT;        //使能比較器輸出端0.1us濾波電路
        CMPCR2&=~LCDTY;                //比較器結(jié)果不去抖動(dòng)直接輸出
        //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)         //正常狀態(tài)CMP也就是P55大于BandGap電壓,沒(méi)問(wèn)題
                {
                        delayms(1000);
                        SBUF='9';
                        while(!TI);
                        TI=0;
                }
                else   //掉電后,我以為可能程序還會(huì)走一點(diǎn),結(jié)果中斷沒(méi)進(jìn)入這里也沒(méi)進(jìn)入
                {
                         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++); //時(shí)鐘頻率11.0592MHZ
}

//關(guān)閉IAP
void iap_idle()
{
        IAP_CONTR=0;
        IAP_CMD=0;
        IAP_TRIG=0;
        IAP_ADDRH=0x80;
        IAP_ADDRL=0;
}

//從ISP IAP EEPROM區(qū)域讀取一個(gè)字節(jié)

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;
}

//寫一字節(jié)數(shù)據(jù)到ISP IAP EEPROM區(qū)域
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();
}

//扇區(qū)擦去
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();
}

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:401564 發(fā)表于 2019-12-25 16:30 | 只看該作者
STC的電壓比較器的使用方法太反人類了,要設(shè)定一大堆寄存器,而且,輸出結(jié)果并不是單純的+-兩個(gè)端口的電壓大小關(guān)系,太扯了
掉電保存的話,還是用外部中斷吧,如果中斷不夠用,那就直接檢測(cè)某個(gè)端口的電平狀態(tài)吧,反正都比電壓比較器好使
回復(fù)

使用道具 舉報(bào)

板凳
ID:660830 發(fā)表于 2019-12-25 19:20 | 只看該作者
我直接通過(guò)杜邦線拉低P55能進(jìn)入中段,說(shuō)明比較器可以用,而現(xiàn)在問(wèn)題是我驗(yàn)證用的單片機(jī)是最小系統(tǒng)的板子,是不是這個(gè)比較器需要外部電路才可實(shí)現(xiàn),之前我是直接斷電驗(yàn)證的,我以為本身芯片里面就會(huì)配置有啥的,這樣就斷電后還可以運(yùn)行一小會(huì)這樣
回復(fù)

使用道具 舉報(bào)

地板
ID:213173 發(fā)表于 2019-12-25 21:11 | 只看該作者
掉電保存需要外部硬件支持。最簡(jiǎn)單的方法是供MCU的VCC有足夠大的電容,當(dāng)檢測(cè)到外部掉電時(shí),立即把相關(guān)數(shù)據(jù)保存在EEPROM中。一般維持1~2秒VCC無(wú)明顯下降,足可以保存1000個(gè)字節(jié)。并不是樓主認(rèn)為的利用低壓檢測(cè)功能來(lái)完成此項(xiàng)工作。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表