王昱顺
发表于 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 的时间.
并了电阻以后,没有任何变化.
按照 放电电阻的时间来看,应该是有变化的.
现在的实际情况,就是我需要超快速的关机开机,才可以换挡