2018年1月18日 星期四

Arduino (AVR) Fuse 的影響





Arduino (AVR) Fuse 的影響.md


最近在工作上碰到一個奇怪的現象,就是整合的arduino板上的USB Driver(ATmega16U2)明明可以正常燒錄,接上PC也可以找的到Arduino裝置,但是在燒錄的時候卻出現:

最剛開始以為其他電路的問題,後來拿原廠的Arduino board交叉比對,鉤示波器來檢查16U2的石英震盪器發現到在燒錄的時候,原廠的石英震盪器的速度比整合版的速度還要快很多,所以造成燒錄的時序不同,導致在確認裝置的時候,剛好是在RESET訊號啟動的時候,所以造成此問題。

後來才想到可能是IC內部Fuse的問題,用avrdude工具將其值讀出來才發現,原來CKDIV8的設定是啟動的,將設定值修正後,整合板即可正常燒錄。

Fuse的產生可以參考:

Arduino\hardware\arduino\avr\boards.txt

如果是別種的AVR晶片可以使用:

Engbedded Atmel AVR® Fuse Calculator

可以更改表格內的選項,下方的值則會自動產生。

此外,還有一個參數是Lock bit常見的應用如下:

詳細的說明如下:

Lock BitBit No
Reserve7
Reserve6
BLB125
BLB114
BLB023
BLB012
LB21
LB10
BLB12BLB11SPM寫到bootloader區Applcation區讀取bootloader區資料
11沒有限制沒有限制
10限制沒有限制
00限制限制
01沒有限制限制
BLB02BLB01SPM寫到Applcation區bootloader區讀取Applcation區資料
11沒有限制沒有限制
10限制沒有限制
00限制限制
01沒有限制限制
LB2LB1Fuse bit,Flash與EEPROM寫入Boot lock,Flash與EEPROM驗證
11沒有鎖定限制沒有鎖定限制
10鎖定限制沒有鎖定限制
00鎖定限制鎖定限制
01沒有鎖定限制鎖定限制

可以依照自己的需求對IC作設定。


2017年11月10日 星期五

導入Markdown








為了讓部落格看起來更美觀,所以我將會導入Markdown的風格
例如像Python程式區塊:

C程式區塊:


由於自己也是最近才開始使用Markdown,許多功能也還在摸索中,我會慢慢成長的 _(:3」ㄥ)

2017年11月9日 星期四

在ATMega328 (No "P")燒錄Arduino bootloader

起因:從貿澤購買Arduino IC來做電路,卻發現買回來的IC不能燒錄bootloader,google一下才發現ATMega328P與ATMega328不同,Arduino IDE對這顆IC支援也不多。

P.S. 此篇不會記錄燒錄的方法,若想知道其方法,請自行google。

由於沒有特別買燒錄器,所以我是使用Arduino as ISP的方式進行燒錄bootloader

Step1. 先將作為燒錄器的Arduino板燒錄"ArduinoISP"韌體

Step2. 將Arduino板與目標IC接上

on the ICSP/SPI header:

| Arduino板 | 目標IC |
|   MISO      |  MISO  |
|   MOSI      |  MOSI  |
|   SCLK      |  SCLK  |
|   5V            |  5V       |
|   GND        |   GND  |
|   D10         |  RESET |

Step3. 新增燒錄項目
我的Arduino環境是使用1.5.8,以下是皆以此環境為例:

a.找到下面路徑
arduino-1.5.8-windows\arduino-1.5.8\hardware\arduino\avr\board.txt
b.在檔案內新增下列內容

