2009年4月21日 星期二

Ubuntu 8.10下 亂數 random() 不能動作的問題

試著控制 1602 lcd , 直接使用 LCD4bit 的4線控制, 線接好之後, 在ide打開 LCD4bit內附的example程式, 上傳, 哇, 幾行程式竟然就可以做出這樣的效果, 真是令人驚奇的東西...

不過, 看著它跑了好一會兒, 咦! 怎麼怪怪的, 明明用亂數取6個字串之一來顯示, 為什麼永遠只出現1,4 二個字串, 一開始不以為意, 時間久了, 就覺得好像有問題, 雖然說ramdom()都會提說這不是真正的亂數, 這點我瞭解, 之前在做寫排隊理論時, 就有為這問題, 另外寫過一個亂數程式, 不過好像跟這問題無關, 明明都是一直不斷電在run, 不存在亂數重覆的問題, 於是試著加 randomSeed() 去修改亂數種子, 但仍沒改善, 再把ramdom() 取值範圍加大, 情況好一些, 但幾個值之後還是開始重覆循環.

最後死心上網找答案, 很快就發現這狀況只會出現在特定的環境下, 原來是compiler的問題, 這真的很詭異, 直正執行程式不是在單晶片上面嗎? 為什麼compile出問題會導至單晶片執行錯誤, 是因為編譯成錯誤的machine code嗎? 在window下安裝了一個新的arduino ide環境, 用同一個範例程式, 編譯上傳, 哇 沒問題了, 真是長見識了, 沒想到問題竟然會出現在這裡, 真是意想不到, 找到一些說明, 主要的原因應該是 avr-gcc 4.3.0 的bug, 換掉這個版本應該就ok了, 不過偷懶把debain的源加上之後, 要更新的部份相當多, 想想就先算了, 明天(4/23) 9.04要發表了, 也許這個版本就會更新了, 這個問題就自然被解決了

lcd4bit控制參考網址:
The 4-bit Arduino LCD library
Arduino控制2x16 LCD (使用LCD4Bit Library)
機器人●夢-Arduino&LCD1602

問題解決參考網址如下:
Help - Random function not working
RE: [avr-libc-dev] bug in rand()/random()/do_rand()/do_random( )

package下載位置:
http://packages.debian.org/

底下是網路上找到解決的方法, 據描述, 應該換掉 binutils-avr, avr-libc, gcc-avr 3個套件應該就ok了
-------------------------------------------------------------------------------------------------------------------------
Ubuntu 8.10 (Intrepid Ibex)
avr-libc 1:1.6.2-1
avr-gcc 1:4.3.0-2
Maintainer: Ubuntu MOTU Developers
Linux main 2.6.27-11-generic #1 SMP Fri Dec 19 16:29:35 UTC 2008 x86_64
GNU/Linux

but when she installs the following files from debian sid, it fixes the
problem:

binutils-avr_2.18-4_amd64.deb
avr-libc_1.6.2.cvs20080610-2_all.deb
gcc-avr_4.3.2-1_amd64.deb

沒有留言:

張貼留言