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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2208|回復: 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();
}

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

使用道具 舉報

沙發
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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 天天玩天天干天天操 | 欧美无乱码久久久免费午夜一区 | 亚洲成人av在线播放 | 成人在线视频免费看 | 日本不卡免费新一二三区 | 欧美成人一级视频 | 色一级 | 亚洲免费网 | 久久亚洲国产 | 久久小视频 | 成人av在线播放 | 天堂成人国产精品一区 | 欧美.com | 日本特黄a级高清免费大片 成年人黄色小视频 | 青青草在线视频免费观看 | 国产99视频精品免费播放照片 | 欧美一区二区免费 | 亚洲视频在线看 | 成人在线观看免费视频 | 亚洲精品自在在线观看 | 亚洲一区二区三区在线 | 日日日视频 | 涩涩视频在线观看免费 | 欧美一a一片一级一片 | 狠狠干美女 | 日韩电影a| 中文字幕一区二区三区精彩视频 | 一级片免费在线观看 | 一级欧美黄色片 | 中国av在线免费观看 | 日本久久精品视频 | 国产精品地址 | 国产精品国产 | 99久久99| 日韩在线不卡 | 久久久久久久久久久一区二区 | 亚洲精品视频导航 | 欧美h版| 中文av电影 | 自拍偷拍一区二区三区 | 亚洲综合在线视频 |