############################################################## ##ATmega328 (non-picopower) ## ------------------------------------------------- atmega328npp.name=ATmega328 (non-picopower) atmega328npp.upload.tool=avrdude atmega328npp.upload.protocol=arduino atmega328npp.upload.maximum_size=30720 atmega328npp.upload.speed=57600 atmega328npp.upload.maximum_data_size=2048 atmega328npp.bootloader.tool=avrdude atmega328npp.bootloader.unlock_bits=0x3F atmega328npp.bootloader.lock_bits=0x0F atmega328npp.bootloader.low_fuses=0xFF atmega328npp.bootloader.high_fuses=0xDA atmega328npp.bootloader.extended_fuses=0x05 atmega328npp.bootloader.file=atmega/ATmegaBOOT_168_atmega328.hex atmega328npp.build.mcu=atmega328 atmega328npp.build.f_cpu=16000000L atmega328npp.build.core=arduino atmega328npp.build.variant=standard ##############################################################

Step.啟動IDE
選取剛剛建立的ATmega328 (non-picopower)項目
再選擇ArduinoISP的COM Port,接著按下Burn Bootloader進行燒錄。

番外篇:
ATMega328燒錄韌體的方式,目前我的解決方式也是透過ICSP/SPI的燒錄方式進行燒錄,
接線的方式跟燒錄bootloader方式一樣,Board & Port設定也一樣,
將程式完成之後,先進行編譯(Verify),之後再選擇File -> Upload Using Programming,
此時,就會將此程式燒錄在ATMega328上。

參考
1. http://troy.jdmz.net/micro/avr/atmega328.html
2. http://www.digitalmisery.com/2011/11/arduino-bootloader-with-atmega328-and-atmega328p/


2017年10月25日 星期三

Arduino DUE上的ATmega16u2韌體燒錄

由於工作上碰到需要將Arduino DUE整合在PCB板上,所以預先學習及實際燒錄實驗,特此將資料做紀錄,但目前PCB板還在設計中,未來如果在實際操作中還遇到什麼問題,將會繼續補充。

此篇不會講到:
1. 燒錄方法 -> 請自行爬文。
2. DUE在Arduino IDE的環境安裝 -> 請自行爬文。

實作環境:
Arduino IDE 1.5.8

首先須說明的是雖然DUE跟UNO、MEGA2560一樣是使用ATmega16u2,用途也是類似FT232(USB裝置IC)之功能,但是其中燒錄的韌體是完全不同的,所以不可以直接用FT232來代替。

我們先從官方的電路圖來看:




16U2的pin23(PC6)是有做SAM3X8E的ERASE功能,此功能在UNO、MEGA2560都是沒有的。

燒錄方式

請參考 => https://petervanhoyweghen.wordpress.com/2013/02/25/modifying-the-atmega16u2-firmware-on-the-due/

這邊SPI的5V我沒有接到DUE的VCC,DUE是獨立供電(因為工作電壓為3.3V怕有疑慮)

都準備好了就可以開啟CMD下指令燒錄囉(請依照自己的路徑做修改)

主要要修改下列路徑:
avrdude.exe
avrdude.conf
Arduino-DUE-usbserial-prod-firmware-2013-02-05.hex -> 似乎只有1.5.X的IDE才會有,我另外一個1.8.X版本的IDE沒有此檔案

 "C:\Users\Desktop\arduino-1.5.8-windows\arduino-1.5.8\hardware\tools\avr\bin\avrdude.exe" -C "C:\Users\Desktop\arduino-1.5.8-windows\arduino-1.5.8\hardware\tools\avr\etc\avrdude.conf" -v -v -v -v -p m16u2 -c avrisp -P COM9 -b 19200 -U flash:w:C:\Users\arduino-1.5.8-windows\arduino-1.5.8\hardware\arduino\sam\firmwares\atmega16u2\Arduino-DUE-usbserial-prod-firmware-2013-02-05.hex:i

燒錄完成後就可以透過USB燒錄囉


2017年10月24日 星期二

Arduino語法介紹-PROGMEM

使用時機
1. 存放指令
    當你需要宣告存放指令名稱的空間。
2. 大量重覆性資料
    當你有大量的重複性資料需要透過Serial、Client…等,Steam類型的物件print。
3. 查表法表格
    當你需要設置一個資料量大的查表法表格。

