打印
[技术讨论]

STC8G官方例程T0定时1ms实测800us,悬赏30元找问题!

[复制链接]
楼主: henangongda123
手机看帖
扫描二维码
随时随地手机跟帖
21
henangongda123|  楼主 | 2022-11-7 15:21 | 只看该作者 |只看大图 回帖奖励 |倒序浏览
一周一天班 发表于 2022-11-7 14:52
你启动ISP软件后啥也不改,默认11.0592,看看结果。外部晶振需要修改CLKSEL=1.
0.76这个值好像24M和30M的比 ...

还真的被你给整的有点眉目了,如果ISP软件启动后不修改RC频率,选默认的11.0592MHz,其他地方也不动,定时1ms实测是920us,一旦改了RC频率到12MHz,定时1ms就变成800us了!!!这。。。

使用特权

评论回复
22
henangongda123|  楼主 | 2022-11-7 15:31 | 只看该作者
chongdongchen 发表于 2022-11-7 14:52
我刚好有块STC8H的板子,用你的程序试过了没问题,波形1ms翻转正确:建议你不要怕麻烦,新建工程再试试

...

你用的是哪个版本的ISP软件和Keil?

使用特权

评论回复
23
chongdongchen| | 2022-11-7 15:42 | 只看该作者
henangongda123 发表于 2022-11-7 15:31
你用的是哪个版本的ISP软件和Keil?

STC V6.90Q
KEIL:
Tool Version Numbers:
Toolchain:        PK51 Prof. Developers Kit  Version: 9.54
Toolchain Path:    C:\Keil_v5\C51\BIN
C Compiler:         C51.exe    V9.54
Assembler:          A51.exe    V8.02c
Linker/Locator:     BL51.exe    V6.22
Librarian:             LIB51.exe    V4.30.1.0
Hex Converter:      OH51.exe    V2.7.0.0
CPU DLL:               S8051.DLL            V3.100.0.0
Dialog DLL:         TP51.DLL             V2.58
Target DLL:             STCMON51.DLL         V0, 1, 0, 17
Dialog DLL:         TP51.DLL             V2.58

使用特权

评论回复
24
henangongda123|  楼主 | 2022-11-7 16:08 | 只看该作者
chongdongchen 发表于 2022-11-7 15:42
STC V6.90Q
KEIL:
Tool Version Numbers:

Keil版本不一样:
IDE-Version:
μVision V5.25.3.0
Copyright (C) 2018 ARM Ltd and ARM Germany GmbH. All rights reserved.

Tool Version Numbers:
Toolchain:        MDK51 Professional  Version: 9.59.0.0
Toolchain Path:    C:\Keil_v5\C51\BIN
C Compiler:         C51.exe    V9.59.0.0
Assembler:          A51.exe    V8.2.7.0
Linker/Locator:     BL51.exe    V6.22.2.0
Librarian:             LIB51.exe    V4.30.1.0
Hex Converter:      OH51.exe    V2.7.0.0
CPU DLL:               S8051.DLL            V3.122.0.0
Dialog DLL:         DP51.DLL             V2.66.0.0

使用特权

评论回复
25
一周一天班| | 2022-11-7 16:09 | 只看该作者
应该你买的这批芯片有问题,频率较准不准。我遇到过频率较准问题,同一芯片,多次ISP,每次较准的偏差不一样,波特率高一点时正常时不正常。国产的理解下。你这个偏差太大了。

使用特权

评论回复
26
henangongda123|  楼主 | 2022-11-7 16:10 | 只看该作者
chongdongchen 发表于 2022-11-7 15:42
STC V6.90Q
KEIL:
Tool Version Numbers:

ISP V6.90Q版本我找找,我用的是6.90U版本

使用特权

评论回复
评论
lyjian 2022-11-7 22:39 回复TA
@henangongda123 :17%的误差叫对? 
henangongda123 2022-11-7 16:59 回复TA
@chongdongchen :ISP软件启动后不修改任何东西,11.0592M就对得上了,这个怎么解释啊 
chongdongchen 2022-11-7 16:25 回复TA
跟版本没关系,可能是你哪个细节没弄对吧 
27
feiyinglala| | 2022-11-7 20:03 | 只看该作者
一周一天班 发表于 2022-11-7 14:52
你启动ISP软件后啥也不改,默认11.0592,看看结果。外部晶振需要修改CLKSEL=1.
0.76这个值好像24M和30M的比 ...

大牛,从数值误差反推出时钟配置

使用特权

