電子電機

Procyon AVRlib

Procyon AVRlib
C-Language Function Library for Atmel AVR Processors

由Pascal Stang所寫,一套AVR開發專用,非常了不起的函式庫

AVRlib和之前提過的avr-libc名字很像,不過絕對是不同的東西
avr-libc是類似C標準函式庫
AVRLib則是提供了許多較高階的函式

有多了不起?
來看看他有那些功能:

WinAVR(AVR-GCC)的奇怪問題

(這篇是從舊文章整理出來的)

GCC在compile的時候可以用-o的參數來設定optimize的程度,可設為不作最佳化(-○0),或是-o1~3和-os幾種最佳化的等級。-o0的時候是不會有什麼問題啦,不過程式不作optimize的話塞不進Tiny2313裏面。所以程式才寫到大概一半大小的時候就開始用最佳化compile,然後就發現有個地方一直很奇怪…..。
來看一小段程式:

tmp = RRR / 5 - 3; // tmp型別為int,所以不會取到小數部份
if (tmp > 5) {
  AAA = 5;
} else if (tmp < 1) {
  AAA = 1;
} else if (((RRR % 5) * 10 / 5) > 4) { // 手動四捨五入
  AAA = tmp + 1;
}

這段程式主要是要把RRR轉換成AAA 1~5的數值。RRR正常是20~40,有時會超出這個範圍,所以用了兩個判斷式去限制住讓AAA不會爆掉,就這麼簡單而已。
然後…我發現不管RRR的數值是多少,他在第一個else if的地方程式執行時總認為tmp=0,所以,判斷式就成立,結果就是AAA永遠=1。
怪吧?更怪的是在如果第一個if前面先去判斷tmp的值來看看,他會告訴你tmp不等於0…。然後才過了兩行程式,tmp就變0了。
裏面所有的變數都是宣告為signed int,跟其它變數也都沒有衝突的問題。而且只要compile的時候不要作optimize,就一切正常,所以程式本身應該是沒問題的。

結果怎麼解?我把tmp拿掉就好了…直接寫成:

AAA = RRR / 5 - 3;
if (AAA > 5) {
  AAA = 5;
} else if (AAA < 1) {
  AAA = 0;
} else if (((RRR % 5) * 10 / 5) > 4) { // 手動四捨五入
  AAA++;
}

這樣跑起來就正常了(?),看來大概這compiler討厭我的tmp吧?好吧,不去管原因了,就先加減用。結果過沒兩天我改了程式的其它不相干的地方之後,他又壞了。
這次一樣壞在第一個else if的地方,他總認為AAA = 0…最後又讓AAA變成永遠=1。 (你那麼愛讓AAA=1嗎?)

我只好再換另一種寫法:

AAA = RRR / 5;
if (AAA > 8) {
  AAA = 8;
} else if (AAA < 4) {
  AAA = 4;
} else if (((RRR % 5) * 10 / 5) > 4) { // 手動四捨五入
  AAA++;
}
AAA -= 4

把減4的動作移到最後面再作,這樣就又好了….這什麼道理?

所以…
有遇到程式跑起來很奇怪的時候,試試看先把compile optimize設成-o0吧

LCD偏光片

LCD偏光片…用途是貼在LCD面板正反兩面讓他產生影像,
正常人應該一輩子也不會有機會用到這玩意。

那我這麼正常的人幹麻又跑去買了啊!?

Project: rcLight(3): 電路圖

快弄好了,差不多就剩焊到板子上而已。

右上角的是大燈和方向燈,右下的是尾燈、倒車燈、方向燈。然後中間有個叭叭叭。
左邊CH1~3是從接收機接過來的PWM訊號。

最右下的是上次說的降壓/穩壓的線路,最後用一顆稽納二極體和一顆電阻作出來了。電壓大約是在5.0~5.3v之間,雖然還是有點波動,不過跟沒作穩壓前比起來真是強多了。正負之間跨接一顆100uF的電容,對訊號穩定很有幫助,否則伺服機常會被MCU電路干擾產生不正常的抖動。

LED和蜂嗚器透過六顆電晶體驅動,電晶體用共集極的接法,左上的是示意圖。BE和BC接面都是順向,我想應該是工作在飽合區才對,不過還是可以藉由基極後面的電阻改變電流量。

蜂鳴器串上一顆電容聲音會感覺比較像真的汽車喇叭。

尾燈和剎車燈是共用同一組LED,只差別在亮度不同,所以是用兩組不同的電阻來控制。

Project: rcLight(2): 詭異的WinAVR(AVR-GCC)

這次作BMW的車燈,MCU用的是Atmel AVR系列的ATtiny2313。這顆MCU實在是超好用的,同廠51系的2051完全被打趴啊!不過這不是重點,今天要講的是跟開發平台相關的東東…。

為了WinAVR Compile出來怪怪的,這兩天回家全都在測試程式有沒其它地方也出問題…計畫進度=0 :~(

單晶片:入門

我想用一種門外漢的角度,來寫篇單晶片的入門文章。非相關科系的人要學單晶片最大的問題是,不知從何著手。網路上找到的資訊通常都蠻零散的,只能靠自己一點一點慢慢拼湊;而市面上的書籍內容通常較為專一,很難獲得較全面的訊息。這篇文章算不上是教學吧?不過我儘量把我在學的時候遇到的問題作個整理,想學的人看一看也許能夠有個方向。

.關於單晶片
CPU(Central Processing Unit, 中央處理器)相信大家都知道這是什麼。比較小,比較遜的CPU就叫作MPU(Micro Processing Unit, 微型處理器)。今天的主角叫作MCU(Micro Control Unit, 微型控制器), 又稱作單晶片微電腦(Single Chip Microcomputer),在台灣習慣稱作「單晶片」,在大陸則管他叫「單片機」。MCU跟MPU一樣可以看作是一種微型處理器,但不同的是MCU通常會將CPU、RAM、ROM、I/O介面等全都包含在同一顆晶片上。也就是說一顆MCU晶片就可以看作是一部超迷你型的電腦。
MCU通常是拿來作一些小型的控制,像是家電、自動控制、玩具等等,需要作一些電腦控制,但又不可能把一台電腦放進去的那種場合,就非常的好用。在業界很多人是靠這個吃飯,但喜歡的話可以拿來作點小玩具玩,比如沒事可以來作個CD-Pro2,或是小機器人之類的,也蠻不錯的。

Scroll to Top