明天要去日月潭囉,這是定的飯店,可以看到湖喔
另一個消息是....中央氣象局提供的
強烈颱風"龍王"也要一起去......
星期五, 9月 30, 2005
Palm也不是Palm了: Run Windows 的Palm手機
http://www.microsoft.com/windowsmobile/5/palm.mspx
這應該是全台灣的努力造成的。
據說80%的smartphone手機都是台灣設計的(製造當然都是在大陸)。
最後導致Palm不得次放棄自己比較好用的OS,選用看起來比較炫,但是不怎麼好用的Windows smartphone.
果然和我猜的一樣,Windows終究會贏得勝利。
接著,就和MB一樣,所有的廠商都會作smartphone。
............OS都用MS的就可以了。
這應該是HTC教導MS有關smartphone的know how,讓MS修改他smartphone的平台。
最後platform 都OK了,也就沒有進入門檻。 只要follow MS design suggestion 就可以run
smartphone,HTC的優勢也就漸漸消失了。
可能還有空間吧:目前smart phone都使用GSM module來作,所以PDA UI/Application操作要一個MCU,GSM module要一個MCU。
HTC會自己做GSM module,所以可以將GSM module內的MCU和PDA 的MCU (甚至GPS的MCU) 共用。 這樣空間,耗電量和Cost都可以縮小。 GSM和GPS的軟體package也不會被併入MS的smartphone platform 中。
這應該是全台灣的努力造成的。
據說80%的smartphone手機都是台灣設計的(製造當然都是在大陸)。
最後導致Palm不得次放棄自己比較好用的OS,選用看起來比較炫,但是不怎麼好用的Windows smartphone.
果然和我猜的一樣,Windows終究會贏得勝利。
接著,就和MB一樣,所有的廠商都會作smartphone。
............OS都用MS的就可以了。
這應該是HTC教導MS有關smartphone的know how,讓MS修改他smartphone的平台。
最後platform 都OK了,也就沒有進入門檻。 只要follow MS design suggestion 就可以run
smartphone,HTC的優勢也就漸漸消失了。
可能還有空間吧:目前smart phone都使用GSM module來作,所以PDA UI/Application操作要一個MCU,GSM module要一個MCU。
HTC會自己做GSM module,所以可以將GSM module內的MCU和PDA 的MCU (甚至GPS的MCU) 共用。 這樣空間,耗電量和Cost都可以縮小。 GSM和GPS的軟體package也不會被併入MS的smartphone platform 中。
星期四, 9月 29, 2005
Analog Device也有作GSM Baseband Soc
就是 http://www.analog.com/en/prod/0,2877,AD6525,00.html
ARM7 + ADSP 218X.
內含" Sufficient " RAM,當然,也可以外加。
支援VisualFone 開發環境
詳細的Spec要簽NDA才拿得到.
AD 也有GSM的Voice Codec : 6521 http://www.analog.com/zh/prod/0%2C2877%2CAD6521%2C00.html
以上就是AD家的Othollo 平台。
ARM7 + ADSP 218X.
內含" Sufficient " RAM,當然,也可以外加。
支援VisualFone 開發環境
詳細的Spec要簽NDA才拿得到.
AD 也有GSM的Voice Codec : 6521 http://www.analog.com/zh/prod/0%2C2877%2CAD6521%2C00.html
以上就是AD家的Othollo 平台。
scsitools : Debian 的scsi hd 工具程式(集)
只要用
#apt-get install scsitools
就可以安裝了(但是要是unstable 才行).
並不是叫scsitools,實際上是一組工具程式
但是裝了以後,只有
scsiinfo
scsiformat
不太有用...
#apt-get install scsitools
就可以安裝了(但是要是unstable 才行).
並不是叫scsitools,實際上是一組工具程式
但是裝了以後,只有
scsiinfo
scsiformat
不太有用...
Linux各Distribution的版本
看Kernel的版本用uname -a
但是要看distribution的版本呢?
再Moto有看到
但是要看distribution的版本呢?
再Moto有看到
RedHat 裡面有 /etc/redhat-release
Mandrake 有 /etc/mandrake-release
B2D 有 /etc/b2b-release
可是 Debian , ubuntu , slackware 沒有類似的檔案
slackware有/etc/slackware-version這個檔
debian也有 /etc/debian_version這個檔案
剛好 ubuntu 也有 /etc/debian_version這個檔案
所以ubuntu沒辦法用這個方式跟debian區分
當我試著cat /proc/version . 會出現
代碼:
Linux version 2.6.10-5-386 (buildd@terranova) (gcc version 3.3.5 (Debian 1:3.3.5-8ubuntu2)) #1 Tue Apr 5 12:12:40 UTC 2005
可以偷偷的發現是ubuntu , 但是不知道是哪個版本
但是Debian就很帥氣的顯示
代碼:
Linux version 2.2.20-idepci (herbert@gondolin) (gcc version 2.7.2.3) #1 Sat Apr 20 12:45:19 EST 2002
連Debian的字眼都沒顯示
最後當我
cat /etc/issue
ubuntu 會出現 Ubuntu 5.04 "Hoary Hedgehog" \n \l
Debian會出現 Debian GNU/Linux 3.1 \n \l
所以 , 我個人覺得 cat /etc/issue 應該可以獲得最好的資訊
再真正的server上create raid device
Xeon 2.6G
RAM 1G
SCSI Card是aic79xx,接4個SCA的HD。
sda1 : root
sdb : 好像壞掉
sdc , sdd - 作一個 raid1的partition
sdc, sdd 各create一個type 'fd' 的partition:
#fdisk /dev/sdb
n : new a partition
p : primary
t : change partition id
- fd -Linux raid autodetect
w : write table to disk and exit
用mdadm create一個md
#mdadm -C /dev/md0 --level=raid1 --raid-device=2 /dev/sdc1 /dev/sdd1
回應
mdadm: array /dev/md0 started
現在開始建立,初始化raid hd,這個需要一點時間...可以用
#cat /proc/mdstat
看到進度的百分比.....很慢,約11M/sec,越後面越慢
RAM 1G
SCSI Card是aic79xx,接4個SCA的HD。
sda1 : root
sdb : 好像壞掉
sdc , sdd - 作一個 raid1的partition
sdc, sdd 各create一個type 'fd' 的partition:
#fdisk /dev/sdb
n : new a partition
p : primary
t : change partition id
- fd -Linux raid autodetect
w : write table to disk and exit
用mdadm create一個md
#mdadm -C /dev/md0 --level=raid1 --raid-device=2 /dev/sdc1 /dev/sdd1
回應
mdadm: array /dev/md0 started
現在開始建立,初始化raid hd,這個需要一點時間...可以用
#cat /proc/mdstat
看到進度的百分比.....很慢,約11M/sec,越後面越慢
Debian Sarge : upgrade to unstable
原來用CD安裝的,到/etc/apt/sources.list看,寫的是unstable,但是改由網路作feed
deb http://debian.csie.ntu.edu.tw
後,要寫stable。
這個kernel 是 2.4.27-1
用網路的feed,改unstable後,run apt-get update, apt-get upgrade.
好像會grade到2.6的kernel ... download中
.... 沒這回事....
到aptitude中 Uninstalled package - base - main中選2.6的kernel image
I - install
g - download and install
就會將2.6的kernel image安裝進來,同時也install 需要升級的package.
(其實是顯示一些可以升級,但是沒有升級的package)。
download 完後,會在GRUB中多一個2.6 的boot image。並且放在boot option的第一個(default)
.
用apt-get upgrade,但是有一些package是holdback.
用apt-get dist-upgrade,好像所有都upgrade了...例如gcc升級到4.0
試試編譯核心(Debian's way), ref : http://www.falkotimme.com/howtos/debian_kernel2.6_compile/
說要kernel-package
還要有ncurses-dev fakeroot
沒辦法,只好到kernel site去download :
deb http://debian.csie.ntu.edu.tw
後,要寫stable。
這個kernel 是 2.4.27-1
用網路的feed,改unstable後,run apt-get update, apt-get upgrade.
好像會grade到2.6的kernel ... download中
.... 沒這回事....
到aptitude中 Uninstalled package - base - main中選2.6的kernel image
I - install
g - download and install
就會將2.6的kernel image安裝進來,同時也install 需要升級的package.
(其實是顯示一些可以升級,但是沒有升級的package)。
download 完後,會在GRUB中多一個2.6 的boot image。並且放在boot option的第一個(default)
.
用apt-get upgrade,但是有一些package是holdback.
用apt-get dist-upgrade,好像所有都upgrade了...例如gcc升級到4.0
試試編譯核心(Debian's way), ref : http://www.falkotimme.com/howtos/debian_kernel2.6_compile/
說要kernel-package
#apt-get install kernel-package完成後 /usr/share/和/usr/share/doc下就有kernel-package目錄了
還要有ncurses-dev fakeroot
#apt-get install ncurses-dev還有kernel source. 因為只想install自己現在版本的source code
#apt-get install fakeroot
#uname -a看一下是2.6.8
#apt-get install kernel-source他會列出所有的version,並說要指定版本才行,所以挑了一個2.6.8的...
#apt-get install kernel-source-2.6.8但是竟然download不下來,改了一些deb site也是一樣,只好改download 2.6.10
#apt-get install kernel-source-2.6.10奇怪,一直錯,只好follow他的instruction加上--fix-missing
#apt-get install kernel-source-2.6.10 --fix-missing應該是firewall的關係,到41%又fail
沒辦法,只好到kernel site去download :
wget http://www.tw.kernel.org/pub/linux/kernel/v2.6/linux-2.6.13.tar.gz
星期三, 9月 28, 2005
Debian : apt-get & sources.list
因為Server放在小房間裡,每次要apt-get install 時,還要去放CD很麻煩,所以想用網路作source。
修改 /etc/apt/sources.list
將原來
deb cdrom:[....]/ unstable contrib main ,,,, comment掉(加上"#")。
然後加入網路上的source:
deb http://debian.csie.ntu.edu.tw/debian unstable main contrib non-free
deb http://debuan.csie.ntu.edu.tw/debian-non-US unstable main contrib non-free
以上的site path可以到 http://www.debian.org/mirror/mirrors_full 去找
之後,apt-get update。開始到site download package list.
這個是中文軟體的deb source : http://apt.debian.org.tw/
修改 /etc/apt/sources.list
將原來
deb cdrom:[....]/ unstable contrib main ,,,, comment掉(加上"#")。
然後加入網路上的source:
deb http://debian.csie.ntu.edu.tw/debian unstable main contrib non-free
deb http://debuan.csie.ntu.edu.tw/debian-non-US unstable main contrib non-free
以上的site path可以到 http://www.debian.org/mirror/mirrors_full 去找
之後,apt-get update。開始到site download package list.
這個是中文軟體的deb source : http://apt.debian.org.tw/
deb-src http://apt.debian.org.tw unstable main
Opera PC 版 免費,還提供Blog Host
使用起來跟Firefox比較像,也有"skin"可以download。
tabe browsing(似乎已經成為browser的標準)。
在Opera的首頁,有Blog host邀請,是免費的。
還提供import blog功能,可以將Blogger的內容import進去。真是不錯。
Opera Browser和Firefox差不多,但是他的Blog就比blogger好一些。
有Tag, upload file, import功能。
... 剛剛發現Opera在Blogger的Edit page中,一些tools都顯示不出來。
tabe browsing(似乎已經成為browser的標準)。
在Opera的首頁,有Blog host邀請,是免費的。
還提供import blog功能,可以將Blogger的內容import進去。真是不錯。
Opera Browser和Firefox差不多,但是他的Blog就比blogger好一些。
有Tag, upload file, import功能。
... 剛剛發現Opera在Blogger的Edit page中,一些tools都顯示不出來。
星期二, 9月 27, 2005
為什麼RX不會動.----電路圖還是要看一下
搞了很久,為什麼TX可以通,但是RX卻不能通。 用MCU時,卻又都可以。
只好認命了,拿電路圖來看,拿示波器來量。
這是一個level轉換電路,將D0由Vcc位準轉為Vext位準。輸出R pin和Siplex的out短接。
唉,結果是這樣。
當MCU拿走時,D0是Open的,所以Q14不導通,導致Q15導通,所以R端永遠是Low。
R端和我外接的Siplex232的output並接。所以從RS232傳入的資料,經過Siplex232後,到R pin就永遠是Low了。
修改的方法,應該說是使用的方法,就是把MCU放回去,然後把D0 pin拉High。讓R pin是High.這樣Q15的電阻就是Siplex的負載--應該推的動吧。
的確推得動,但是有一片板子是壞掉的。
只好認命了,拿電路圖來看,拿示波器來量。
這是一個level轉換電路,將D0由Vcc位準轉為Vext位準。輸出R pin和Siplex的out短接。
唉,結果是這樣。
當MCU拿走時,D0是Open的,所以Q14不導通,導致Q15導通,所以R端永遠是Low。
R端和我外接的Siplex232的output並接。所以從RS232傳入的資料,經過Siplex232後,到R pin就永遠是Low了。
修改的方法,應該說是使用的方法,就是把MCU放回去,然後把D0 pin拉High。讓R pin是High.這樣Q15的電阻就是Siplex的負載--應該推的動吧。
的確推得動,但是有一片板子是壞掉的。
VIA EPIA platform,, small size pc
這個是VIA的EPIA motherboadd(使用C3)的Linux Howto網站
http://epialinux.org/files/epia_howto/index.html
其中有說明VIA這類CPU的比較表,和安裝Linux driver的說明
這裡是VIA提供的Display FBdev的driver
http://www.viaarena.com/default.aspx?PageID=420&OSID=25&CatID=2580&SubCatID=101
EPIOS,以Gentoo base,為VIA EPIA chip所作的linux distro,這是一個forum
http://www.epios.net/viewtopic.php?t=80
http://epialinux.org/files/epia_howto/index.html
其中有說明VIA這類CPU的比較表,和安裝Linux driver的說明
這裡是VIA提供的Display FBdev的driver
http://www.viaarena.com/default.aspx?PageID=420&OSID=25&CatID=2580&SubCatID=101
EPIOS,以Gentoo base,為VIA EPIA chip所作的linux distro,這是一個forum
http://www.epios.net/viewtopic.php?t=80
MINIX NETWORK CODE COMMENT
這個是一定要紀錄一下的啦:
http://www.os-forum.com/minix/net/
一行一行的解釋Minix 的networking code.
....當然,還是英文。....所以有些人或許覺得code還比英文好懂。
這個呢,也是MINIX的code comment :
http://www.swartzbaugh.net/index.php
是MINIX OVER-DOCUMENT Site
有詳細說明和圖解
http://www.os-forum.com/minix/net/
一行一行的解釋Minix 的networking code.
....當然,還是英文。....所以有些人或許覺得code還比英文好懂。
這個呢,也是MINIX的code comment :
http://www.swartzbaugh.net/index.php
是MINIX OVER-DOCUMENT Site
有詳細說明和圖解
星期一, 9月 26, 2005
Hitech C Compiler for PIC
一些奇怪的行為:
const char 和 char不能比較:
這樣不行,要先宣告一個local variable,再取出constr的內容
這樣才可以
const char 和 char不能比較:
bit samestr(char *data,const char *cstr)
{
if(data[i]==cstr[i]){
.....
這樣不行,要先宣告一個local variable,再取出constr的內容
char temp;
temp=cstr[i];
if(data[i]==temp({
....
這樣才可以
星期五, 9月 23, 2005
PIC UART
PIC的UART可以做
Asynchronous (Full duplex)
Synchronous - Master (Half duplex)
Synchronous - Slave (Half duplex)
RCSTA中的SPEN (bit 7) 設為1時,enable serial port功能。
同時要將TRISC<7:6>也就是port C的TX/RX pin設為1。才能將TX/RX pin設定正確。
Baudrate Generator (SPBRG)
Serial port有專屬的8 bit timer用來產生baudrate clock。
Baudrate Generator參考系統的Clock Fosc,當TXSTA 的BRGH設為1時,代表高速,所以Baudrate將系統clock /16作為reference.當BRGH是0時,/ 64。
在Synchronous和Aynchronous時,動作不一樣,現在說明Aynchronous:
實際Baudrate的公式是(X是SPBRG的值):
BRGH=0 (LOW Speed)
BRGH=1 (HIGH Speed)
所以使用20MHz Crystal,要達到9600的baudrate時,SPBRG 要設為:
BRGH=0
BRGH=1
傳送的步驟:
接收
Baudrate和Asynchronouse設定跟TX的設定一樣。
設定接收動作的procedure:
Asynchronous (Full duplex)
Synchronous - Master (Half duplex)
Synchronous - Slave (Half duplex)
RCSTA中的SPEN (bit 7) 設為1時,enable serial port功能。
同時要將TRISC<7:6>也就是port C的TX/RX pin設為1。才能將TX/RX pin設定正確。
Baudrate Generator (SPBRG)
Serial port有專屬的8 bit timer用來產生baudrate clock。
Baudrate Generator參考系統的Clock Fosc,當TXSTA 的BRGH設為1時,代表高速,所以Baudrate將系統clock /16作為reference.當BRGH是0時,/ 64。
在Synchronous和Aynchronous時,動作不一樣,現在說明Aynchronous:
實際Baudrate的公式是(X是SPBRG的值):
BRGH=0 (LOW Speed)
Baudrate = Fosc/(64(X+1))
BRGH=1 (HIGH Speed)
Baudrate = Fosc/(16(X+1))
所以使用20MHz Crystal,要達到9600的baudrate時,SPBRG 要設為:
BRGH=0
20,000,000/(64 * 9600) -1 = 33.15
BRGH=1
20,000,000/(16 * 9600) -2 =130.2
- 非同步模式Asynchronous Mode (也就是RS232 模式)
- 將TXSTA bit 4 : SYNC 設為0,代表使用非同步模式
- 傳送的register叫TXREG,當TXREG buffer是空的,會將PIR1 的bit 4 : TXIF設為1.
- 這一個bit可以用來產聲中斷 (將PIE bit 4 : TXIE設為1)。這個interrupt和其他interrupt不同,TXIF只有在有新data放入TXREG時才會被clear掉。
- 將data放入TXREG,data並不會送出去,要將TXSTA bit 5 : TXEN 設為1後才會開始送。
- TXIF代表TXREG的資料已經放入Shift register,可以放入下一筆,但並不帶表data已經送出去。
- 真正代表data送出去的flag是TXSTA bit 1 : TRMT.
- 所以要將TXEN關閉時,不能只檢查TXIF,真正要檢察的是TRMT。
- 如果data在shift register中,還沒送玩,就將TXEN關閉,shift register內剩下的資料會送不出去。
傳送的步驟:
- 設定SPBRG,BRGH,決定Baudrate
- 清除SYNC。
- 設定SPEN
- 依照 需要將TX中斷打開(TXIE=1),或關閉(TXIE=0)。
- 將TXEN設為1,開始傳送動作。(同時會使TXIE=1,因為TXREG是空的)。
- 將要傳送的資料放入TXREG。
- 如果有使用中斷,將GIE和PEIE打開。
SPBRG=130;下面是用中斷作的簡單的tx sending.
BRGH=1;
SPEN=1;
SYNC =0;
TXEN=1;
while(1){
while(!TXIF);
TXREG='A';
}
bit TxOk=0;
char TxBuf[10];
char Txi;
char TxLen;
void interrupt inthandler(void)
{
if(TXIF){
if(Txi < TxLen){
TXREG=TxBuf[Txi];
Txi++;
}else{
TxOk=1;
TXIE=0;
}
}
}
const char *outstr="Hello!";
void main(void)
{
char i;
SPBRG=130;
BRGH =1;
SPEN =1;
SYNC =0;
PEIE=1;
GIE =1;
TXEN=1;
i=0;
TxLen=0;
while(outstr[i]!=0x00){
TxBuf[i]=outstr[i];
TxLen++;
i++;
}
TxOk=0;
TXIE =1;
while(!TxOk);
while(1);
}
接收
Baudrate和Asynchronouse設定跟TX的設定一樣。
- 設定CREG後,Receive Register才開始動作。
- 當收到data後RCIF會被設為1。
- 收到的資料會被放在RCREG。如果有overflow, OERR會被設為1。要清除OERR,要將CREG設為0後再設為1。Reset Receive Logic.
- 當OERR是1,接收動作會停止。
- 當Stop bit收到0時,Framing Error bit : FERR會被設為1,但是一但讀取RCREG後,FERR的值就會倍update掉了,所以在讀取RCREG之前,最好先讀取FERR的值,確認RCREG的內容是正確的
設定接收動作的procedure:
- 設定SPBRG和BRGH bit,決定baudrate
- SYNC=0, SPEN=1.
- 如果要中斷,RCIE=1
- CREN=1,開始接收
- 收到資料後RCIF=1. 如果有設RCIE的話,會中斷
- 讀取RCSTA的FERR好知道stop bit是不是正確。
- 讀取RCREG取得收到的資料
- check error,如果有的話,將CREG=0,再CREG=1
- 如果要中斷,GIE和PEIE要設為1
星期四, 9月 22, 2005
GSM/GPRS MODEM 測試
以下參考
GSM Modem SMS操作
手機通訊錄AT Command
AT Command都以AT開頭,以\r\n結尾。
設備回應時也以0x0d,0x0a結尾。
有些設備在回應時會先以0x0d,0x0a開頭,避免前一個command還沒結束。(就像SLIP, PPP一樣)
AT+CREG?
+CREG: 0,1
OK
註冊OK
ATD0937909999;
OK
因為撥號後有加";"號,所以再命令下達後,會回來,不會等待通話完畢。
當對方接聽後,不會有任何message。
對方掛斷後,會有 NO CARRIER
AT+CHFA?
+CHFA: 0 (NORMAL_AUDIO)
這是選擇硬體audio channel的command,module 硬體有兩個audio channel :
0 : NORMAL - 好像是在modem後面,用電話筒的那一個RJ11接頭
1 : AUX - 是用免持 耳mic線的,旁邊的接頭。
要選的話,用comamnd
AT+CHFA=1
選AUX channel。
一般defaul是Normal (0),用這個command選aux channel後,重開機還是會回到normal channel.
NORMAL MODE時,響鈴會從speaker(外接,不是話筒handset的speaker)播出來。
AUX MODE時,響鈴會從耳mic播出。
設定喇叭音量
AT+CLVL= 0 關閉喇叭音量(設為0)
AT+CLVL=100 將音量開最大(設為100)
AT+CPIN=1234
+STC: 0
OK
輸入PIN碼,開機時會用到,要輸入後才能使用SIM card.
有電話撥入時,會顯示
RING
約 每 1 sec 送出一次。
當有電話撥入時,用
ATA;
可以接聽。一定要加";"號。
當有電話撥入時,用
AT+CLCC
會回應caller number
+CLCC: 1,1,4,0,0,"+886939900000",145
列出簡訊,
AT+CMGL=?
以下command依SMS的Mode是TEXT或PDU而有所區分,PDU Mode時
+CMGL: 0,1,2,3,4
這樣用(=?)會列出支援的列出方式
0 : 收到的,未讀的message
1 : 收到的,已讀的message
2 : 儲存的,未送出的message
3 : 儲存的,已送出的message
4 : 所有的message。
所以要讀取(列出)所有的message,要用
AT+CMGL=4
在TEXT MODE時,0,1,2,3,4變成
+CMGL: "REC READ","REC UNREAD","STO SENT","STO UNSENT","ALL"
要讀取所有的message,要用
AT+CMGL="ALL"
就會列出所有收到的messasge內容:
+CMGL : 1,1,,49
07896E0900000000.....<略>
+CMGL : 2,1,,33
079122347E7AC909....<略>
簡訊的模式,收發顯訊有兩種模式:0. PDU, 1: Text. default是PDU Mode.
PDU : Protocol Description Unit.
實際上SMS傳送的格式都是PDU,Text是GSM Modem支援的另一種模式,將AT command輸入的文字轉為PDU格式發出。
AT+CMGF=?
+CMGF : (0-1)
列出支援的模式,Modem回應它支援0,和1模式。
設定使用文字模式(1)
AT+CMGF=1
OK
收到簡訊時,回有
+CMTI: "SM", 2
代表收到SMS,放在"SM"記憶區,index是2
("SM",和2之間會有一個空格,當index是兩位數時,這個空格一樣存在)
+CMTI是Modem傳出的command,沒有user 輸入的格式。(是unsolicited command)
讀取簡訊
AT+CMGR=2
讀取index 2的簡訊,Modem會印出
+CMGR: "REC UNREAD","+886937909999",,"05/09/23",09:52:48+32"
123
OK
第 一行列出SMS的狀態,之後換行<CR&~~SPECIAL_REMOVE! #~~gt;<LF>再來是 message的內容"123".
AT+CMGR command顯示的內容會隨著SMS format (AT+CMGF=?)而不同。
和上面同一個message,在+CMGF=0(pdu mode)時會顯示:
+CMGR: 1,,22
0791589723848098040C918896330975290000509032902584230331D90C
但是在+CMGF=1時,會顯示
+CMGR: "REC READ","+886937975999",,"05/09/23,09:52:48+32"
123
寄簡訊
AT+CMGS=0939909999
>message
然後用Ctrl-Z結束
再TEXT Mode時,message會直接轉成Text,
在PDU Mode時,要follow pdu formate。輸入內碼。
刪除簡訊
AT+CMGD=11
刪除第11筆簡訊
電池電壓
AT+CBC
+CBC: 0,53
第一個數字0代表電源輸入是電池還是外部電源,0是電池
53代表電壓是53% full
變更loacal的baudrate
AT+IPR=9600
將loacl baudrate設為9600
這一項設定在reset後還會保留。
設定回應輸入命令(echo)
ATE0 關閉回應
ATE1 開啟回應
這個command不用加 AT+
選取電話簿
電話簿有很多:SIM card,話機... etc
AT+CPBS=?
+CPBS: ("SM","ON","MC")
SM帶保SIM card
ON代表電話機
選擇SIM card電話簿用
AT+CPBS="SM"
讀取電話簿
AT+CPBR=1,20
列出1到20筆電話簿內容
如果只要讀一筆,就用
AT+CPBR=7
讀取第7筆
寫入電話簿
AT+CPBW=12,"0939909999",129,"XO"
將名叫XO的電話0939909999寫入memory 12的位置
129代表文字編碼,用129就OK了。
播打電話簿的號碼:
ATD>2;
播打現在使用記憶體中第二的位置的號碼
ATD>SM2;
播打SM(SIM)記憶體第二位置的號碼
ATD>"A1"
播打記憶體中名叫A1的電話
GSM Modem SMS操作
手機通訊錄AT Command
AT Command都以AT開頭,以\r\n結尾。
設備回應時也以0x0d,0x0a結尾。
有些設備在回應時會先以0x0d,0x0a開頭,避免前一個command還沒結束。(就像SLIP, PPP一樣)
AT+CREG?
+CREG: 0,1
OK
註冊OK
ATD0937909999;
OK
因為撥號後有加";"號,所以再命令下達後,會回來,不會等待通話完畢。
當對方接聽後,不會有任何message。
對方掛斷後,會有 NO CARRIER
AT+CHFA?
+CHFA: 0 (NORMAL_AUDIO)
這是選擇硬體audio channel的command,module 硬體有兩個audio channel :
0 : NORMAL - 好像是在modem後面,用電話筒的那一個RJ11接頭
1 : AUX - 是用免持 耳mic線的,旁邊的接頭。
要選的話,用comamnd
AT+CHFA=1
選AUX channel。
一般defaul是Normal (0),用這個command選aux channel後,重開機還是會回到normal channel.
NORMAL MODE時,響鈴會從speaker(外接,不是話筒handset的speaker)播出來。
AUX MODE時,響鈴會從耳mic播出。
設定喇叭音量
AT+CLVL= 0 關閉喇叭音量(設為0)
AT+CLVL=100 將音量開最大(設為100)
AT+CPIN=1234
+STC: 0
OK
輸入PIN碼,開機時會用到,要輸入後才能使用SIM card.
有電話撥入時,會顯示
RING
約 每 1 sec 送出一次。
當有電話撥入時,用
ATA;
可以接聽。一定要加";"號。
當有電話撥入時,用
AT+CLCC
會回應caller number
+CLCC: 1,1,4,0,0,"+886939900000",145
列出簡訊,
AT+CMGL=?
以下command依SMS的Mode是TEXT或PDU而有所區分,PDU Mode時
+CMGL: 0,1,2,3,4
這樣用(=?)會列出支援的列出方式
0 : 收到的,未讀的message
1 : 收到的,已讀的message
2 : 儲存的,未送出的message
3 : 儲存的,已送出的message
4 : 所有的message。
所以要讀取(列出)所有的message,要用
AT+CMGL=4
在TEXT MODE時,0,1,2,3,4變成
+CMGL: "REC READ","REC UNREAD","STO SENT","STO UNSENT","ALL"
要讀取所有的message,要用
AT+CMGL="ALL"
就會列出所有收到的messasge內容:
+CMGL : 1,1,,49
07896E0900000000.....<略>
+CMGL : 2,1,,33
079122347E7AC909....<略>
簡訊的模式,收發顯訊有兩種模式:0. PDU, 1: Text. default是PDU Mode.
PDU : Protocol Description Unit.
實際上SMS傳送的格式都是PDU,Text是GSM Modem支援的另一種模式,將AT command輸入的文字轉為PDU格式發出。
AT+CMGF=?
+CMGF : (0-1)
列出支援的模式,Modem回應它支援0,和1模式。
設定使用文字模式(1)
AT+CMGF=1
OK
收到簡訊時,回有
+CMTI: "SM", 2
代表收到SMS,放在"SM"記憶區,index是2
("SM",和2之間會有一個空格,當index是兩位數時,這個空格一樣存在)
+CMTI是Modem傳出的command,沒有user 輸入的格式。(是unsolicited command)
讀取簡訊
AT+CMGR=2
讀取index 2的簡訊,Modem會印出
+CMGR: "REC UNREAD","+886937909999",,"05/09/23",09:52:48+32"
123
OK
第 一行列出SMS的狀態,之後換行<CR&~~SPECIAL_REMOVE! #~~gt;<LF>再來是 message的內容"123".
AT+CMGR command顯示的內容會隨著SMS format (AT+CMGF=?)而不同。
和上面同一個message,在+CMGF=0(pdu mode)時會顯示:
+CMGR: 1,,22
0791589723848098040C918896330975290000509032902584230331D90C
但是在+CMGF=1時,會顯示
+CMGR: "REC READ","+886937975999",,"05/09/23,09:52:48+32"
123
寄簡訊
AT+CMGS=0939909999
>message
然後用Ctrl-Z結束
再TEXT Mode時,message會直接轉成Text,
在PDU Mode時,要follow pdu formate。輸入內碼。
刪除簡訊
AT+CMGD=11
刪除第11筆簡訊
電池電壓
AT+CBC
+CBC: 0,53
第一個數字0代表電源輸入是電池還是外部電源,0是電池
53代表電壓是53% full
變更loacal的baudrate
AT+IPR=9600
將loacl baudrate設為9600
這一項設定在reset後還會保留。
設定回應輸入命令(echo)
ATE0 關閉回應
ATE1 開啟回應
這個command不用加 AT+
選取電話簿
電話簿有很多:SIM card,話機... etc
AT+CPBS=?
+CPBS: ("SM","ON","MC")
SM帶保SIM card
ON代表電話機
選擇SIM card電話簿用
AT+CPBS="SM"
讀取電話簿
AT+CPBR=1,20
列出1到20筆電話簿內容
如果只要讀一筆,就用
AT+CPBR=7
讀取第7筆
寫入電話簿
AT+CPBW=12,"0939909999",129,"XO"
將名叫XO的電話0939909999寫入memory 12的位置
129代表文字編碼,用129就OK了。
播打電話簿的號碼:
ATD>2;
播打現在使用記憶體中第二的位置的號碼
ATD>SM2;
播打SM(SIM)記憶體第二位置的號碼
ATD>"A1"
播打記憶體中名叫A1的電話
星期三, 9月 21, 2005
想到以前的一個跳蚤的實驗
這次數位隻強調查寬頻網路使用尖峰時間,發現是晚上7:00 - 12:00。
內容以網頁瀏覽為主。
所以建議寬頻影音應該要多注重內容。
我想這個在基本上就不同,現在家中有電視的家庭比有寬頻的家庭多很多。
同樣的
內容以網頁瀏覽為主。
所以建議寬頻影音應該要多注重內容。
我想這個在基本上就不同,現在家中有電視的家庭比有寬頻的家庭多很多。
同樣的
星期二, 9月 20, 2005
PT6961 Sample Code
Command 0x03 1 : 7 digit 11 seg
Command 0x8F 4 : Display On, Pulse width 14/16
----clear ram----
Command 0x40 2 : Normal, Increment, Write to disp
Command 0xC0 - Data 0x00 repeat 14. 3 : write 14 datas to ram, start from 0
----load---------
Command 0x44 2 : Normal, Fix, Write to disp
----address:data set
Command 0x44 2 : Normal, Fix, Write to disp
Command Addr - Data Data
-0xC0 : 0x38 write 0x38 on 0
-0xC2 : 0x18 write 0x18 on 2
-0xC4 : 0x38 write 0x38 on 4
-0xC6 : 0x2C
-0xC8 : 0x3C
-0xCA : 0x1C
-0xCC : 0x30
REPEAT 4 Times
----set ram
Command 0x40 2 : Normal, Increment, Write to disp
Command 0xC0 Data 0xFF repeat 14 3 : Write 14 0xFF to disp starts from 0
----read key
Command 0x42 Read Data repeat 4 2 : Normal, Increment, Read 4 data.
Command 0x8F 4 : Display On, Pulse width 14/16
----clear ram----
Command 0x40 2 : Normal, Increment, Write to disp
Command 0xC0 - Data 0x00 repeat 14. 3 : write 14 datas to ram, start from 0
----load---------
Command 0x44 2 : Normal, Fix, Write to disp
----address:data set
Command 0x44 2 : Normal, Fix, Write to disp
Command Addr - Data Data
-0xC0 : 0x38 write 0x38 on 0
-0xC2 : 0x18 write 0x18 on 2
-0xC4 : 0x38 write 0x38 on 4
-0xC6 : 0x2C
-0xC8 : 0x3C
-0xCA : 0x1C
-0xCC : 0x30
REPEAT 4 Times
----set ram
Command 0x40 2 : Normal, Increment, Write to disp
Command 0xC0 Data 0xFF repeat 14 3 : Write 14 0xFF to disp starts from 0
----read key
Command 0x42 Read Data repeat 4 2 : Normal, Increment, Read 4 data.
星期一, 9月 19, 2005
普誠 LCD button controller : PT6961
提供類似SPI的interface (SDI/SDO/CLK/CS)和MCU溝通。
可以用掃描的方式驅動7段顯示器,用掃描的方式讀取keyboard。
SPI的格式是第一個byte command,之後N個byte data (IN/Out)。
Command的最高兩個bit是Command Index,之後的bite是command的設定內容。
Command後的byte都是data byte
Command 1: Display Mode Setting
七段顯示器掃描有18個控制線,可以選擇是6 digits + 12 segment 或是 7 digits + 11 segments。
一般的七段顯示器因為一個digit只有8個segment。所以選兩個都一樣。
Command 2: Data Setting Command
用來讀寫PT6961內部的memory (register ?)。用一個bit來決定是Read還是write。
Command之後就是Data (in/out)。
Read Command代表讀取Scan Key的內容,
Command 3: Address Setting Command
設定開始顯示的memory address
顯示memory也是一樣,因為PT6961支援一個digit最多支援12 segment。
所以memory一個digit需要2個byte (16 bit),但是最高4 bit不使用。只用12 bit.
Command 4: Display Control Command
開啟/關閉七段顯示器的掃描動作。
設定顯示的duty cycle(調整亮度)。
Sample Code from PTC :
Command 0x03 1 : 7 digit 11 seg
Command 0x8F 4 : Display On, Pulse width 14/16
----clear ram----
Command 0x40 2 : Normal, Increment, Write to disp
Command 0xC0 - Data 0x00 repeat 14. 3 : write 14 datas to ram, start from 0
----load---------
Command 0x44 2 : Normal, Fix, Write to disp
----address:data set
Command 0x44 2 : Normal, Fix, Write to disp
Command Addr - Data Data
-0xC0 : 0x38 write 0x38 on 0
-0xC2 : 0x18 write 0x18 on 2
-0xC4 : 0x38 write 0x38 on 4
-0xC6 : 0x2C
-0xC8 : 0x3C
-0xCA : 0x1C
-0xCC : 0x30
REPEAT 4 Times
----set ram
Command 0x40 2 : Normal, Increment, Write to disp
Command 0xC0 Data 0xFF repeat 14 3 : Write 14 0xFF to disp starts from 0
----read key
Command 0x42 Read Data repeat 4 2 : Normal, Increment, Read 4 data.
spec的recommand algorithm:
Command 2
Command 3 Clear Memory
Command 1
Command 4 Disp OFF
Command 1
Command 4 Disp ON
Loop -
Command 2 Write Data
Command 3
Command 1
Command 4
使用PIC內建SPI來作沒有動作,改用IO控制後OK。
Initial的Code如下
其中sout是:
將內容送出到LED的Code是
讀取KeyScan的Code是: data[5]就是讀出的結果,但是每個byte只有前6個bit有效
sin() 是
所以datasheet應該要改一下,這一顆chip的protocol是固定將STB Low後第一個byte作Command,之後的都是Data,所以在任何Command後都可以加Data。 至於Data的動作就由上次Command 2的Read/Write bit來決定是Read Data或是Write Data。
如果是Write Data,Write Target Address就依照上次 Command 2中address auto increment bit的狀態跟Command 3 : target address的設定值決定。
可以用掃描的方式驅動7段顯示器,用掃描的方式讀取keyboard。
SPI的格式是第一個byte command,之後N個byte data (IN/Out)。
Command的最高兩個bit是Command Index,之後的bite是command的設定內容。
Command後的byte都是data byte
Command 1: Display Mode Setting
七段顯示器掃描有18個控制線,可以選擇是6 digits + 12 segment 或是 7 digits + 11 segments。
一般的七段顯示器因為一個digit只有8個segment。所以選兩個都一樣。
Command 2: Data Setting Command
用來讀寫PT6961內部的memory (register ?)。用一個bit來決定是Read還是write。
Command之後就是Data (in/out)。
Read Command代表讀取Scan Key的內容,
KeyScan一次Scan K1,K2,K3三個key。Write Command代表寫入七段顯示輸出記憶體
Scan Line有SG1 - SG10。
Read Data依照Scan的內容,每一個byte只有用到前6個bit,代表兩個Scan Line。
所以keyscan總共有5個byte。
一個七段顯示器需要12個bit,使用2個byte。
所以write command使用的memory有 7 x 2 = 14 byte
Command 3: Address Setting Command
設定開始顯示的memory address
顯示memory也是一樣,因為PT6961支援一個digit最多支援12 segment。
所以memory一個digit需要2個byte (16 bit),但是最高4 bit不使用。只用12 bit.
Command 4: Display Control Command
開啟/關閉七段顯示器的掃描動作。
設定顯示的duty cycle(調整亮度)。
Sample Code from PTC :
Command 0x03 1 : 7 digit 11 seg
Command 0x8F 4 : Display On, Pulse width 14/16
----clear ram----
Command 0x40 2 : Normal, Increment, Write to disp
Command 0xC0 - Data 0x00 repeat 14. 3 : write 14 datas to ram, start from 0
----load---------
Command 0x44 2 : Normal, Fix, Write to disp
----address:data set
Command 0x44 2 : Normal, Fix, Write to disp
Command Addr - Data Data
-0xC0 : 0x38 write 0x38 on 0
-0xC2 : 0x18 write 0x18 on 2
-0xC4 : 0x38 write 0x38 on 4
-0xC6 : 0x2C
-0xC8 : 0x3C
-0xCA : 0x1C
-0xCC : 0x30
REPEAT 4 Times
----set ram
Command 0x40 2 : Normal, Increment, Write to disp
Command 0xC0 Data 0xFF repeat 14 3 : Write 14 0xFF to disp starts from 0
----read key
Command 0x42 Read Data repeat 4 2 : Normal, Increment, Read 4 data.
spec的recommand algorithm:
Command 2
Command 3 Clear Memory
Command 1
Command 4 Disp OFF
Command 1
Command 4 Disp ON
Loop -
Command 2 Write Data
Command 3
Command 1
Command 4
使用PIC內建SPI來作沒有動作,改用IO控制後OK。
Initial的Code如下
void Pt6961Init(void)
{
char i;
STB=1;
SCL=1;
// command 2 : memory r/w, address inc
STB=0;
sout(0x40);
STB=1;
// command 3 : address set, and data
STB=0;
sout(0xC0);
for(i=0;i<14;i++)
sout(0x00);
STB=1;
// command 1 : display mode : digit & seg
STB=0;
sout(0x02);
STB=1;
// command 4 : disp on/off, disp duty
STB=0;
sout(0x87);
STB=1;
// command 1 : display mode
STB=0;
sout(0x02);
STB=1;
// command 4 : disp on/off, disp duty
STB=0;
sout(0x8F);
STB=1;
}
其中sout是:
void sout(char data)
{
char i;
for(i=0;i<8;i++){
SCL=0;
SDO = data&0x01;
SCL=1;
data = data >> 1;
}
}
將內容送出到LED的Code是
void LedPrint(char *str)
{
char data;
char i=0;
// command 2
STB=0;
sout(0x40); // write mode, auto inc address
STB=1;
// command 3
STB=0;
sout(0xC0); // set write start address=0
sout(str[0]); // 1st digit
sout(0x00); // 1 digit occupy 2 bytes
sout(str[1]); // 2nd digit
sout(0x00);
sout(str[2]); // 3rd digit
sout(0x00);
STB=1;
}
讀取KeyScan的Code是: data[5]就是讀出的結果,但是每個byte只有前6個bit有效
// Read
STB=0;
sout(0x42); // read mode, auto inc address
data[0]=sin(); // read in 1st scan line only 0-5 useable
data[1]=sin(); // 2nd
data[2]=sin(); // 3rd
data[3]=sin(); // 4th
data[4]=sin(); // 5th
STB=1;
sin() 是
char sin(void)
{
char i;
char rc=0;
for(i=0;i<8;i++){
SCL=0;
rc = rc>>1;
SCL=1;
if(SDI)
rc |= 0x80;
}
return rc;
}
所以datasheet應該要改一下,這一顆chip的protocol是固定將STB Low後第一個byte作Command,之後的都是Data,所以在任何Command後都可以加Data。 至於Data的動作就由上次Command 2的Read/Write bit來決定是Read Data或是Write Data。
如果是Write Data,Write Target Address就依照上次 Command 2中address auto increment bit的狀態跟Command 3 : target address的設定值決定。
Another way to find the data.
http://www.peicheng.com.tw/report/report15.html
David寄了一個link,是所有手機相關零組件的國內外廠商資料。
這個Link是證券公司的研究報告。
所以找資料不一定要從技術上找,從 $ 上找可能也找得到。
David寄了一個link,是所有手機相關零組件的國內外廠商資料。
這個Link是證券公司的研究報告。
所以找資料不一定要從技術上找,從 $ 上找可能也找得到。
星期日, 9月 18, 2005
星期五, 9月 16, 2005
密碼:說得很對呀!
這是 LinuxCenter說得一段:
現在公司的MIS要求三個月改一次密碼,而且不得與前3次的密碼有4個自以上相同,又規定要8個字以上。
這麼多規定,後來自己都忘了密碼是多少,只好寫在旁邊。
犯罪手法的專業化與攻擊走向複雜,使得企業使用愈來愈長的密碼,或是經常變更密碼。但Gartner研究副總裁Jay Heiser指出,「這是不智的,因為使用者反而被搞到忘記密碼或乾脆把它寫下來,進而為安全帶來各種威脅。」真是說得很對呀。
現在公司的MIS要求三個月改一次密碼,而且不得與前3次的密碼有4個自以上相同,又規定要8個字以上。
這麼多規定,後來自己都忘了密碼是多少,只好寫在旁邊。
星期四, 9月 15, 2005
Blogger可以Search了
Google 推出了Blog Search,可以用來搜尋所有的Blog。
最方便的是自己Blog的文章也可以Search了。
Blogspot不能設category就已經很慘了,後來在Edit page的Search功能又被拿掉,簡直就...
終於,現在又可以Search了!而且Search Result更好看了喔。
可以由每個Blogspot網頁上面的
作搜尋的動作,這樣只會搜尋這個blog的內容。
也可以到blogspot的search page:
http://search.blogger.com/ 作search,但是這是對所有的blog作search.
最方便的是自己Blog的文章也可以Search了。
Blogspot不能設category就已經很慘了,後來在Edit page的Search功能又被拿掉,簡直就...
終於,現在又可以Search了!而且Search Result更好看了喔。
可以由每個Blogspot網頁上面的
作搜尋的動作,這樣只會搜尋這個blog的內容。
也可以到blogspot的search page:
http://search.blogger.com/ 作search,但是這是對所有的blog作search.
星期三, 9月 14, 2005
得"獎"的是.....
eBay!
最近大家都想買Skype,最後是eBay買下來了,花41億美金(也有說是26億的)。
奇怪的是eBay買通訊軟體公司幹嘛?
如果他要在拍賣item使用Skype的Click to Talk,只要跟Skype購買授權就可以了呀。
最賺的應該是Skype了,據說公司員工只有50人,所以平均一人可以得到?
這次Skype的CEO不像上次他賣Kazaa時,賣完就走。還會待在Skype (一陣子?)。
不過上次那個誰要買Skype,他卻不賣,現在卻又賣了。
是價錢的問題?
還是? Google推出 Google Talk ?
..... 我大概想太多了。
..... 大概是CEO玩膩了,又有什麼好點子了。
不過我猜Skype被eBay買下後,應該就會那麼精壯,隨著其他通訊軟體的推出,他應該會慢慢的消失..
最近大家都想買Skype,最後是eBay買下來了,花41億美金(也有說是26億的)。
奇怪的是eBay買通訊軟體公司幹嘛?
如果他要在拍賣item使用Skype的Click to Talk,只要跟Skype購買授權就可以了呀。
最賺的應該是Skype了,據說公司員工只有50人,所以平均一人可以得到?
這次Skype的CEO不像上次他賣Kazaa時,賣完就走。還會待在Skype (一陣子?)。
不過上次那個誰要買Skype,他卻不賣,現在卻又賣了。
是價錢的問題?
還是? Google推出 Google Talk ?
..... 我大概想太多了。
..... 大概是CEO玩膩了,又有什麼好點子了。
不過我猜Skype被eBay買下後,應該就會那麼精壯,隨著其他通訊軟體的推出,他應該會慢慢的消失..
MPASM : SET and EQU
MPASM中有set和equ兩個directive
set 是對變數動作
equ 是定義constant
CBLOCK value 類似C的enume,在之後宣告的constant會由value依序+1,+1...
set 是對變數動作
equ 是定義constant
CBLOCK value 類似C的enume,在之後宣告的constant會由value依序+1,+1...
雙UART Program - 1 hardware, 1 software : Impmenet Soft UART in PIC.
一個UART是hardware peripherial, 另一個是software。
Software UART的pin是PortC,因為PIC的IO interrupt只有PORTB有IO interrupt,所以代表這個Software UART沒有(辦法)使用interrupt,所以應該是用polling的方式。或是用Timer 定時Sampling。
猜測RX用定時Sampling,TX用polling。因為都要用timer,所以是half-duplex。
follow microchip的AN555 software implement UART : sampling freq = 4 x Baudrate.
RX StartBit的偵測是用Counter/Capture 來作:
將Timer 設定和外部RX Pin腳同步counting (下緣)。
設定Timer Initial 值FF,這樣只要count 1就會overflow引發中斷。
但是只有Timer0可以Synch到Falling edge,Timer1只能Synch Rising Edge.
所以只能使用Timer作,以4x freq作Sampling。
4800 => 1/4800 : 0.208mS => 0.208mS/4 : 0.052mS => 52uS
20MHz => 20MHz/4 : 5MHz => 1/5MHz : 0.2uS
52/0.2 = 260. > 255,所以用prescale = 2, count 130. TMR0 Preload=125
結果我用code :
startbit wait 6
interbit wait 4
receive '0' (0x30). 收到的卻是0xFA.
所以把125改成200才OK. --- 查,這是9600 baudrate用的PRELOAD SETTING
可見效率很差,要把4x sampling改成2x sample (start-bit 要wait 1.5 bittime)
或是採用wait startbit 和interbit 不同的freq來作。
奇怪,今天試,是113 - 123是OK的區域
( 255 - 113) ~ ( 255 - 123)
也就是142 ~ 132. --- 這是4800的PRELOAD SETTING,和計算值125比較接近。
計算 -->實際
65 --> 55
125 --> 110
所以猜測interrupt 的overhead是10
下圖是RS232的't'字波形
(from : PUMPKIN's AN-8, Implemeting Quard 1200 Full-dulpex Software UART)
從Start bit後,每一點間隔都是一個bit -time (1/baudra)。
但是如果Start bit的Sample 點在bit period的後段時,間隔一個bit time後,可能因為傳送端和接收段的Timming 誤差而導致sample到下一個bit period。
所 以為了增加timming的torance,要儘早的sample到Start bit,一般Start bit都是以baudrate的4倍取樣,這樣可以確保Start bit同步在前1/4 bit period中,之後再1+1/2 bit time後作為下一個bit的sample點。之後每個bit 間隔1 bit time。
上面的code就是用Timer0產生4x baudrate的中斷,在中斷中sample各bit,所以start bit後的delay count = 5 (+1),之後每個bit的delay count是 3 (+1)
其實這樣很愚蠢,因為PIC的Timer0不是Auto Reload,而是每次要自己Reload,所以可以設計成不同Sampling Freq :
Sample Start bit 時,Sampling Freq = 4x baudrate.
Sample data bit時,Sampling Freq = baudrate.
這樣可以減少不必要的中斷。
* 從這裡也可以看出,如果當初設計hardware的人,將RX assign到有interrupt功能的pin腳上,也不用浪費這4x Sampling Freq的中斷時間。....我也覺得莫名其妙。為什麼放著可以中斷的PORTB不用(接到LED),反而把RX拉到RC。-----難道是要證明他們的 功力?
試作none-even sampling freq:
一個bit time需要delay的timer count:
1/4800 = 2.08x10-4
2.08x10-4/2x10-7 = 1040.
所以prescale 要用8, Delay Counting = 1040/8=130.
Startbit counting = 130/4=32.5, 從上一個code test,約120,所以用30.
Interbit counting = 130, 從上一個code test, 修正10/4,所以用128.
TEST CODE:
結果STARTBIT在255-30的情況下,INTERBIT可以使用255-(126~137)的range.所以用131
Tx也用同樣的方法,以下是Tx/Rx半雙工的Code.
Software UART的pin是PortC,因為PIC的IO interrupt只有PORTB有IO interrupt,所以代表這個Software UART沒有(辦法)使用interrupt,所以應該是用polling的方式。或是用Timer 定時Sampling。
猜測RX用定時Sampling,TX用polling。因為都要用timer,所以是half-duplex。
follow microchip的AN555 software implement UART : sampling freq = 4 x Baudrate.
RX StartBit的偵測是用Counter/Capture 來作:
將Timer 設定和外部RX Pin腳同步counting (下緣)。
設定Timer Initial 值FF,這樣只要count 1就會overflow引發中斷。
但是只有Timer0可以Synch到Falling edge,Timer1只能Synch Rising Edge.
所以只能使用Timer作,以4x freq作Sampling。
4800 => 1/4800 : 0.208mS => 0.208mS/4 : 0.052mS => 52uS
20MHz => 20MHz/4 : 5MHz => 1/5MHz : 0.2uS
52/0.2 = 260. > 255,所以用prescale = 2, count 130. TMR0 Preload=125
結果我用code :
bit RcvStartBit;
bit RcvOk;
char sampleCount;
char biti;
char RcvByte;
#define TMR0PRELOAD (201)
unsigned int err=0;
void interrupt inthandler(void)
{
if(TMR0IF){
TMR0IF=0;
TMR0=TMR0PRELOAD;
if(!RcvStartBit){
if(!RC1){
sampleCount=5;
RcvStartBit=1;
biti=0;
RcvByte=0;
}
}else if(sampleCount>0){ // StartBit received
sampleCount--;
}else{
sampleCount=3;
if(biti<8){>>= 1;
if(RC1)
RcvByte |= 0x80;
biti++;
}else{
if(RC1){
RcvOk=1;
}else{
err++;
}
RcvStartBit=0;
}
}
}
}
startbit wait 6
interbit wait 4
receive '0' (0x30). 收到的卻是0xFA.
所以把125改成200才OK. --- 查,這是9600 baudrate用的PRELOAD SETTING
可見效率很差,要把4x sampling改成2x sample (start-bit 要wait 1.5 bittime)
或是採用wait startbit 和interbit 不同的freq來作。
奇怪,今天試,是113 - 123是OK的區域
( 255 - 113) ~ ( 255 - 123)
也就是142 ~ 132. --- 這是4800的PRELOAD SETTING,和計算值125比較接近。
計算 -->實際
65 --> 55
125 --> 110
所以猜測interrupt 的overhead是10
下圖是RS232的't'字波形
(from : PUMPKIN's AN-8, Implemeting Quard 1200 Full-dulpex Software UART)
從Start bit後,每一點間隔都是一個bit -time (1/baudra)。
但是如果Start bit的Sample 點在bit period的後段時,間隔一個bit time後,可能因為傳送端和接收段的Timming 誤差而導致sample到下一個bit period。
所 以為了增加timming的torance,要儘早的sample到Start bit,一般Start bit都是以baudrate的4倍取樣,這樣可以確保Start bit同步在前1/4 bit period中,之後再1+1/2 bit time後作為下一個bit的sample點。之後每個bit 間隔1 bit time。
上面的code就是用Timer0產生4x baudrate的中斷,在中斷中sample各bit,所以start bit後的delay count = 5 (+1),之後每個bit的delay count是 3 (+1)
其實這樣很愚蠢,因為PIC的Timer0不是Auto Reload,而是每次要自己Reload,所以可以設計成不同Sampling Freq :
Sample Start bit 時,Sampling Freq = 4x baudrate.
Sample data bit時,Sampling Freq = baudrate.
這樣可以減少不必要的中斷。
* 從這裡也可以看出,如果當初設計hardware的人,將RX assign到有interrupt功能的pin腳上,也不用浪費這4x Sampling Freq的中斷時間。....我也覺得莫名其妙。為什麼放著可以中斷的PORTB不用(接到LED),反而把RX拉到RC。-----難道是要證明他們的 功力?
試作none-even sampling freq:
一個bit time需要delay的timer count:
1/4800 = 2.08x10-4
2.08x10-4/2x10-7 = 1040.
所以prescale 要用8, Delay Counting = 1040/8=130.
Startbit counting = 130/4=32.5, 從上一個code test,約120,所以用30.
Interbit counting = 130, 從上一個code test, 修正10/4,所以用128.
TEST CODE:
#include <pic.h>
bit RcvStart;
bit RcvOk;
char biti;
char RcvData;
char RxData;
char RcvErr=0; // for debug
#define TMR0PRELOAD_START (255-30)
#define TMR0PRELOAD_BIT (255-131)
void interrupt inthandler(void)
{
if(TMR0IF) {
TMR0IF=0;
if(!RcvStart){
if(!RC1) {
TMR0=TMR0PRELOAD_BIT;
RcvStart=1;
biti=0;
RcvData=0;
}else{
TMR0=TMR0PRELOAD_START;
}
}else{
if(biti<8){ tmr0="TMR0PRELOAD_BIT;">>= 1;
if(RC1)
RcvData |= 0x80;
biti++;
}else{
TMR0=TMR0PRELOAD_START;
if(RC1){
RxData=RcvData;
RcvOk=1;
}else{
RcvErr++;
}
RcvStart=0;
}
}
}
}
char data[20];
void main(void)
{
char ri;
OPTION=0x02; // prescale use 8
TMR0=TMR0PRELOAD_START;
TRISC=0x0F;
TMR0IE=1;
GIE=1;
ri=0;
while(1) {
if(RcvOk){
RcvOk=0;
data[ri]=RxData;
ri++;
if(ri>=20)
ri=0;
}
}
}
結果STARTBIT在255-30的情況下,INTERBIT可以使用255-(126~137)的range.所以用131
Tx也用同樣的方法,以下是Tx/Rx半雙工的Code.
// Software UART, half-duplex
// call RcvStart to start the Rx session. (and stop the Tx session)
// call RcvStop befor sending Data out.
#include
#define TXPIN RC0 // remember to modify the TRISC config
#define RXPIN RC1
#define TMR0PRELOAD_START (255-16) // 4800 : 30 9600: 16
#define TMR0PRELOAD_BIT (255-63) // 4800 : 130 9600: 63
bit TxProcess=0; // Tx In Process
bit RxProcess=0; // Rx In Process
bit RxStart=0; // Receive a Start bit
bit RxError=0; // Receive a Error condition
char TRBiti; // bit index, used in rx/tx bit
bit RxOk; // receive 1 char in TRData
char TRData; // sending, receiving data
char RxData; // receiving data : shift register - workspace
// INTERRUPT
//==================
void interrupt inthandler(void)
{
if(TMR0IF) {
TMR0IF=0;
if(TxProcess){ // Process TX
TMR0=TMR0PRELOAD_BIT;
if(TRBiti==10){ // start bit
TXPIN=0;
}else if(TRBiti==1){ // stop bit
TXPIN=1;
}else if(TRBiti==0){ // all complete
TMR0IE=0;
TxProcess=0;
}else{
if(TRData&0x01){
TXPIN=1;
}else{
TXPIN=0;
}
TRData = TRData>>1;
}
TRBiti--;
}else if(RxProcess){ // Process RX
if(!RxStart){
if(!RXPIN){
TMR0=TMR0PRELOAD_BIT;
RxStart=1;
TRBiti=0;
RxData=0;
}else{
TMR0=TMR0PRELOAD_START;
}
}else{
if(TRBiti<8){
TMR0=TMR0PRELOAD_BIT;
RxData = RxData >> 1;
if(RXPIN)
RxData = RxData | 0x80;
TRBiti++;
}else{
TMR0=TMR0PRELOAD_START;
if(RXPIN){
TRData = RxData;
RxOk=1;
}else{
RxError=1;
}
RxStart=0;
}
}
}else{
TMR0IE=0;
}
}
}
// Sending
//=========================
void SendChar(char data)
{
while(TxProcess);
TxProcess=1;
TRBiti=10;
TRData=data;
TMR0=TMR0PRELOAD_BIT;
TMR0IE=1;
}
void SendCString(const char *str)
{
char data;
char i;
i=0;
data=str[i];
while(data!=0){
SendChar(data);
i++;
data=str[i];
}
}
//==============================================
void RcvStart(void)
{
while(TxProcess); // wait Tx Complete
TMR0IE=0;
RxProcess=1;
TRBiti=0;
RxStart=0;
RxOk=0;
RxError=0;
TMR0=TMR0PRELOAD_START;
TMR0IE=1;
}
void RcvStop(void)
{
TMR0IE=0;
RxProcess=0;
}
//==============================================
char rcvstr[40];
char rcvlen=0;
void main(void)
{
int i;
OPTION=0x02; // prescale 8
TRISC=0x02;
GIE=1;
SendCString("Hello!\r\n");
RcvStart();
for(i=0;i<sizeof(rcvstr);i++){
while(!RxOk);
rcvstr[i]=TRData;
RxOk=0;
}
RcvStop();
SendCString("Receiveing OK\r\n");
while(1); // end
}
星期六, 9月 10, 2005
星期五, 9月 09, 2005
PIC的中斷結構
從上圖可以看出pic的中斷還是一個擴充的結構,可以看的出來是由原來的一個基本的中斷控制器擴充周邊中斷(PEIE)來達成的。
所以啟動擴充裝置的中斷,除了要啟動GIE (Gblobal),和該周邊的中斷Enable外,還要Enable PEIE.
PIC有自動防止INT重複進入的問題:
進入中段時,GEIE會自動清除。
執行RETFIE退出中斷時,GEIE會自動enable.
PIC只有一個中斷位址:0x0004.
所以在Interrupt Service Routine中要一一polling各interrupt的flag,並且清除他。
所以一個使用Timer2作time tick的code是:
#include <pic.h>
unsigned char tick;
unsigned char sec;
void interrupt timer2(void)
{
if(TMR2IF){
TMR2IF=0;
tick++;
if(tick>=125){
tick=0;
sec++;
}
}
}
void main(void)
{
T2CON = 0x4A; // post 10, pre 16
PR2 = 250; // 16 x 250 = 40000
// 20M inst = 20/4 = 5M
// count 125 = 1sec
tick=0;
sec=0;
TMR2IE = 1;
PEIE = 1; // the int hirachy, TMR2 belongs to Periperial
GIE = 1; // Global
TMR2ON=1;
TRISB=0x1F;
while(1) {
if(sec%2){
PORTB = 0x00;
}else{
PORTB = 0xE0;
}
}
}
星期四, 9月 08, 2005
GPS NMEA Protocol
NMEA是GPS 的標準protocol,她是ASCII的字串,像
053322.682
格式是:
1.一律以 $ 符號開頭
2.$ 後是Message id. 5個ASCII Code.
3.一連串以','分開的欄位.
4.Checksum,checkum以'*'開始,後面是兩個ASCII code.
5.
$GPGSV,1,1,02,14,,,37,25,,,46,,,,,,,,*7F
$GPGSV : Satellites in View
Message ID : $GPGSV
Number of Messages : 1
Message number : 1
Satellites in view : 02 目看到的衛星數
Satellite Id : 14 Satellite vehicle 以下是第一個看到的衛星,編號14
Elevation : - Elevation of satellite in degree
Azimuth : - Azimuth of satellite in defree
SNR : 37 Signal to Noise ration in dbHz
Satellite id : 25 Satellite vehicle,以下是第二個看到的衛星,邊號25
NMEA Protocol中checksum的算法:
不包含開頭的'$',一直計算到'*'之前。一個byte一個byte的作XOR.
所以可以知道,連command間的','符號也加入計算。
一般NMEA的report data中,用
有些擴充協定,用來設定,例如
$PNMRX103, NMEA report rate control
可以指定NMEA report資料的頻率
GGA,GLL,GSA,GSV,RMC,VTG,ZDA,ALL
例如:
$PNMRX103,ALL,0*1A
所有的report都停止。
$PNMRX103,RMC,2*02
每2 sec送出一次RMC report
$PNMRX100 設定baud rate
$PNMRX100,0,4800,0*48
設定
Protocol : 0 : NMEA Mode, 1: Bindary Mode (不要用這一個)
baud rate: 4800 其他可以設1200,2400,4800,9600,19200,38400,57600.
Parity : 0 : None, 其他1 2代表Odd, 2代表 Even.
所以上面的example代表:使用NMEA Mode, 4800, None Parity
這些設定在reset後都消失......
雖然Manual中說明support message有GGA,GLL,GSA,GSV,RMC,VTG,ZDA但是用ALL command開啟後,發現只有report GGA,GSA,RMC,VTG.
$GPRMC,053322.682,A,2502.6538,N,12121.4838,E,0.00,315.00,080905,,,A*6F這一個command是GPS Recommanded GNSS data
053322.682
是UTC Time : 格式是hhmmss.sss所以是5:33:22.682A
代表data是valid (如果找不到衛星,就會是V)2502.6538
是緯度,格式是degree * 100 + minutes。但是minutes是100進位,所以要/100 * 60轉為degree,轉換後就是25'02'39.228''.N
是代表緯度是北緯12121.4838
是經度,格式是degree * 100 + minutes。minutes一樣要做/100*60的轉換,轉換後就是121'21'29.02''.E
代表經度是東經0.00
是速度,因為GPS天線沒動,所以是0.00315.00
是方向080905
是目前的日期,格式是ddmmyy,所以是05年9月8日- -
接著有兩個欄位沒有用,所以空著A
是Autonomous ?*6F
是checksum*** 所以用google earth就知道我把天線放在哪了****
格式是:
1.一律以 $ 符號開頭
2.$ 後是Message id. 5個ASCII Code.
3.一連串以','分開的欄位.
4.Checksum,checkum以'*'開始,後面是兩個ASCII code.
5.
$GPGSV,1,1,02,14,,,37,25,,,46,,,,,,,,*7F
$GPGSV : Satellites in View
Message ID : $GPGSV
Number of Messages : 1
Message number : 1
Satellites in view : 02 目看到的衛星數
Satellite Id : 14 Satellite vehicle 以下是第一個看到的衛星,編號14
Elevation : - Elevation of satellite in degree
Azimuth : - Azimuth of satellite in defree
SNR : 37 Signal to Noise ration in dbHz
Satellite id : 25 Satellite vehicle,以下是第二個看到的衛星,邊號25
NMEA Protocol中checksum的算法:
不包含開頭的'$',一直計算到'*'之前。一個byte一個byte的作XOR.
data++; // skip the heading '$' mark
sum = *data;
while(*data!='*') {
sum ^= *data;
data++;
}
所以可以知道,連command間的','符號也加入計算。
一般NMEA的report data中,用
有些擴充協定,用來設定,例如
$PNMRX103, NMEA report rate control
可以指定NMEA report資料的頻率
GGA,GLL,GSA,GSV,RMC,VTG,ZDA,ALL
例如:
$PNMRX103,ALL,0*1A
所有的report都停止。
$PNMRX103,RMC,2*02
每2 sec送出一次RMC report
$PNMRX100 設定baud rate
$PNMRX100,0,4800,0*48
設定
Protocol : 0 : NMEA Mode, 1: Bindary Mode (不要用這一個)
baud rate: 4800 其他可以設1200,2400,4800,9600,19200,38400,57600.
Parity : 0 : None, 其他1 2代表Odd, 2代表 Even.
所以上面的example代表:使用NMEA Mode, 4800, None Parity
這些設定在reset後都消失......
雖然Manual中說明support message有GGA,GLL,GSA,GSV,RMC,VTG,ZDA但是用ALL command開啟後,發現只有report GGA,GSA,RMC,VTG.
星期三, 9月 07, 2005
電子地圖的廠商
http://www.olemap.com/olemap_chinese/olemap_chinese.htm
用java寫的server map engine,可以用在windows, linux甚至是手機上
已經打電話了,她說會請協理來聯絡....希望真的慧聯絡才好
聯絡了...
回覆了,
地圖平台可以run在server上或是Symbian OS(6.0, 9.0)的手機上。
可以經由internet或是SMS接收GPS的資料。
另外在GPS涵蓋不良的地區,該系統甚至可以由基地台資訊取得大概資料。
會來demo
用java寫的server map engine,可以用在windows, linux甚至是手機上
友邁科技
地址:220 台北縣板橋市文化路一段266號4樓之2
電話:02-8969 0032
傳真:02-8969 0030
mail:vincent@olemap.com
已經打電話了,她說會請協理來聯絡....希望真的慧聯絡才好
聯絡了...
回覆了,
地圖平台可以run在server上或是Symbian OS(6.0, 9.0)的手機上。
可以經由internet或是SMS接收GPS的資料。
另外在GPS涵蓋不良的地區,該系統甚至可以由基地台資訊取得大概資料。
會來demo
FM Tuner IC
FM Tuner IC,也就是可以收聽FM 廣播的IC。有I2C和SPI兩種控制介面,另外有Audio out 和天線。 ic 很小4 mm x 4 mm,屬於multi-chip module,只需要加crystal 就可以。單價約$6。
代理
代理
QUMAX
陳時康 Danny Chen
02 26982566 ext 323
0920843153
danny.chen@qumax.com.tw
電子指北針
YAMAHA出的,電子指北針,I2C介面。 可以送出detector ic與地球磁場的夾角。
ic size: 2 mm x 2 mm, 很小。
可以配合papago,可以知道車子的朝向。
用在飛行搖桿上,可以作一個不需承軸,滾輪的搖桿。
單價約$2. (230 YEN)
ic size: 2 mm x 2 mm, 很小。
可以配合papago,可以知道車子的朝向。
用在飛行搖桿上,可以作一個不需承軸,滾輪的搖桿。
單價約$2. (230 YEN)
YAMAHA http://www.yamahakhs.com代理
課長 林海立 Haili Lin
02-25118688 ext 282
haily@yamahasemi.com.tw
QUMAX http://www.qumax.com.tw
陳 明慧 Cathy Chen
02 26982566 ext 325
0921128018
cathy.chen@qumax.com.tw
星期二, 9月 06, 2005
AXD 設定:使用multi-ice
1.開啟AXD,選Option --- Configure Target
2.選Add,出現一個選DLL的dialog,找到multiice提供的dll(應該會在multi-ice server的安裝目錄下)。加入,就會多出一個multiice的taget
3.選File -- Load Image
4.從Dialog中選build好的for debug的image檔,附檔名是.AXE
5.load後,AXD會自動停在程式的起始位置,並顯示出該處的source code。如果要在其他的.c file中設定break point,要用Process-View - Source
6.在dialog中會將所有的source code列出,選你要看的source file
7.OK,AXD把你要的source code列出來了,可以到你要的地方set break point,之後按RUN就開始執行了。
2.選Add,出現一個選DLL的dialog,找到multiice提供的dll(應該會在multi-ice server的安裝目錄下)。加入,就會多出一個multiice的taget
3.選File -- Load Image
4.從Dialog中選build好的for debug的image檔,附檔名是.AXE
5.load後,AXD會自動停在程式的起始位置,並顯示出該處的source code。如果要在其他的.c file中設定break point,要用Process-View - Source
6.在dialog中會將所有的source code列出,選你要看的source file
7.OK,AXD把你要的source code列出來了,可以到你要的地方set break point,之後按RUN就開始執行了。
星期一, 9月 05, 2005
PIC 的Timer
Timer0 和Watchdog共用一個prescalar(在Watchdog中叫postscalar),所以給Watchdog用的話,Timer0就不能用,同理,Timer0拿來用的話,Watchdog就不能用了。
為了避免要到處加clear watchdog,所以prescalar都是給watchdog用。
使用內部Crystal作clock時,clock = Fosc/4.
Timer0是8 bit timer,所以最長每256個instruction就會interrupt一次。
....有點太快。
Watchdog用的是內部的RC,產生period約15ms的reset信號,如果用postscalar(也就是Timer0的prescalar),最多可以到2.3 sec。
Timer1 是16 bit的counter,每次overflow後會由00開始技數,所以比較像是用來量測時間用的。
例如:方波開始時start,方波結束時check timer counter。
Timer2 固定使用內部Instruction Cycle (Fosc/4)作clock,可以由T2CON的T2PKCS0-T2PKCS1設定prescalar,TOUTPS0-TOUTPS3設定postscalar。
PR2是match register,決定Timer2的overflow的值
使用4M的crystal,instruction freq是1M。
設定Timer2的pre和post scalar都是16 (最大),設定PR2 (overflow count)是217的話。
count 18.0012次就算是1 sec。誤差是0.0012/18 = 0.006.4%
一天誤差5 sec。一個月誤差3 min,似乎太大。
pre=16, post=10. PR2=250
count 25 次就算是1 sec。誤差是0。
為了避免要到處加clear watchdog,所以prescalar都是給watchdog用。
使用內部Crystal作clock時,clock = Fosc/4.
Timer0是8 bit timer,所以最長每256個instruction就會interrupt一次。
....有點太快。
Watchdog用的是內部的RC,產生period約15ms的reset信號,如果用postscalar(也就是Timer0的prescalar),最多可以到2.3 sec。
Timer1 是16 bit的counter,每次overflow後會由00開始技數,所以比較像是用來量測時間用的。
例如:方波開始時start,方波結束時check timer counter。
Timer2 固定使用內部Instruction Cycle (Fosc/4)作clock,可以由T2CON的T2PKCS0-T2PKCS1設定prescalar,TOUTPS0-TOUTPS3設定postscalar。
PR2是match register,決定Timer2的overflow的值
使用4M的crystal,instruction freq是1M。
設定Timer2的pre和post scalar都是16 (最大),設定PR2 (overflow count)是217的話。
count 18.0012次就算是1 sec。誤差是0.0012/18 = 0.006.4%
一天誤差5 sec。一個月誤差3 min,似乎太大。
pre=16, post=10. PR2=250
count 25 次就算是1 sec。誤差是0。
#include <pic.h>
unsigned int tick;
unsigned int sec;
void main(void)
{
T2CON = 0x4A; // post 10. pre 16
PR2 = 250; // 16 x 10 x 250 = 40000.
// use 4MHz, inst Freq = 4/4 = 1MHz
// so count 25 times = 1sec
tick=sec=0;
TMR2ON = 1;
while(1) {
while(!TMR2IF);
TMR2IF = 0;
tick++;
if(tick>=25){
tick=0;
sec++;
}
}
}
Memo : 數位相機
Panasonic DMC FX-8 : 12000
SONY Cyber-Shot T33 : 11000
Casio Exilim EX-Z57 : 9900
Pentax S5n : 9400
T33和S5n的錄影模式是MPEG-4,其他功能大約相同。
*Pentax的電池只能拍130張。其他都至少300張。
SONY Cyber-Shot T33 : 11000
Casio Exilim EX-Z57 : 9900
Pentax S5n : 9400
T33和S5n的錄影模式是MPEG-4,其他功能大約相同。
*Pentax的電池只能拍130張。其他都至少300張。
星期六, 9月 03, 2005
星期五, 9月 02, 2005
GPRS Modem上網設定 -- Windows 2000 系統
我也是這樣想....
遠見雜誌電子報
這就是我所認為的,要靠著大陸低廉的勞工才能生存下去的 並不是真本事(真本是即使在勞動力最貴的日本也能降低生產成本)只會讓自己處於暫時的優勢,終究喪失創新的動力。
是不是要去買這本書來看看呢?
結果 這一期商周就有
所以囉,並不是只有我這樣想。
《藍海策略》作者金偉燦與莫伯尼打破了「競爭力」大師波特 (Michael Porter)所提出的競爭為思考主軸的理論,《藍海策略》認為過度強調降低成本、改善效率,只在原有的市場進行差異化較勁,終究會落入企業削價競爭的「紅色海洋」。
《藍海策略》強調,唯有不甩競爭者,才能超越現有的需求,擺脫既有的競爭局面,為顧客創造有價值的創新。
「不要老是去抄襲別人的,要從客戶角度來創新,」全球最大智慧型電話(smartphone)廠商宏達電子總經理周永明強調,宏達在設計下一世代產品時,都是先考量滿足客戶未來需求,不會人云亦云、盲從潮流,才會創造出全球第一支pda(數位個人助理)手機。
這就是我所認為的,要靠著大陸低廉的勞工才能生存下去的 並不是真本事(真本是即使在勞動力最貴的日本也能降低生產成本)只會讓自己處於暫時的優勢,終究喪失創新的動力。
是不是要去買這本書來看看呢?
結果 這一期商周就有
一九九二年,眼看台灣勞力成本居高不下,帛漢電子董事長林昌亮帶著五百萬元大膽西進,前往廣東開平,生產電子變壓器、濾波器。大陸便宜的勞工,讓帛漢快速擴張,資本額成長八十倍,員工四千人。
林 昌亮自嘲在大陸經營的是「手工業」,他在大陸女工中,百中選一,因為她們必須分辨出頭髮般的細線,還有針頭大小的捲線器,然後在捲線器上,一線一線繞出電 子線圈,再加工製成各種成品,林昌亮說,帛漢就是這樣在針頭上討生活,一針一線繞出帛漢的商機。為了管理這群員工,林昌亮更花了十三年苦心,才建立出一套 軍事化的工廠管理與生產模式。
但大陸耕耘成功,林昌亮反而開始憂心,「靠大陸廠的低成本優勢,可以再過十年,但十年裡若不做升級,未來什麼都沒有!」於是,他決定押下在大陸掙來的一切所得,逆向回台灣找出路。
所以囉,並不是只有我這樣想。