评论回复
28
henangongda123|  楼主 | 2022-11-7 20:26 | 只看该作者
feiyinglala 发表于 2022-11-7 20:03
大牛,从数值误差反推出时钟配置

魔咒般的0.76数字

使用特权

评论回复
29
henangongda123|  楼主 | 2022-11-7 20:26 | 只看该作者
feiyinglala 发表于 2022-11-7 20:03
大牛,从数值误差反推出时钟配置

不折腾了,所有东西都按0.76倍来搞了,按0.76倍数就正常了,点背,客户催样品催的好烦,还是赶紧按0.76倍主频把样品搞出来交差。。。

使用特权

评论回复
30
lyjian| | 2022-11-7 21:12 | 只看该作者
用你的代码做了测试,烧STC8G1K08A上,输出没有问题。直接用万用表频率档测,12MHz配置时显示频率499Hz,24MHz配置显示频率998Hz。

使用特权

评论回复
31
liu11372650| | 2022-11-7 21:39 | 只看该作者
我也来借花献佛
以下是手动配置例子
#include "stc8h.h"
#include "intrins.h"

sfr     VRTRIM  =   0xA6;

#define CLKSEL      (*(unsigned char volatile xdata *)0xfe00)
#define CLKDIV      (*(unsigned char volatile xdata *)0xfe01)

#define USBCHIPID
#define CPUIDBASE   0xfde0

#define T22M_ADDR   (*(unsigned char volatile xdata *)(CPUIDBASE + 0x0b))   //22.1184MHz
#define T24M_ADDR   (*(unsigned char volatile xdata *)(CPUIDBASE + 0x0c))   //24MHz
#ifdef  USBCHIPID
#define T27M_ADDR   (*(unsigned char volatile xdata *)(CPUIDBASE + 0x0d))   //27MHz
#define T30M_ADDR   (*(unsigned char volatile xdata *)(CPUIDBASE + 0x0e))   //30MHz
#define T33M_ADDR   (*(unsigned char volatile xdata *)(CPUIDBASE + 0x0f))   //33.1776MHz
#define T35M_ADDR   (*(unsigned char volatile xdata *)(CPUIDBASE + 0x10))   //35MHz
#define T36M_ADDR   (*(unsigned char volatile xdata *)(CPUIDBASE + 0x11))   //36.864MHz
#define T40M_ADDR   (*(unsigned char volatile xdata *)(CPUIDBASE + 0x12))   //40MHz
#define T44M_ADDR   (*(unsigned char volatile xdata *)(CPUIDBASE + 0x13))   //44.2368MHz
#define T48M_ADDR   (*(unsigned char volatile xdata *)(CPUIDBASE + 0x14))   //48MHz
#else
#define T20M_ADDR   (*(unsigned char volatile xdata *)(CPUIDBASE + 0x0d))   //20MHz
#define T27M_ADDR   (*(unsigned char volatile xdata *)(CPUIDBASE + 0x0e))   //27MHz
#define T30M_ADDR   (*(unsigned char volatile xdata *)(CPUIDBASE + 0x0f))   //30MHz
#define T33M_ADDR   (*(unsigned char volatile xdata *)(CPUIDBASE + 0x10))   //33.1776MHz
#define T35M_ADDR   (*(unsigned char volatile xdata *)(CPUIDBASE + 0x11))   //35MHz
#define T36M_ADDR   (*(unsigned char volatile xdata *)(CPUIDBASE + 0x12))   //36.864MHz
#define T40M_ADDR   (*(unsigned char volatile xdata *)(CPUIDBASE + 0x13))   //40MHz
#define T45M_ADDR   (*(unsigned char volatile xdata *)(CPUIDBASE + 0x14))   //45MHz
#endif
#define VRT6M_ADDR  (*(unsigned char volatile xdata *)(CPUIDBASE + 0x15))   //VRTRIM_6M
#define VRT10M_ADDR (*(unsigned char volatile xdata *)(CPUIDBASE + 0x16))   //VRTRIM_10M
#define VRT27M_ADDR (*(unsigned char volatile xdata *)(CPUIDBASE + 0x17))   //VRTRIM_27M
#define VRT44M_ADDR (*(unsigned char volatile xdata *)(CPUIDBASE + 0x18))   //VRTRIM_44M

