發表文章

[原創] 使用SDCC開發新唐N76E003 1T 8051

圖片
新唐科技2017年推出了一顆新的1T 8051 MCU,在一個TSSOP-20的封裝裡提供高達18PIN的I/O接腳,並且與STM8S003 pin to pin相容。內建1T 8051核心,具18KB Flash程式記憶體、1KB SRAM(256Byte + 768Byte XRAM),周邊包含6通道16-bit PWM、8通道12-bit ADC、SPI介面、I2C介面及兩組UART,小小一顆功能卻非常強大,可說是麻雀雖小,五臟俱全。 N76E003開發板 : http://goods.ruten.com.tw/item/show?21819007454427 另外傳統的8051指令週期為12T,也就是一條指令至少要12個時脈來完成。大部分的指令都可以在1到2個指令週期完成,而除法這種較複雜的指令則要4個指令週期來完成。所以傳統的8051每條指令所需的時脈會是12的倍數。 然後新唐的1T 8051意思就是指令週期為1T,一條指令至少要1個時脈來完成,而每個指令所需的時脈都會是1的倍數,好處是程式的執行速度可能比較快,缺點是如果在優化timming較不容易計算每條指令所花費的時間。 http://www.keil.com/dd/docs/datashts/intel/ism51.pdf 不過一點較可惜的部分新唐官方提供的BSP僅支援keil c51和IAR,以大家拿手的keil來說免費評估版本code size具2KB限制,除非花錢去買正版軟體不然18KB的flash也只能看著流口水,且礙於code size限制這麼多功能可能也發揮不起來,於是著手研究看看如何使用sdcc進行開發。 一、SDCC SDCC: Small Device C Compiler,一套開源的微控制器C語言編譯器,起初僅針對MCS-51系列的微控制器所開發,現在除了MCS-51以外已經支援Z80、STM8、PIC14、PIC16等常見的微控制器。 我們可以從官網下載並安裝最新版本的SDCC: http://sdcc.sourceforge.net/snap.php#Windows 安裝結束後可以勾選add to system path以便我們能夠直接在cmd或ps中直接使用sdcc。完畢後要重新開機才會套用環境變數。 二、使用SDCC別於Keil C51的部...

NUC200 NUC220接收&處理GPS之資料

圖片
透過MCU的UART接收GPS的資料,然後透過字串處理解讀NMEA GPRMC #include "stdlib.h" #include "stdio.h" #include "string.h" #include "NUC200Series.h" #define PLL_CLOCK 48000000 char gps_data[512] = { 0 }; int flag = 0; struct { char _gprmc[10]; char utc_time[10]; char status[10]; char latitude_value[10]; char latitude[10]; char longtitude_value[10]; char longtitude[10]; char speed[10]; char azimuth_angle[10]; char utc_date[10]; char declination_value[10]; char declination[10]; char check_sum[10]; } gprmc = { 0 }; void SYS_Init(void) { /*---------------------------------------------------------------------------------------------------------*/ /* Init System Clock */ /*---------------------------------------------------------------------------------------------------------*/ /* Enable Internal RC 22.1184MHz clock */ CLK_EnableXtalRC(CLK_PWRCON_OSC22M_EN_Msk);...

Nuvoton NUC200 NUC220使用FIFO觸發中斷及接收超時中斷處理UART接收的資料

