|
2. 第二步是调整UART2的波特率,STC12的T2称为BRT , 专门作为波特率产生器,是8位自动重载,控制波特率的寄存器地址是9CH,而STC8G就叫T2,T2有新的模式叫“16 位自动重载”,所以要用到两个新寄存器: T2H EQU 0D6H T2L EQU 0D7H 比较两个初始化程序 STC12的UART2初始化: INITIAL_UART2: ;USE FOR CLOCK OUT MIDI DATA MOV S2CON, #01010000B ;SET AS BAUD VERIABLE, NO ODD/EVEN CHECK MOV BRT, #BRTLOAD ;RELOAD 1152000 ORL AUXR, #10H ;BRT START RUN MOV IE2, #01H ;ENABLE UART2 INTERRUPT RET STC8G的初始化: INITIAL_UART2: ;USE FOR SENT MIDI DATA MOV S2CON, #01010000B ;SET AS BAUD VERIABLE, NO ODD/EVEN CHECK MOV T2H, #0FFH ;18.432 38400 12T=FFF6 1T=FF88 T2 RUN AS 16BIT AUTO LOAD MOV T2L, #88H ;88(18.432M 26U 38400) #6CH=32US=MIDI CLR 41H MOV IE2, #00000001B ;ENABLE TIMER2 INTERR UART2 INTERRUPT RET 一个用到BRT, 一个用到T2H,T2L, 把STC8的UART2初始程序抄进来就是了。 定时器2还被另一个寄存器AUXR所控制: MOV AUXR,#01000101B ;T0x12,T1x12,UART_M0x6,BRTRUN, ;S2SMOD,BRTx12,EXTRAM, S1BRS(1=UART1 USE BRT 0=USE T1) 这里面的BRTRUN位也就是T2R(T2RUN)控制位,位0是控制UART1该使用哪个定时器,改为1后UART1就使用T2为波特率发生器了,这样就可以用STC-ISP的串口助手来观察T2的波特率了。 编译后上载,毫无动静,UART1没有收到号码,连指示灯也不闪了,只好在程序前面放CLR P1.6,证明程序来到LCALL SENTONEBYTE就死机了,最后发现是AUXR的T2RUN位没有开,定时器没有动,旧的UART2初始化有“ORL AUXR, #10H ;BRT START RUN”句子,新的没有,直接把AUXR位4改为1后,就跑动起来,正常了。 待续。。 |
keepway 发表于 2020-10-20 09:06 汇编你都看懂了,还觉得C难。真奇怪,有点像开摩托车,先学会女装,觉得学男装的难, |
|
其实汇编它的存在,是有道理的。 不管复杂还是简单。因为它的难度小,方便操作。 据说宇航级的都是汇编写的 |
cornrn 发表于 2022-5-19 20:48 我不是大神,SAM2695是法国DREAM的MIDI音源芯片,不需要固件,直接发送标准MIDI信号就可以发声,连接USB转MIDI芯片CH345可以播放电脑MIDI音乐,效果超过电脑声卡,本论坛有详细资料下载http://www.51hei.com/bbs/dpj-83651-1.html |
kmsj 发表于 2021-9-21 15:29 你好大神,这个SAM2695是法国DREAM的MIDI音源芯片吗? 这东西里面不需要写固件,直接用单片机串口输入MIDI格式命令就可以播放音乐是吗?还是需要SPI口? |
dalaoshi 发表于 2021-9-8 01:55 哈哈 我也是这样想的 可惜我还很差 继续学习 |
| 会汇编的,真是牛人 |
佩服这么多牛人,向这些大佬致敬![]() |
|
过来人不少,我几十年射频工程师,才开始学c语言,stc8起步,四个月了,产品数字化轻量化超低功耗改进很成功. STC型号太多,小揪揪太多...得反复看手册例程逐步优化....... |
| 想起敲汇编的时代,真是爽,估计只有体会过才知道 |
| 还是用C吧,可以模块化...移植性大大提高 |
wjw7680 发表于 2021-9-22 08:47 说得没错,学会C语言才有可能在职场找到职位,而我写代码遇到麻烦时,总会想:如果这时老板催说要交货了,得快点,那是一种怎样的心情?因此我不敢把写代码当职业,只能业余玩玩汇编。 |
|
汇编效率太低,可移植性又差。C语言绝对是开发MCU的好工具!现在的51内核的MCU上集成了很多的外设,如果还是用汇编,可读性与可维护性也差,开发周期也长。在公司研发上这是不允许的。 另外应该学习使用STC宏晶提供的API库函数做开发工具,效率更高。 |
|
佩服佩服!能手工焊接sam2695的手艺真高超,我四年前从焊接穿孔插件,慢慢学焊到SMD,越焊越小,到了这QFN48就投降了,恨这些IC怎么这么小,为了克服难关,就购买这些器材来帮忙了,成绩是焊了10片,七片成功,还算不错,基本上证明线路无误就行了。 我的板子都是付款打样,一般要打样三次才定型,所以家里留下大量无用底板,钢网也不少,心感不安,后来听到一句话说“都是机器做的,不要紧的”,也就释怀了。 画底板的水平只是达到“接通”,什么电磁干扰全不懂考虑,好在我的设计多是电池供电,干扰很小,很少跑飞。 我学单片机只是为了做自己的项目,主要是关于电子琴的东西,所以用51单片机就很够了。 汇编语言非常够用了,复杂的下点苦功也就做完了,好处是不必学另一种语法,来这论坛后C语言基本上能看懂,但没有写的欲望,除非有一天要搞什么项目,非得C不可,就会乖乖学起。 |
看了这个帖子,真是让我感慨万千啊!楼主从去年10月搞到现在,快一年了,一直不打算学C,精神可嘉!然而我至少用了六年的汇编,才学的C,究竟汇编好用还是C好用,这个问题说清楚足够写出一大篇文章了,简单说,楼主如果还不想学C的话,进展缓慢,我用了六年的汇编,现在让我回去用汇编,我一万个不愿意。看到楼主用了SAM2695,恰恰我也用过,对于楼主焊接SAM2695的方法,我狂晕啊,哪里会有那么复杂?
看看我手工做出来的试验板,焊接SAM2695毫无压力,楼主怎么搞的那么复杂,我只提醒几点,就用恒温精度稍微高一点的936电烙铁,要用纯铜的烙铁头,越尖越好,不够尖自己打磨,再把松香用好,放大镜看见位置摆好了,轻轻松松的就可以把SAM2695焊上去,SAM2695肚子下面的接地,画电路板打一个大一点的孔,最后用烙铁焊点锡进去就完事了。楼主用的是机制板,对我来说,焊接SAM2695更是没有任何压力可言。我手工做电路板,15mil安全间距和线宽成功率很高,10mil安全间距和线宽成功率不太高,由于SAM2695的安全间距和线宽低于10mil,我就做个小扩展板,先把SAM2695焊在扩展板上再把扩展板焊在电路板上,扩展板一次做四个,总有一个成功,扩展板很小,就算做失败浪费也不大,现在10×10以内的打样免费了,我也宁愿自己做板,像这样只做一片搞不清楚是否成功的情况下,我免费做5片就是浪费。我非常尊重别人的劳动,我用热转印做手工电路板轻车熟路,我把需要做试验的电路攒够几个到十几个品种,花个一天时间做出来,就算每个月有四个品种的免费打样,浪费实在太大了,就算免费,依然是浪费,我只有试验成功的电路板,把握性很大的情况下才会去打样。 从汇编到焊接SAM2695,明显感觉楼主最大的问题是不会找捷径,建议楼主立即学习C,我经常把51和AVR单片机的程序双向移植过来,移植过去,楼主觉得STC单片机的两个型号之间的汇编程序移植都有点困难,换个品种的单片机用汇编移植,如何移植?如果楼主继续用汇编就是继续走弯路,楼主觉得汇编直观,担心C不好用,我以前也有这个担心,汇编能做到的,C基本上都能做到,实在做不到的,还可以混合编程,也就是用C来调用汇编,然而我至今都没有搞过混合编程,我遇到的所有问题,C就解决了,C的编程效率比汇编高10倍以上,移植程序也比汇编简单好几倍。楼主的焊工,有待于提高,必须学会用电烙铁把SAM2695焊上去。再看PCB,走线不应该出现90度转角,有的走线到焊盘,没有经过圆心,走线方面仍然有待于提高。 |
| 好资料,51黑有你更精彩!!! |
|
终于把原本是STC125A60S2的ADC程序给移植到STC8G2K64S2了,代码不需要什么改变,就是初始化有些不同: INITADC: MOV P_SW2,#80H ;访问X寄存器打开 MOV DPTR,#ADCTIM; ;设置 ADC 内部时序 #0FEA8H 这是厂家的数值 MOV A,#3FH ;必须通过A才能送到 MOVX @DPTR,A MOV P_SW2,#00H ;访问X寄存器关闭 MOV ADCCFG,#04H ;设置 ADC 时钟为系统时钟/2/XXXX 16=慢,8=快 B6决定结果的格式 8=45US, 4=26US F=每81US一次 ;MOV ADC_CONTR,#10001111B ;使能 ADC 模块, #1000 CCCC B 通道暂定15 为内部参考电压1.91V MOV ADC_CONTR,#10000111B ;使能 ADC 模块, #1000 CCCC B 通道07 ADC的时序设定是放在外(X)寄存器,需要打开一个 P_SW2开关去赋值。 另外发现硬件有些不同,我的红外线发射时靠MCU内的T0产生40K方波在P3.4脚输出的,但两款MCU的T0输出脚不不同的 STC12: MOV WAKE_CLKO,#00000001B ;HAVE CLOCK OUTPUT BRT@P1.0 T1@P3.5 T0@P3.4 STC8G: MOV INTCLKO, #00000010B ;T2@P3.0 T1@P3.4 T0@P3.5 T0与T1的输出脚对调了,移植完毕后,发现ADC的输出值一直是零,用内部基准电压ADC15测定也是零,我这ADC代码可是经过验证的,绝对没错,但就是不行,只好再去看说明书,看到红字说明:ADC的外部参考电源管脚ADC_VREF+一定不能浮空,这才发现这一低级错误,这管脚就在V+旁边,用络铁焊上点锡造成短路,一切就正常了。 |
madell 发表于 2021-9-7 10:56 谢谢你的鼓励!用汇编来写单片机程序可以学会很多计算机的底层原理,这也是我兴趣的,随着自己写的代码越来越多,也就有了自己的“库”,写起来也就越来越方便。用高级语言写好像很便利,但出现问题时比较难排除,论坛上很多人问的都是语法错误,汇编语言则直接指到指令行,多好。 |
| 楼主品德、人格不错,是个严谨的人,坚持自己,坚持真理,走自己的路,不随波逐流,楼主继续保持。底层语言是地基,非常重要,高级语言有一定的束缚,虽然代码效率高,但很容易或肯定被卡脖子,因为高级语言非常依赖官方做好的函数库,具体内部构架、执行的内容你并不了解,日后人家不提供了,高级语言做的代码将没有灵魂,只剩躯体没有生机而慢慢衰败而死掉。 |
|
移植含ADC的STC12程序到STC8G要点: 最近把含ADC的STC12程序移植到STC8G,因为有过经验,信心十足,可是还是花了几天找不到毛病,无法产生UART中断,又发现多次验证过的T2L和T2H设定值产生不了T2的波特率,后来发现,原本用18.432烧录的程序改为11.0952烧录,就可以得到正确的波特率,够玄了,难道STC8G2K的时钟加快了?直到把初始时的一个副程式给禁止掉,问题才浮现出来: ADCINIT: MOV P1ASF, #10000001B ;SET P1.0 AS ADC FOR VOLUME P1.7 FOR EXT ADC MOV ADC_R, #0 ;CLEAR PREVIOUS RESULT MOV ADC_C, 57H ;P0WER, SPEED1,SPEED0, ADCFLAG, ADCSTART, CHS2, CHS1, CHS0, ON POWER, HIGH SPEED,CLRFLAG, CHANNEL #0 NOP NOP NOP RET 原本STC12做ADC用的PIASF寄存器的地址在STC8G已经改为“IRC频段检测检测”,赋值后时钟频率会改变,造成T2的波特率不对了。 另外STC12与STC8G的ADC_C虽然都是在BCH, 但有几个位已经变更位置了,有一个位拿去用作ADC_EPWMT,这一赋值就产生不可预料的结果,造成UART2产生不了中断。 那个ADC_R没问题, 结论:移植前记得把所有ADC的副程式禁止掉,以免浪费时间找毛病。 |
| 汇编接近单片机底层了。在TX脚与V+间焊上一个3K上拉电阻,是干扰问题。有时,数据传输干扰很严重。 |
|
我用了几年的汇编,现在在开始学C了,汇编的缺点太多了,主要是太考验一个的严谨性了,很有可能只是一个指令不对,你搞一个星期都找不到问题出现在哪里,特别是在有复杂运算的情况下,STC8G倒是有点进步了,有了一个16位的乘除法器,这个到你要用的时候你就会知道这玩意的好处了,其它的功能都是些花里胡哨的功能 但如果还要有更复杂的算法,那就是恐怖级别的,像PID算法,如果用C语言的话,也就是几个语句完成,如果用汇编,估计是200条指令以上,我前几个月在搞一个重力加速度的程序,现在先停下来了,用汇编太难搞了,所以,还是先停下来学一下C 至于移植性,在真正的实用项目面前,C和汇编是一样的,基本是没有移植性,最多是复制几段代码而已,其它的基本是重新写,像STC的单片机从12C到8G,几乎每个外设功能,像ADC,PWM,串口这些的,寄存器和操作都是不一样的,都得按照数据手册来改的 有汇编经验的,学C是相对要快的,思想转变一下,不出几个月,你就会发现C比汇编好太多了,现在的单片机,汇编唯一的优点是在低成本单片机上,用汇编大多是公司指定要用汇编的,用C你也写不下,有的国产单片机程序空间只有512B,但成本应该是一两毛一片,我做LED手电用的就是这种,LED手电它不要什么功能,就是开关,闪灯和低电压指示 至于效率和时序这些优点早就没有了 有C经验的去学汇编,那就难了 |
|
我只会c 楼主这样会汇编的人 我通常都是心中默默仰望的样子 从STC的89系开始就接触 这个厂家的产品线好乱的 比如12C56XX的片子和其它片子N多配置就不一样 同一个ADC中断法函数都不能通用 我个人是自己写了个配置文件 每个程序配置自己的 这样移植起来很容易 只要改一下配置文件 其它不动直接就可以跑起来了 |
| 移植到不同型号的单片机,即使是STC同一厂家,首先要仔细阅读芯片手册。比较两种芯片硬件的不同点,特别是自己要用到的部分,做好笔记。再开始修改原来的程序。C也好汇编也好,才能减少错误。 |
| 用C比汇编简单多了呀,移植起来也简单。 |
| c语言看起来挺难的 |
你用C写,再移植就不会那么费劲了![]() |