void main()
{
    P_SW2 |= 0x80;  //使能访问XFR

    P0M0 = 0x00;
    P0M1 = 0x00;
    P1M0 = 0x00;
    P1M1 = 0x00;
    P2M0 = 0x00;
    P2M1 = 0x00;
    P3M0 = 0x00;
    P3M1 = 0x00;
    P4M0 = 0x00;
    P4M1 = 0x00;
    P5M0 = 0x00;
    P5M1 = 0x00;

//#ifndef   USBCHIPID
//  //选择20MHz
//  CLKDIV = 0x04;
//  IRTRIM = T20M_ADDR;
//  VRTRIM = VRT27M_ADDR;
//  IRCBAND = 0x02;
//  CLKDIV = 0x00;
//#endif

//  //选择22.1184MHz
//  CLKDIV = 0x04;
//  IRTRIM = T22M_ADDR;
//  VRTRIM = VRT27M_ADDR;
//  IRCBAND = 0x02;
//  CLKDIV = 0x00;

    //选择24MHz
    CLKDIV = 0x04;
    IRTRIM = T24M_ADDR;
    VRTRIM = VRT27M_ADDR;
    IRCBAND = 0x02;
    CLKDIV = 0x00;

//  //选择27MHz
//  CLKDIV = 0x04;
//  IRTRIM = T27M_ADDR;
//  VRTRIM = VRT27M_ADDR;
//  IRCBAND = 0x02;
//  CLKDIV = 0x00;

//  //选择30MHz
//  CLKDIV = 0x04;
//  IRTRIM = T30M_ADDR;
//  VRTRIM = VRT27M_ADDR;
//  IRCBAND = 0x02;
//  CLKDIV = 0x00;

//  //选择33.1776MHz
//  CLKDIV = 0x04;
//  IRTRIM = T33M_ADDR;
//  VRTRIM = VRT27M_ADDR;
//  IRCBAND = 0x02;
//  CLKDIV = 0x00;

//  //选择35MHz
//  CLKDIV = 0x04;
//  IRTRIM = T35M_ADDR;
//  VRTRIM = VRT44M_ADDR;
//  IRCBAND = 0x03;
//  CLKDIV = 0x00;

//#ifdef    USBCHIPID
//  //选择44.2368MHz
//  CLKDIV = 0x04;
//  IRTRIM = T44M_ADDR;
//  VRTRIM = VRT44M_ADDR;
//  IRCBAND = 0x03;
//  CLKDIV = 0x00;

//  //选择48MHz
//  CLKDIV = 0x04;
//  IRTRIM = T48M_ADDR;
//  VRTRIM = VRT44M_ADDR;
//  IRCBAND = 0x03;
//  CLKDIV = 0x00;
//#else
//  //选择40MHz
//  CLKDIV = 0x04;
//  IRTRIM = T40M_ADDR;
//  VRTRIM = VRT44M_ADDR;
//  IRCBAND = 0x03;
//  CLKDIV = 0x00;

//  //选择45MHz
//  CLKDIV = 0x04;
//  IRTRIM = T45M_ADDR;
//  VRTRIM = VRT44M_ADDR;
//  IRCBAND = 0x03;
//  CLKDIV = 0x00;
//#endif

    while (1);
}


这是手动选择不同内部时钟的例子,

以下代码是配置内部时钟12M的例子,测试下

所以代码这么改下测试下
#include "stc8h.h"
#include "intrins.h"

sfr     VRTRIM  =   0xA6;

#define CLKSEL      (*(unsigned char volatile xdata *)0xfe00)
#define CLKDIV      (*(unsigned char volatile xdata *)0xfe01)

#define USBCHIPID
#define CPUIDBASE   0xfde0

