久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2340|回復: 3
收起左側

請教一下大佬們關于IAP15w4k58s4型號單片機比較器的問題

[復制鏈接]
ID:660830 發表于 2019-12-25 15:54 | 顯示全部樓層 |閱讀模式
求大佬幫幫忙,我使用的是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();
}

回復

使用道具 舉報

ID:401564 發表于 2019-12-25 16:30 | 顯示全部樓層
STC的電壓比較器的使用方法太反人類了,要設定一大堆寄存器,而且,輸出結果并不是單純的+-兩個端口的電壓大小關系,太扯了
掉電保存的話,還是用外部中斷吧,如果中斷不夠用,那就直接檢測某個端口的電平狀態吧,反正都比電壓比較器好使
回復

使用道具 舉報

ID:660830 發表于 2019-12-25 19:20 | 顯示全部樓層
我直接通過杜邦線拉低P55能進入中段,說明比較器可以用,而現在問題是我驗證用的單片機是最小系統的板子,是不是這個比較器需要外部電路才可實現,之前我是直接斷電驗證的,我以為本身芯片里面就會配置有啥的,這樣就斷電后還可以運行一小會這樣
回復

使用道具 舉報

ID:213173 發表于 2019-12-25 21:11 | 顯示全部樓層
掉電保存需要外部硬件支持。最簡單的方法是供MCU的VCC有足夠大的電容,當檢測到外部掉電時,立即把相關數據保存在EEPROM中。一般維持1~2秒VCC無明顯下降,足可以保存1000個字節。并不是樓主認為的利用低壓檢測功能來完成此項工作。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国内久久 | 亚洲综合无码一区二区 | www.蜜桃av | 在线观看成人小视频 | 国产一区二区影院 | 国产精品国产馆在线真实露脸 | 亚洲三级在线 | av影片在线| 亚洲三级av | 欧美成视频 | 一级片毛片 | 中文字幕亚洲区一区二 | 国产成人av电影 | 国产精品区一区二 | 色综合久久天天综合网 | 国产成人精品一区二区三区视频 | 91在线资源 | 国产成都精品91一区二区三 | 精品久久久网站 | 国产精品久久久久aaaa九色 | 国产成人免费视频网站高清观看视频 | 亚洲人成人一区二区在线观看 | 国产成人精品免高潮在线观看 | 国产一级片一区二区 | 国产精品99久久久久久宅男 | 中文字幕一区在线 | 亚洲精品一区二区三区四区高清 | 小视频你懂得 | 日本亚洲欧美 | 特a毛片 | 男女啪啪高潮无遮挡免费动态 | 噜噜噜噜狠狠狠7777视频 | 日韩精品久久一区二区三区 | 免费观看毛片 | 久久综合久久综合久久 | 亚洲理论在线观看电影 | 欧美精品在线一区 | 男人久久天堂 | 亚洲精品视频久久 | 久久美女视频 | 精品一区二区电影 |