PIC

Counter: 7788, today: 2, yesterday: 1

環境

  • PIC18F2550マイコンボード
  • LCD DMC16117A
  • ブートローダー
    • GAINER/memo0 千秋ゼミ」のGainerMini_firm090115_r02e.zipを使う.
      • ブートローダーのhexファイルはzipファイル中のboot/HEX/20M-18f2550_ORG.hex
      • ブートローダー書き込み後は, 1pinのスイッチを押しながら電源を入れてMybootかfsusbで書き込む.
      • ブートローダーのためのUSBドライバはzipファイル中のboot/Driver/Release/mchpusb.inf
    • ブートローダーの書き込みは秋月電子のPICプログラマVer.4でpicpgm6.exe(Ver.6.72.13)を使った.
    • GAINERとして使うには, ブートローダーでHEX/GAINERmini_ORIG.hexを書き込む.
    • ブートローダーはHIDmon-2550の方が良いのかもしれない???
  • Swordfish Basic Compiler
    • ブートローダーを使うので以下の3行が必要.
      #option org_reset     = $800  // for UBW firmware 
      #option vector_isr_hi = $800 
      #option vector_isr_lo = $818 
    • コンパイル後のhexファイルをMybootかfsusb.exeで書き込む.
    • fsusbには, libusb-win32が必要.
    • Swordfishコンパイラーからfsusb.exeを呼び出せば便利なはずだが設定出来ていない!?!?

HIDマウスデモ

2010/01/28
  • 千秋ゼミ/memo/UBW」のMouse.zipを試してみる.
  • zipファイル中のMakefileを使ってmcc18.exeでそのままmake出来た.
  • ドライバ不要でWinもMacも繋がって, マウスカーソルがくるくる廻る.

RTCモジュールを使う時計とLM61温度計

2010/02/07
  • RTCモジュールから時刻をI2Cで読み込んでLCD液晶ディスプレイに表示する.
  • LM61から電圧を読み込んで温度に換算して液晶ディスプレイ右側に表示する.
    PIC18F2550.jpg
    // 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.001 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

タイマー割込みよる時計とLM61TL431による温度計

2010/02/14
  • 0.1秒のタイマー割込みでカウントし簡易時計を実現する.
  • TL431で比較電圧2.5Vを作りVref(PORTA.3)に入力し温度の精度を上げたつもり!?
    // Clock and Thermometer(A/D)
    //                                             (2010.02.14)
    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)
                                 // Thermo-Sensor Vo => PORTA.0 (t=(Vo-0.60)/0.001 degree)
                                 // SW 1 => PORTC.1 for increment (Hour) 
                                 // SW 2 => PORTC.2 for increment (Minute)
    Include "LCD.bas"
    Include "ADC.bas"
    Include "utils.bas"
    Include "Convert.bas"
    Include "ISRTimer.bas"
    Const I2C_RTC = $A2, Timer1 = 0       
    Dim hh As Byte, mm As Byte, ss As Byte, tt As Word, i As Byte
    Dim counter As LongWord
    Event OnTimer1()       // 0.1sec 
         counter = counter + 1
         If (counter = 864000) Then // 24hour * 60min * 60sec * 10 = 86400
           counter = 0
         EndIf
    End Event
    Function TimeToStr(x As Byte) As String
      If (x < 10) Then
        TimeToStr = "0"+DecToStr(x)
      Else
        TimeToStr = DecToStr(x)
      EndIf
    End Function
    Function Tempature(x As Word) As Word
       Tempature = ((x + 1) * 24950 / 1024) - 6000     // Vref = 250, 10bit=1024
    End Function
    SetAllDigital
    TRISA.0 = 1     // configure AN0 as an input 
    ADCON1.3 = 1    // set analogue input on PORTA.0 .. PORTA.3 
    ADCON1.2 = 0
    ADCON1.1 = 1
    ADCON1.0 = 1
    ADCON1.4 = 1    // set Vref to PORTA.3
    LCD.Cls
    Timer.Initialize
    Timer.Items(Timer1).Interval = 100 // 100ms
    Timer.Items(Timer1).OnTimer = OnTimer1
    Timer.Items(Timer1).Enabled = true
    counter = 0
    Timer.Start
    Input(PORTC.1)
    Input(PORTC.2)
    While true
      hh = counter / 36000
      mm = (counter - (36000*hh)) / 600
      ss = (counter - (36000*hh) - (600*mm)) / 10
      If (PORTC.2=0) Then
         While (PORTC.2=0)
            DelayMS(10)
         Wend
         mm = (mm + 1) Mod 600
         counter = (36000*hh) + (600*mm)
      EndIf
      If (PORTC.1=0) Then
         While (PORTC.1=0)
            DelayMS(10)
         Wend
         hh = (hh + 1) Mod 24
         counter = (36000*hh) + (600*mm) + (10*ss)
      EndIf
       LCD.WriteAt(1,1,TimeToStr(hh)+":"+TimeToStr(mm)+":"+TimeToStr(ss))
       If (ss = 0) Then
         tt = 0
         For i=1 To 50
           tt = tt + ADC.Read(0)
           DelayMS(10)
         Next
         tt = Tempature(tt / 50)
       EndIf
       LCD.WriteAt(2,1," "+DecToStr(tt / 100)+"."+DecToStr(tt Mod 100)+" C")
      DelayMS(300)
    Wend

加速度センサーをGainerに接続

2010/01/16
motion_mouse.jpg

リンク


添付ファイル: filemotion_mouse.jpg 650件 [詳細] filePIC18F2550.jpg 891件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2015-11-22 (日) 17:25:11 (606d)