發表文章

目前顯示的是 11月, 2017的文章

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

圖片
目前新唐科技主流的幾款微控制器均支援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開發板,核心晶片使用89C51、用RS-232作為燒錄介面,做實驗時完全不需要將89C51拔下來插上燒錄器。整體的架構大致上就是在89C51裡的EEPROM放個讀取UART的程式並且會將UART的資料放入外部記憶體中,外部記憶體則是一顆

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

圖片
近期製作新的時鐘新增了一項功能: 讓顯示器的亮度能夠自動隨環境的亮度做調整,可以避免晚上太亮太刺眼或白天看不清楚的問題。原先的做法就是每一分鐘會讀取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