圖片
NUC200NUC220_BSP當中所提供之UART_Read(uart, pu8RxBuf, u32ReadBytes)函式屬於輪詢方式,接收緩衝器為空時這個函式就會在原地等待,屆時CPU沒辦法做其他事情。本篇介紹使用中斷的方式處理UART接收到的資料。 在這邊我們使用到UART兩個中斷源,分別是"接收資料可用中斷"及"接收超時中斷"。 接收資料可用中斷的發生條件為,當接收到的位元組大於等於所設定之閥值發生,而閥值可由UART->FCR[7:4] RFITL設定1Byte、4Bytes、8Bytes、14Bytes、30Bytes、46Bytes及62Bytes。在這邊要注意,NUC220的UART0才有提供到64Bytes的接收緩衝區,UART1及UART2只提供了16Bytes的接收緩衝區,當閥值設定超過14Bytes則以14Bytes為準。清除接收資料可用中斷的中斷旗標只要讀取RBR即可。 接收超時中斷的發生條件為,當超時計數器的值大於等於超時比較器(UART->TOR[7:0] TOIC)的值發生接收超時中斷。超時計數器在每一個Byte進來時會歸零並且開始計時,而計數器的時脈等於Baudrate,所以建議將TOIC設定在40~255之間,以避免在下一個Byte進來以前就發生了超時中斷。若要清除接收超時中斷的中斷旗標同樣讀取RBR即可。 那麼為甚麼我們要使用這兩種中斷? 首先我們將緩衝區設定在30Bytes會發生中斷,若進來資料是一長串的話可以每30Bytes收一次以降低CPU的負擔。問題是如果進來的資料不剛好整除30個Byte怎麼辦? 這些不到30Bytes的資料就透過超時中斷來處理。假設進來的資料剛好是30個Byte,那很好就剛好把30個Byte收完以後就結束了,如果大於30個Byte則會在超時中斷發生時將剩下的幾個Byte讀取完畢。 下面的程式透過接收中斷的方式將RX接收到的資料傳回TX,所以TX應傳出RX所接收到的資料。由Arduino IDE的Serial Monitor來輸入資料及監測程式運作的狀況。記得UART0的中斷服務程式要叫做"UART02_IRQHandler"。 1. 首先輸入一個不到30Bytes的字串會發生超時中斷,並將這些字元存入軟體b...

煤油暖爐怎麼挑選?

圖片
寒冬將至,一直很嚮往放一台煤油暖爐在家。早在去年冬天逛網拍的時候就發現煤油暖爐這種東西,起初還以為是近幾年出來的新產品,去查才發現在日本和一些高緯度地區早在幾十年前就開始使用。由於煤油暖爐是透過燃燒產生熱能,其熱量非常大少說是2.5kW以上,這是一般電暖爐沒辦法達到的。近來看蠟筆小新的時候無意間在裡面看到煤油暖爐,又勾起我對煤油暖爐的那份感覺(燃燒的快感?),於是下定決心要買一台放在家裏。露天拍賣查了一下,大部分煤油暖爐都是日本平行輸入的,畢竟台灣對煤油暖爐的需求也不是很高,重點來了,品牌、型式、型號少說20種,到底該怎麼挑選? 花了兩天做了一點功課供大家參考。 煤油暖爐相較於電暖爐的優點與缺點 1. 煤油暖爐燃燒煤油是最直接產生熱的方法,不像電暖爐從發電廠先將燃料燃燒之後再燒水推動渦輪發電機。缺點就是由於是燃燒煤油,使用時必須注意空氣對流避免燃燒不完全造成一氧化碳中毒。 2. 即使是需要插電的款式耗電量也遠比電暖爐低,增加了用電安全。缺點是原廠不建議在睡眠期間開著,由於輸出的熱量相當高,如果在出風口有易燃物(如紙張、塑膠袋)有可能造成危險。 3. 發熱量夠,可以且須要開窗使用,不會讓室內悶悶的 但以上兩個缺點不必太過擔心,使用的時候只要窗戶留些空隙或定時打開窗戶讓新鮮的空氣進入室內,基本上不用擔心燃燒不完全的問題。建議的使用方式是在睡前將煤油暖爐開著暖房,到了舒適的溫度以後即可關閉。另外有些人會擔心味道的問題,以我挑選的Dainichi FW-3216NE使用經驗,只會在點火和熄火的時候會有煤油味,正常燃燒的情況下吹出來的風就跟一般電暖爐一樣乾淨舒爽。 一、型式 1. 傳統對流型煤油暖爐 基本上就是一個圓筒狀的燃燒室,並在周遭配有防燙網,部分機種頂部可以放茶壺順便燒水、加濕空氣。這種的好處是不用插電可以到處放不受電源牽制,部分機種安裝電池是為了在啟動時電子點火用,不用裝電池的則是要自己用點火槍點燃燈芯。缺點就是煤油的味道可能比較重、燈芯損壞了要更換。這種體積較大、熱量也較高,比較適合在大坪數的空間中使用。 TOYOTOMI KS-67H 2. 紅外線反射式煤油暖爐 紅外線反射式煤油暖爐是讓煤油在下方燃燒並加熱上面的金屬產生紅外線,透過鏡面將紅外線反射出來,同時會有對流的效果,也會有台灣常見的鹵素電暖器輻射熱的效果但暖房能力恐...