為何使用
要解決硬體SRAM空間不足之問題,使用PROGMEM就是將這些大量資料從SRAM搬到Flash,當要使用的時候再從Flash中搬回來。 因為AVR系列的晶片SRAM大小不一,當資料大的情況,使用超過硬體的SRAM大小,此時編譯器編譯可能不會報錯,但是在使用上不代表程式運作不會發生異常。

如何使用
PROGMEM 變數修飾符是被定義在 pgmspace.h 之中,它是 AVR 架構中 pgmspace.h 函式庫眾多函式的其中之一。所以您要使用 PROGRAM 之前,必須在程式的開頭包含入這個函式庫,如下: #include 然後,使用下列句法給值

const dataType variableName [ ] PROGMEM = {data0, data1, data2...};

dataType - 表資料型態。
variableName - 表變數名稱。

PROGMEM 只是一個變數修飾符,它沒有被規定應該放在哪個位置,所以下列三種宣告方式都可以通過編譯器的編譯:

const dataType variableName [ ] PROGMEM = {data0, data1, data2...};
const PROGMEM dataType variableName [ ] = {data0, data1, data2...};
const dataType PROGMEM variableName [ ] = {data0, data1, data2...};

注意事項

請注意,為了要使用 PROGMEM,您必須將變數指定為全域變數(Global)或靜態變數(Static)。 下列程式碼若是被放在函式裡面,它將不會運作

const char long_str[] PROGMEM = "Hello world.";

下列程式碼若是被放在函式裡面,它會運作

const static char long_str[] PROGMEM = “Hello world." 

官方範例 =>  https://www.arduino.cc/en/Reference/PROGMEM

小小的Demo Exported from Notepad++
#include <avr/pgmspace.h> const char Command_0[] PROGMEM = "*IDN?"; const char Command_1[] PROGMEM = "Start"; const char Command_2[] PROGMEM = "END"; const char* const CommandTable[] PROGMEM = { Command_0, Command_1, Command_2 }; void setup() { Serial.begin(19200); while (!Serial); //PGM_ReadChar demo char yy[10]; PGM_ReadChar(yy, CommandTable[0]); //print yy for (int r = 0; r < strlen(yy); r++) Serial.println(yy[r]); //PGM_ReadChar_PT demo PGM_ReadChar_PT(CommandTable[1]); } void loop() { } void PGM_ReadChar(char input[], const char PGM_Arr[]) //Read PROGMEM to char[] { int len = strlen_P(PGM_Arr); int Cnt; for (Cnt = 0; Cnt < len; Cnt++) { input[Cnt] = pgm_read_byte_near(PGM_Arr + Cnt); } input[Cnt] = "\0"; } void PGM_ReadChar_PT(const char PGM_Arr[]) //Read PROGMEM to print { int len = strlen_P(PGM_Arr); char MyChar; for (int k = 0; k < len; k++) { MyChar = pgm_read_byte_near(PGM_Arr + k); Serial.print(MyChar); } }





2017年9月8日 星期五

Arduino 2560 + Ethernet 硬體整合問題

以下是我遇到的情況與心得,特別作成筆記,目標是將Arduino與Etherner擴充版整合在同一個PCB版上,以下是程式的部分:


byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED}; IPAddress ip(127,0,0,1); Void setup() { Ethernet.begin(macData, ip ); Serial.println(Ethernet.localIP()); } void loop() { }









接下來說明遇到困難的部分:
問題1:與W5500沒有連接上,此時回傳的IP會顯示0.0.0.0

問題2:是與W5500有連接上,回傳IP為你的設定值(127.0.0.1),但是連上server的同時馬上斷線,可能是電位的問題,因為W5500的工作電壓是3.3VArduino 25605V所以在SPI的通訊線要做降壓的動作,我參考SeeedStudioW5500 EthernetShield的電路,他是使用74VHC125MTCx ,簡單的說明一下他的工作行為,我們將SPIMOSI,SCLK接上此IC的輸入,他的輸出等同你供給74VHC125MTCxVDD的電位,所以要將他的VDD接上3.3VSSpin可以接上74VHC125MTCx,也可以直接接上W5500,此時W5500應該就會正常工作。