#define T22M_ADDR   (*(unsigned char volatile xdata *)(CPUIDBASE + 0x0b))   //22.1184MHz
#define T24M_ADDR   (*(unsigned char volatile xdata *)(CPUIDBASE + 0x0c))   //24MHz
#ifdef  USBCHIPID
#define T27M_ADDR   (*(unsigned char volatile xdata *)(CPUIDBASE + 0x0d))   //27MHz
#define T30M_ADDR   (*(unsigned char volatile xdata *)(CPUIDBASE + 0x0e))   //30MHz
#define T33M_ADDR   (*(unsigned char volatile xdata *)(CPUIDBASE + 0x0f))   //33.1776MHz
#define T35M_ADDR   (*(unsigned char volatile xdata *)(CPUIDBASE + 0x10))   //35MHz
#define T36M_ADDR   (*(unsigned char volatile xdata *)(CPUIDBASE + 0x11))   //36.864MHz
#define T40M_ADDR   (*(unsigned char volatile xdata *)(CPUIDBASE + 0x12))   //40MHz
#define T44M_ADDR   (*(unsigned char volatile xdata *)(CPUIDBASE + 0x13))   //44.2368MHz
#define T48M_ADDR   (*(unsigned char volatile xdata *)(CPUIDBASE + 0x14))   //48MHz
#else
#define T20M_ADDR   (*(unsigned char volatile xdata *)(CPUIDBASE + 0x0d))   //20MHz
#define T27M_ADDR   (*(unsigned char volatile xdata *)(CPUIDBASE + 0x0e))   //27MHz
#define T30M_ADDR   (*(unsigned char volatile xdata *)(CPUIDBASE + 0x0f))   //30MHz
#define T33M_ADDR   (*(unsigned char volatile xdata *)(CPUIDBASE + 0x10))   //33.1776MHz
#define T35M_ADDR   (*(unsigned char volatile xdata *)(CPUIDBASE + 0x11))   //35MHz
#define T36M_ADDR   (*(unsigned char volatile xdata *)(CPUIDBASE + 0x12))   //36.864MHz
#define T40M_ADDR   (*(unsigned char volatile xdata *)(CPUIDBASE + 0x13))   //40MHz
#define T45M_ADDR   (*(unsigned char volatile xdata *)(CPUIDBASE + 0x14))   //45MHz
#endif
#define VRT6M_ADDR  (*(unsigned char volatile xdata *)(CPUIDBASE + 0x15))   //VRTRIM_6M
#define VRT10M_ADDR (*(unsigned char volatile xdata *)(CPUIDBASE + 0x16))   //VRTRIM_10M
#define VRT27M_ADDR (*(unsigned char volatile xdata *)(CPUIDBASE + 0x17))   //VRTRIM_27M
#define VRT44M_ADDR (*(unsigned char volatile xdata *)(CPUIDBASE + 0x18))   //VRTRIM_44M


void main()
{
    P_SW2 |= 0x80;  //使能访问XFR
    //选择24MHz,2分频,CLKDIV=02
    CLKDIV = 0x04;
    IRTRIM = T24M_ADDR;
    VRTRIM = VRT27M_ADDR;
    IRCBAND = 0x02;
    CLKDIV = 0x02;

    while (1);
}



使用特权

评论回复
32
liu11372650| | 2022-11-7 21:43 | 只看该作者
出现问题最大的可能性是内部时钟校准不准确,索性stc有三种参数可以校准,具体参考

使用特权

评论回复
33
liu11372650| | 2022-11-7 21:48 | 只看该作者
如果有外部时钟,可以参考

使用特权

评论回复
34
lyjian| | 2022-11-7 22:41 | 只看该作者
lyjian 发表于 2022-11-7 21:12
用你的代码做了测试,烧STC8G1K08A上,输出没有问题。直接用万用表频率档测,12MHz配置时显示频率499Hz,24 ...

同样代码烧STC8H3K64S4的板,也是对的。

使用特权

评论回复
35
lyjian| | 2022-11-7 22:43 | 只看该作者
henangongda123 发表于 2022-11-7 20:26
不折腾了,所有东西都按0.76倍来搞了,按0.76倍数就正常了,点背,客户催样品催的好烦,还是赶紧按0.76倍 ...

建议先用示波器的校准波形先卡一下示波器是不是对的

使用特权

评论回复
36
coody| | 2022-11-8 12:01 | 只看该作者
楼主下载选择24MHz输出频率多少?

使用特权

评论回复
37
jbush226| | 2022-11-8 14:07 | 只看该作者
话说,stc8g不是1T的内核吗

使用特权

评论回复
38
天命风流| | 2022-11-8 14:43 | 只看该作者
我上次也遇到这个问题   估计就是主频的宏定义错了   

使用特权

评论回复
39
perseverance51| | 2022-11-8 16:58 | 只看该作者
- 使用的是单片机型号: STC8G2K64S4
-STC-ISP


#include <STC8G.H>
void Timer0Init(void)                //1毫秒@32MHz
{
        AUXR |= 0x80;                //定时器时钟1T模式
        TMOD &= 0xF0;                //设置定时器模式
        TL0 = 0x00;                //设置定时初始值
        TH0 = 0x83;                //设置定时初始值
        TF0 = 0;                //清除TF0标志
        TR0 = 1;                //定时器0开始计时
}
void TM0_Isr() interrupt 1
{
    P10 = !P10;                                 //测试端口
}
void main()
{
    P1M0 = 0x00;
    P1M1 = 0x00;
Timer0Init();
                TR0 = 1;                                    //启动定时器
    ET0 = 1;                                    //使能定时器中断
    EA = 1;

    while (1);
}



使用特权

评论回复
40
ccc228| | 2022-11-8 18:46 | 只看该作者
留个记号,想知道问题的根本原因。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则