關於新唐科技NuMicro ISP的介紹和使用方式

圖片
2025.03.07 更新 新貼出了一篇文章,內容、操作步驟比較完整,敬請參考。 不用燒錄器也能更新韌體 - In-System Programming (ISP) 、 NuMicro ISP Programming Tool 目前新唐科技主流的幾款微控制器均支援ICP、ISP及IAP三種燒錄方式,本文主要介紹NuMicro ISP的使用方式並實作。在這之前讓我們先來了解以上三種燒錄方式的差異,但不同的微控制器設計製造商可能對這些名詞有不同的定義。 ICP全稱為"In circuit programming"中文為"在電路上燒錄程式",意思上就是該單晶片可以在工作電壓之下直接進行燒錄。早期的單晶片的程式記憶體為EPROM,更新程式前必須從電路中拔下來以紫外線清洗機將舊有的程式給清除乾淨,再插上燒錄器燒上新的程式。新一點的單晶片(如89C51)內部的程式記憶體為EEPROM,抹除及燒錄需使用12V高壓來進行,雖然可透過電氣的方式抹除舊有的程式並燒錄,但工作電壓5V依然需將其從電路中拔下來。這兩種燒錄方式在開發上都會造成不方便。而近期所出的單晶片則使用Flash Memory作為程式記憶體,能夠在工作電壓下直接進行讀寫、抹除故稱為"In circuit programming"。 ISP全稱為"In system programming"中文為"在系統上燒錄程式",此種燒錄方式是透過微控制器內部的程式對該程式以外的記憶體進行更新,通常會將一段更新用的程式碼放在程式記憶體的開頭或者特定的區塊,我們稱作為Bootloader。以新唐的微控制器舉例,記憶體主要分為LDROM和APROM,LDROM容量不大通常只有4KB,只擺一支小程式讀取UART、USB或其他通訊界面傳進來的的資料,並將這些資料存入APROM以達到更新的目的。所以這種燒錄方式只要在第一次透過燒錄器將Bootloader存入LDROM,往後使用者若要更新程式只要透過UART或者USB即可,無須再使用燒錄器。這個做法就跟Arduino UNO一樣透過Bootloader從UART進行軟體的更新。 #題外話 講到在這邊跟大家分享,我一位教微控制器實習的大學老師,自己設計了一塊課堂要使用的8051開發...

即時的平均值自動亮度調整

