王昱顺 发表于 2024-11-15 11:48:42

vb2002 发表于 2024-11-15 11:39
已经把泄放电阻加到680K 了.
P32引脚的判定还是快.按照欧姆定律,这个RC电路,放完22uf的电,应该要75秒
...

同时,能否给出更完整的电路图?只给出一部分我没办法做出更进一步的判断。
目前我的理解是:你的单片机在切换挡位的时候供电会被切断?然后下一次上电的时候判断电容是否有点来区分第一次上电/短暂的切换挡位

vb2002 发表于 2024-11-15 12:04:28

王昱顺 发表于 2024-11-15 11:48
同时,能否给出更完整的电路图?只给出一部分我没办法做出更进一步的判断。
目前我的理解是:你的单片机 ...


这个是完整的电路图.


vb2002 发表于 2024-11-15 12:04:43

王昱顺 发表于 2024-11-15 11:48
同时,能否给出更完整的电路图?只给出一部分我没办法做出更进一步的判断。
目前我的理解是:你的单片机 ...

sbit CAP=P3^2;
//u8 time;
//bit flag;
sbit led=P5^5;

unsigned int eepromid=0x0005;
unsigned char dat;
bit ispcap;

u8 ledee ()
{
//        delayms(5);
        while(1)
        {
       
       dat = IapRead(eepromid +1);                //开始就eepromid == 0x0a02
               
       if(dat==0xff)                                //如果eepromid == 0xff
       {
       if(ispcap )       
       {
       dat=IapRead(eepromid);                //eepromid == 0x0a01

                switch(dat)
                {
                        case 1: IapProgram(eepromid+1, 250);break;
                        case 250: IapProgram(eepromid+1, 210);break;
                        case 210: IapProgram(eepromid+1, 120);break;
                        default: IapProgram(eepromid+1,1);break;
                }
       }
        else

               dat=IapRead(eepromid-1);

                return dat;
       }
                else
                {
                eepromid++;
                }
                if(eepromid>= 0xffd)
                {
//                        eepromid=0x0ff5;
                        IapErase(0x0000);                                //擦除扇区
                        IapErase(0x0200);                                //擦除扇区       
                        IapErase(0x0400);                                //擦除扇区       
                        IapErase(0x0600);                                //擦除扇区       
                        IapErase(0x0800);                                //擦除扇区       
                        IapErase(0x0A00);                                //擦除扇区       
                        IapErase(0x0C00);                                //擦除扇区       
                        IapErase(0x0E00);                                //擦除扇区                               
                        return 1;
                }
        }
}

void main()
{
        led=0;
        sys_init();
        ledee();
        CCAP1H=dat;

        UartSend((eepromid>>8)&0xff);               
        UartSend(eepromid&0xff);
        UartSend(dat&0xff);
        UartSend(CAP&0xff);
        UartSend(CCAP1H&0xff);

        while(1)
        {       
//        if(flag){
//        flag=0;
//         UartSend((eepromid>>8)&0xff);               
//        UartSend(eepromid&0xff);
//        UartSend(dat&0xff);       
//                }               

        }
}

void sys_init(void)
{
        P_SW2|=0x80;

         P3M0 = 0x0c; P3M1 = 0x00;

        ispcap=CAP;


//    P3M0 = 0x00; P3M1 = 0xfc;                //除p3031全高阻 p32也高阻,加上拉
//    P3PU = 0x04;                                         //p32也高阻,加上拉
//    P5M0 = 0x20; P5M1 = 0xff;                       //P55开漏, 其他高阻,
//    P5PU = 0x20;                                         //P55上拉
//    P5M0 = 0x10; P5M1 = 0xff;                 //P54开漏, 其他高阻,
//    P5PU = 0x10;                                         //P54内部上拉4k

//        IT0=1;EX0=1;                                //外部中断0 P32
        INTCLKO|=0x40;           IP2=0x10;        //EX4=1; 允许INT4外部中断 不停电下载
        EA=1;                                                //总中断
        UartInit();
        Timer0_Init();
        PWM_init();
}

王昱顺 发表于 2024-11-15 12:19:20

vb2002 发表于 2024-11-15 12:04


是这样的,你的代码写错了
应该在设置io模式前进行读取,不然你始终只能读到1

正确的代码应该是:
P_SW2|=0x80;
ispcap=CAP;
P3M0 = 0x0c; P3M1 = 0x00;
CAP=1;

vb2002 发表于 2024-11-15 12:38:39

王昱顺 发表于 2024-11-15 12:19
是这样的,你的代码写错了
应该在设置io模式前进行读取,不然你始终只能读到1



改了. 还是一样的.
判定时间太短了.
要在30ms内才能有电平变化.

王昱顺 发表于 2024-11-15 12:48:57

vb2002 发表于 2024-11-15 12:38
改了. 还是一样的.
判定时间太短了.
要在30ms内才能有电平变化.

不会的,我用100k配0.01uf(103)电容测了一下掉电曲线,都能测到70ms。
你这个这么大的电容不应该的。
有没有示波器或者万用表测试一下断电后的电压曲线。


vb2002 发表于 2024-11-15 12:50:56

本帖最后由 vb2002 于 2024-11-15 12:54 编辑

王昱顺 发表于 2024-11-15 12:48
不会的,我用100k配0.01uf(103)电容测了一下掉电曲线,都能测到70ms。
你这个这么大的电容不应该的。
...
我刚拆了看了一下.   虚焊了.
电阻掉了.
我重新焊上去试下.

vb2002 发表于 2024-11-15 13:09:15

王昱顺 发表于 2024-11-15 12:48
不会的,我用100k配0.01uf(103)电容测了一下掉电曲线,都能测到70ms。
你这个这么大的电容不应该的。
...

我刚刚有重新焊接了. 还是不行
但是我想到问题所在了.
会不会是因为判断p32 引脚本来就没有问题.
问题来自于已经断电了. 单片机没有供电.
马上就关机了. 这个时候eeprom没有足够的电压来写入下一个档位 的eeprom数据

王昱顺 发表于 2024-11-15 13:37:17

vb2002 发表于 2024-11-15 13:09
我刚刚有重新焊接了. 还是不行
但是我想到问题所在了.
会不会是因为判断p32 引脚本来就没有问题.


你在断电的时候写eeprom?
不应该是上电的时候写嘛,记录当前的值。
下次根据eeprom和p32联合判断是该清空还是继续更改状态

vb2002 发表于 2024-11-15 14:21:49

我也有点懵了.
现在我加大电容,确实可以增加那个P32引脚为1 的时间.
并了电阻以后,没有任何变化.
按照 放电电阻的时间来看,应该是有变化的.

现在的实际情况,就是我需要超快速的关机开机,才可以换挡
页: 1 2 [3] 4 5 6 7
查看完整版本: (已解决)刚解决一个问题,又来新的问题.关于电容充电时间