February 07, 2010

やっぱり完成品を買った方が安い!?

マイコンモジュールと周辺部品を買って来まして,
30本くらい配線して,50行くらいのプログラムを書けば,
時刻と温度は表示できるようになりました.

「でも, やっぱり, 完成品買って来た方が安いよね! 時間もかかるし...」
「今では, 洋服だって既製品買った方が遥かに安いけど, 作る人は別の価値観で自分で作るから...」
「しかし, この時計は, このままでは使わない(使えない)ね...仮縫い?」
2550Clock
↑ 温度表示が電圧のままだ... 100倍して60引いて下さい!
- PIC18F2550(USBマイコンモジュール) 1000円
- LCD液晶ディスプレイ 300円
- リアルタイムクロックモジュール 500円
- 温度センサー 200円 (4本セットで3本余る!)
- 製作時間 半日
- (自己)満足度 (プライスレス?)


- 秋月電子通商などで部品を調達
-- PIC18F2550-I/SO (PIC18F2550マイコンモジュール)
-- DMC16117A (LCDキャラクタディスプレイモジュール 16文字x1行)
-- RTC-8564NB (リアルタイムクロックモジュール)
-- LM61BIZ (温度センサー) →(LM35DZの方が良かったかも)
- UBWファームウェアの書き込み (USB Bit Whacker Project)
-- Gainer mini 対応Firmware (in 千秋ゼミ)のブートローダを使う.
- ソフトウェア開発環境 (英国製のBasic言語コンパイラを使えば簡単)
-- Swordfish Compiler (Special Edition(SE)は無料)
- 自分で書いたプログラム (参考. Swardfish添付のサンプルたち!!)
// Realtime Clock and Thermometer(A/D)
// (2010.02.07)
Device = 18F2550
Clock = 48
#option org_reset = $800 // for UBW firmware
#option vector_isr_hi = $800 // LCD DMC16117A (16 x 1)
#option vector_isr_lo = $818 // RTC RTC-8564NB (Realtime Clock Module)
// Thermo-Sensor LM61BIZ (-30 .. +100 degree centigrade)
#option LCD_DATA = PORTB.4 // LCD DB.4-DB.7 ==> PORTB.4-PORTB.7
#option LCD_RS = PORTB.3 // LCD RS => PORTB.3 (LCD R/W => GND)
#option LCD_EN = PORTB.2 // LCD EN => PORTB.2 (LCD Vo => GND)
#option I2C_SCL = PORTC.6 // RTC SLC => PORTC.6
#option I2C_SDA = PORTC.7 // RTC SDA => PORTC.7
// Thermo-Sensor Vo => PORTA.0 (t=(Vo-0.60)/0.01 degree)
// SW 1 => PORTC.1 for increment (Hour)
// SW 2 => PORTC.2 for increment (Minute)
Include "LCD.bas"
Include "SI2C.bas"
Include "ADC.bas"
Include "utils.bas"
Include "Convert.bas"
Const I2C_RTC = $A2
Dim hh As Byte, mm As Byte, ss As Byte, tmp As Byte
Dim ADval As Word

Function TimeToStr(x As Byte) As String
TimeToStr = DecToStr(x / 16)+DecToStr(x Mod 16)
End Function

Function ADInAsVolt() As Word
result = (ADC.Read(0) + 1) * 500 / 1024
End Function

SetAllDigital
TRISA.0 = 1 // configure AN0 as an input
ADCON1.7 = 1 // set analogue input on PORTA.0
LCD.Cls
SI2C.Initialize
Input(PORTC.1)
Input(PortC.2)

While true
SI2C.Start
SI2C.WriteByte(I2C_RTC)
SI2C.WriteByte($02)
SI2C.Restart
SI2C.WriteByte(I2C_RTC+1)
ss = SI2C.ReadByte
SI2C.Acknowledge(I2C_ACKNOWLEDGE)
mm = SI2C.ReadByte
SI2C.Acknowledge(I2C_ACKNOWLEDGE)
hh = SI2C.ReadByte
SI2C.Acknowledge(I2C_NOT_ACKNOWLEDGE)
SI2C.Stop

If (PORTC.2=0) Then
While (PORTC.2=0)
DelayMS(10)
Wend
tmp = (mm / 16) * 10 + (mm Mod 16) + 1
mm = (tmp / 10) * 16 + (tmp Mod 10)
SI2C.Start
SI2C.WriteByte(I2C_RTC)
SI2C.WriteByte($03)
SI2C.WriteByte(mm)
SI2C.Stop
EndIf
If (PORTC.1=0) Then
While (PORTC.1=0)
DelayMS(10)
Wend
tmp = (hh / 16) * 10 + (hh Mod 16) + 1
hh = (tmp / 10) * 16 + (tmp Mod 10)
SI2C.Start
SI2C.WriteByte(I2C_RTC)
SI2C.WriteByte($04)
SI2C.WriteByte(hh)
SI2C.Stop
EndIf
WriteAt(1,1,TimeToStr(hh And $3F)+":"+TimeToStr(mm And $7F)+":"+TimeToStr(ss And $7F))
ADval = ADInAsVolt
LCD.MoveCursor (2,1)
LCD.Write(" V=", DecToStr(ADval / 100), ".", DecToStr(ADval, 2), " ")
DelayMS(300)
Wend





as-192414 at 13:24電子工作・無線 | 生活 
Visitors

Profile
QRコード
QRコード

レンタルサーバーなら使えるねっと

最新コメント
  • ライブドアブログ