圖片
近期製作新的時鐘新增了一項功能: 讓顯示器的亮度能夠自動隨環境的亮度做調整,可以避免晚上太亮太刺眼或白天看不清楚的問題。原先的做法就是每一分鐘會讀取AD的值並由讀值來調整顯示器亮度,這種做法雖然能達成自動亮度調整但稍嫌不完美,例如睡前將燈光關閉後可能得等上一分鐘才會調整好舒適的亮度。如果為了解決這個問題而將取樣率及亮度更新率提高到每秒鐘或十秒鐘一次,萬一AD的讀值剛好在調整亮度的臨界值(顯示器的亮度分為8個階級)就會讓亮度一直改變,可能會困擾使用者。 以下方法可以獲取一段時間的平均值並將亮度即時地調整、又不會因為微小的變化或臨界值造成亮度不斷的改變。邏輯上就是將當前的AD讀值加進一個變數中,再把最舊的數值(480次前的數值,由陣列紀錄)減去,做為處理後的信號源。 int ad = A5; int led = 9; int arr[480] = { 0 }; long avg_value = 0; int pwm; int i=0; void setup() { pinMode(ad, INPUT); Serial.begin(115200); } void loop() { Serial.print(millis()/1000, DEC); Serial.print("$ "); arr[i] = analogRead(ad); avg_value+=arr[i]; Serial.print("current: "); Serial.print(arr[i], DEC); if(i==480) { i=0; avg_value-=arr[i]; } else { avg_value-=arr[++i]; } pwm = map(avg_value, 0, 491040, 0, 7); //將加總值量化為0~7, analogRead() max value=1023, 1023*480 times = 491040 pwm = map(pwm, 0, 7, 10, 255); analogWrite(led, pwm); //將量化後的值(0~7)輸出至PWM,最低亮度(0)的PWM值為10、最高亮度(7)的PWM值為2...

[8084]野狼 125EFi (PA12M6) 換油保養紀錄

圖片

科風 BNT-1000AP 黑武士系列不斷電系統開箱拆解、簡易評測及經驗分享

圖片
八月中才買一台科風的BNT-500A,8/31家人在一旁使用吹風機的時候BNT-500A突然開始叫,應該是過載警示。推測原因應該是使用吹風機使得市電電壓下降,我這邊個人電腦的Power電流需求變高。接著我按下測試按鈕或者是拔除市電都是直接關機,測了兩台電腦都一樣完全沒有備援電力。於是隔天9/1就拿去送修了。隔了一個週末9/4星期一就通知維修完畢後就去取件。測試報告中寫著"R65"有做更換,工程說是一顆負載偵測的電阻。 回家後插上我的個人電腦照樣無備援電力,而上週測試的另一台電腦則可以正常運作。我的個人電腦也不是多高端的電腦實際測量在140W以內,而BNT-500A規格上是寫500VA/300W,還用不到一半的輸出功率。然後送修回來保固封條已經被原廠拆封沒貼新的上去,於是就自己拆開探個究竟。 實際測量時,把電瓶拆除拿可調電源供應器調整在13.5V接在連接電池的端子上然後開機,接著慢慢把電壓調整下來,約在11.5V時蜂鳴器開始叫低電壓警示、10.8V則關機來保護電池。再來把電腦接在輸出端上並把電瓶歸位把UPS開機,然後拿電表測量電池兩端的電壓在電腦未開機的情況下約是12.9V,而開機的一瞬間掉到10.5V然後UPS就直接關機了。 由上述實驗可以推論,電路或許是可以達到500VA/300W的輸出功率,但電池不給力無法在更高的負載放出足夠的電流,導致電壓下降到10.8V以下而進入放電保護直接關機。 >>解決方案 1.買一顆好一點的電池: 原廠所附的電池是廣隆WP4.5-12,可以考慮換一顆湯淺的看看 2.買一顆新的、輸出功率大一點的UPS: 輸出功率大,內部的電池容量也會比較大 我選擇了後者。買一顆品質好一點的電池或許能夠解決,但長久下來電池老化終究還是會發生一樣的問題,反而增加維護的時間,停電時無法正常供應電力的機會也增加了,不如買一顆功率大一點的UPS,電池容量也大,能夠釋放的電流相對也會比較寬裕。 我基於愛台灣的精神還是選擇科風,再來也親自送修過一次日後有問題要送修也比較不麻煩。我能買到1000VA的款式有科風黑武士系列BNT-1000AP及科風勇士系列WAR-1000AP,其特點如下 BNT-1000AP, PChome 3290元, 兩顆電池、鐵殼、RS-232通訊、標準3PIN可拆卸的電腦電源線 WAR...