![]() |
發布時間: 2020-10-20 02:58
正文摘要:初學單片機是從STC12開始,寫了不少匯編程序,最近多用STC8G來制作,已經移植過幾個程序到STC8G,過程相當費力,但每次做完后就算了,沒有記下過程,等下一次要再移植又再從頭做起,今晚又開始移植一個舊軟件,摸了 ... |
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后,就跑動起來,正常了。 待續。。 |
cornrn 發表于 2022-5-19 20:48 我不是大神,SAM2695是法國DREAM的MIDI音源芯片,不需要固件,直接發送標準MIDI信號就可以發聲,連接USB轉MIDI芯片CH345可以播放電腦MIDI音樂,效果超過電腦聲卡,本論壇有詳細資料下載http://www.zg4o1577.cn/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寫,再移植就不會那么費勁了![]() |