xxkj2010
发表于 2024-1-4 11:46:08
梁工 发表于 2024-1-4 11:32
不是,频率计的计数是纯硬件完成的,中断不会导致误差。
造成误差的原因是使用的是内部时钟,秒级的间隔 ...
同一时刻同一环境,芯片内部的IRC振荡频率会漂移吗?
梁工
发表于 2024-1-4 12:09:38
本帖最后由 梁工 于 2024-1-4 12:15 编辑
xxkj2010 发表于 2024-1-4 11:44
恒温晶振一个近100元,那不如买个二手的频率计呢。频率计应该都用上恒温晶振吧? ...
便宜的频率计一般都是10ppm级别的精度。那些国外大牌子的不知道。
“那不如买个二手的频率计呢”,这让我想起了一句话:造不如买,买不如租!这可就是当前光刻机、高端芯片等等的困境。
我这样提示,是想让人多学学技术。如果什么都去买,那没必要学电子技术了,因为对一般的玩电子的人来说,你想要的,这个世界基本都有了,某宝搜搜基本都能买到。比如一个红外遥控器,5毛钱就可以买一本,为什么要自己做?所以,我觉得好多人红外遥控器、接收程序都做不好。
梁工
发表于 2024-1-4 12:10:12
xxkj2010 发表于 2024-1-4 11:46
同一时刻同一环境,芯片内部的IRC振荡频率会漂移吗?
秒级的间隔,抖动在0.1%~0.2%左右。
xxkj2010
发表于 2024-1-11 12:09:18
本帖最后由 xxkj2010 于 2024-1-11 12:10 编辑
梁工 发表于 2024-1-3 14:37
做频率计,可以参考我的示波器的频率计:P3.5(T1)输入频率信号,P3.3是闸门信号。
大佬,没有你的水平,现在参考你的示波器代码,还是无法实现外部中断1(无法等到中断)
//PWMB 设置
PWMB_ENO = 0; // IO输出禁止
PWMB_IER = 0; // 禁止中断
PWMB_SR1 = 0; // 清除状态
PWMB_SR2 = 0; // 清除状态
ccer1 = 0;
ccer2 = 0;
PWMB_ISR_En = 0;
PWMB_PSCRH = (u8)((24000-1)/256); // 预分频寄存器, 分频 Fck_cnt = Fck_psc/(PSCR[15:0}+1), 边沿对齐PWM频率 = SYSclk/((PSCR+1)*(AAR+1)), 中央对齐PWM频率 = SYSclk/((PSCR+1)*(AAR+1)*2).
PWMB_PSCRL = (u8)((24000-1)%256);
PWMB_ARRH= (u8)(1010/256); // 自动重装载寄存器,控制PWM周期
PWMB_ARRL= (u8)(1010%256);
PWMB_CCMR3= 0x68; // 通道模式配置, PWM模式1, 预装载允许
PWMB_CCR3H= (u8)(1000/256); // 比较值, 控制占空比(高电平时钟数)
PWMB_CCR3L= (u8)(1000%256);
ccer2 |= 0x05; // 开启比较输出, 高电平有效
// PWMB_ISR_En|= 0x08; // 使能中断
PWMB_CCER1= ccer1; // 捕获/比较使能寄存器1
PWMB_CCER2= ccer2; // 捕获/比较使能寄存器2
PWMB_PS |= (1<<4); // 选择IO, 0:选择P2.2, 1:选择P3.3, 2:选择P0.2, 3:选择P7.6,
PWMB_IER = PWMB_ISR_En; //设置允许通道1~4中断处理
PWMB_BKR = 0x80; // 主输出使能 相当于总开关
PWMB_CR1 = 0x81; // 使能计数器, 允许自动重装载寄存器缓冲, 边沿对齐模式, 向上计数,bit7=1:写自动重装载寄存器缓冲(本周期不会被打扰), =0:直接写自动重装载寄存器本(周期可能会乱掉)
PWMB_EGR = 0x01; //产生一次更新事件, 清除计数器和预分频计数器, 装载预分频寄存器的值
PWMB_ENO |= 0x10; // IO输出允许,bit6: ENO8P, bit4: ENO7P,bit2: ENO6P,bit0: ENO5P
void INT1_Isr() interrupt 2
{
LED = ~LED; //测试端口
}单片机是STC8H1K17T,IRC频率24MHz。
是不是因为STC8与STC32的区别?
梁工
发表于 2024-1-11 15:24:15
xxkj2010 发表于 2024-1-11 12:09
大佬,没有你的水平,现在参考你的示波器代码,还是无法实现外部中断1(无法等到中断)
单片机是STC8H1K17 ...
外中断初始化就两行:
EX1 = 1; //允许中断
IT1 = 1; //下降沿中断
EA = 1;
/********************* INT0中断函数 *************************/
void INT1_ISR(void) interrupt INT1_VECTOR
{
frequency = ((u32)freq_H << 16) + ((u32)TH1 << 8) + (u32)TL1;
freq_H = 0; TH1 = 0; TL1 = 0;
B_FrequencyOk = 1;
}
xxkj2010
发表于 2024-1-11 15:50:24
梁工 发表于 2024-1-11 15:24
外中断初始化就两行:
EX1 = 1; //允许中断
IT1 = 1; //下降沿中断
有开外中断1:
EX1 = 1; //允许中断
IT1 = 1; //下降沿中断
EA = 1;
梁工
发表于 2024-1-11 19:16:17
xxkj2010 发表于 2024-1-11 15:50
有开外中断1:
EX1 = 1; //允许中断
IT1 = 1; //下降沿中断
那肯定可以进入外中断INT1的。
xxkj2010
发表于 2024-1-11 20:27:35
梁工 发表于 2024-1-11 19:16
那肯定可以进入外中断INT1的。
这就怪了,今晚终于有一次测试可以让INT1中断了。
而在这之前,多次测试的结果都不成,
甚至当出现这情况的时候,单独测试P33=~P33;(当然有注意到IO模式的配置等问题)都无法让P33正常的翻转,
我真怀疑这是IO口的问题了,反正觉得这IO口怪怪的。
梁工
发表于 2024-1-11 21:47:03
xxkj2010 发表于 2024-1-11 20:27
这就怪了,今晚终于有一次测试可以让INT1中断了。
而在这之前,多次测试的结果都不成,
甚至当出现这情况 ...
那你应该用STC官方的例子测试下。
xxkj2010
发表于 2024-1-12 08:25:33
梁工 发表于 2024-1-11 21:47
那你应该用STC官方的例子测试下。
有呀,发现IO可能有问题,就用STC-ISP中的IO测试程序直接烧到芯片中进行测试,但是结果还是不太稳定,P33口有时会翻转有时不会,所以才怀疑是P33端口有问题。