$prog &HFF , &H62 , &HDF , &HFF 'ヒューズ設定。(工場出荷状態) ' ' ******************************************************** ' * * ' * LEDライト調光器 赤外線リモコン 送信機プログラム * ' * * ' * AVR is using ATtiny861A * ' * Basic Compiler is BASCOM-AVR * ' * Copyright By O-Family 2012. 9.19 * ' ******************************************************** ' ' Ver 00.22 テスト・バージョン。 2012. 8.24 ' Ver 01.01 初回公開バージョン。 2012. 9.19 ' ' $regfile = "ATtiny861.DAT" '使用するAVRを設定。 $crystal = 1000000 'AVRクロックを設定。 ' $hwstack = 64 'ハードウェア・スタックの容量を設定。 $swstack = 10 'ソフトウェア・スタックの容量を設定。 $framesize = 24 'フレーム領域の容量を設定。 Autooff Alias 2000 '自動OFFの時間。(×10mS) ' ' * ポート名の定義 * ' Sw_1 Alias Pinb.4 'スイッチ[1]の接続ポート。 Sw_1pu Alias Portb.4 'スイッチ[1]のプルアップポート。 Sw_2 Alias Pinb.5 'スイッチ[2]の接続ポート。 Sw_2pu Alias Portb.5 'スイッチ[2]のプルアップポート。 Sw_3 Alias Pina.4 'スイッチ[3]の接続ポート。 Sw_3pu Alias Porta.4 'スイッチ[3]のプルアップポート。 ' Code_sel0 Alias Pina.7 'リモコンのアドレス選択ジャンパーピン[0]接続ポート。 Code_sel0pu Alias Porta.7 'リモコンのアドレス選択ジャンパーピン[0]プルアップポート。 Code_sel1 Alias Pina.6 'リモコンのアドレス選択ジャンパーピン[1]接続ポート。 Code_sel1pu Alias Porta.6 'リモコンのアドレス選択ジャンパーピン[1]プルアップポート。 Code_sel2 Alias Pina.5 'リモコンのアドレス選択ジャンパーピン[2]接続ポート。 Code_sel2pu Alias Porta.5 'リモコンのアドレス選択ジャンパーピン[2]プルアップポート。 ' Fslp_1 Alias Porta.0 'センサーの端子[1]接続ポート。 Fslp_2 Alias Porta.1 'センサーの端子[2]接続ポート。 Fslp_3 Alias Porta.2 'センサーの端子[3]接続ポート。 Fslp_r Alias Porta.3 '抵抗器接続ポート。 ' Fslp_ad1 Alias 0 'センサーの端子[1]のA/Dチャネル番号。 Fslp_ad3 Alias 2 'センサーの端子[3]のA/Dチャネル番号。 ' ' * 変数の宣言 * ' Dim Togglebit As Byte 'リモコンRC5コードのトグルビット・フラグ。 Dim Senddata As Word 'リモコンRC5コードの送信データ。 Dim Address As Word 'リモコンRC5コードのアドレス。(16bit , bit-10,9,8,7,6) Dim Command As Byte 'リモコンRC5コードのコマンド。(0 〜 63) Dim Swdata As Byte 'スイッチ入力データ。 Dim Swoffchk As Byte 'スイッチの[OFF]確認フラグ。 Dim Atofftime As Word '自動OFFのタイマーカウンター。 ' Dim V1 As Word 'センサーの検出電圧(1)。 Dim V2 As Word 'センサーの検出電圧(2)。 Dim Position As Word '位置データ。 Dim Pressure As Word '圧力データ。 ' Dim Temp1 As Byte '汎用テンポラリ変数 Byte型 No.1 Dim Temp2 As Byte '汎用テンポラリ変数 Byte型 No.2 Dim Tempw1 As Word '汎用テンポラリ変数 Word型 No.1 Dim Tempw2 As Word '汎用テンポラリ変数 Word型 No.2 ' ' * ポートの初期設定 * ' Set Sw_1pu 'スイッチ[1]の接続ポートをプルアップする。 Set Sw_2pu 'スイッチ[2]の接続ポートをプルアップする。 Set Sw_3pu 'スイッチ[3]の接続ポートをプルアップする。 ' Set Code_sel0pu 'リモコンのアドレス選択ジャンパーピン[0]接続ポートをプルアップする。 Set Code_sel1pu 'リモコンのアドレス選択ジャンパーピン[1]接続ポートをプルアップする。 Set Code_sel2pu 'リモコンのアドレス選択ジャンパーピン[2]接続ポートをプルアップする。 ' Set Portb.0 '未使用ポートをプルアップする。 Set Portb.1 '未使用ポートをプルアップする。 Set Portb.2 '未使用ポートをプルアップする。 Set Portb.6 '予備ジャンパーピン・ポートをプルアップする。 ' Config Portb.3 = Output '赤外線LED接続ポート[OC1B]を出力に設定する。 Reset Portb.3 '赤外線LEDを消灯。 ' Gosub Fslprst '[FSLP]センサーの接続ポートを初期化する。 ' Set Prr.prusi '電力削減 USI回路の停止。 Config Aci = Off 'アナログ比較器の電源を切る。 Set Didr0.adc0d 'デジタル入力禁止レジスタの設定。(PA0) Set Didr0.adc2d 'デジタル入力禁止レジスタの設定。(PA2) Set Didr0.arefd 'デジタル入力禁止レジスタの設定。(PA3) ' ' * Timerの設定 * ' Tccr0a = &B0000_0001 'Timer0 = 8bit Timer動作 , Clear Timer = 1 Tccr0b = &B0000_0011 'Prescale = 64 (1,000,000Hz / 64 = 15,625Hz) Ocr0a = 156 - 1 '15,625Hz / 156 = 100(10mS) ' Tccr1d = &B0000_0000 'Config Timer1 = Timer (標準動作) Tccr1c = &B0000_0000 Tccr1b = &B0000_0001 'Prescale = 1 (1,000,000Hz / 1 = 1uS) Tccr1a = &B0001_0000 '[OCR1B]をトグル動作。 ' Ocr1c = 13 - 1 '赤外線のキャリア周波数。(1,000,000Hz ÷ 13カウント ÷ 2 = 38,462Hz) Tccr1a = &B0010_0000 '[OCR1B]を[L]にする。(赤外線LEDを消灯する) ' ' * A/Dコンバータの初期設定 * ' Config Adc = Single , Prescaler = Auto , Reference = Avcc 'A/Dコンバータの設定。 Start Adc 'A/Dコンバータに電源を供給。 ' ' * スイッチ割り込みの設定 * ' Pcmsk0 = &B0000_0000 'スイッチのPCINT割り込みマスクを設定。 Pcmsk1 = &B0000_0000 Set Pcmsk1.pcint12 '[SW1] PB4[PCINT12]を許可する。 Set Pcmsk1.pcint13 '[SW2] PB5[PCINT13]を許可する。 Set Pcmsk0.pcint4 '[SW3] PA4[PCINT4]を許可する。 Set Pcmsk0.pcint0 '[FSLP-1] PA0[PCINT0]を許可する。 On Pcint1 Swint Nosave 'スイッチ割り込みルーチンのラベルを設定。 ' ' * 初期設定 * ' Set Address.12 'RC5リモコン・コードのスタート・ビットをセットする。 Set Address.13 ' Enable Interrupts 'すべての割り込みを許可。 ' ' ******************* ' * メイン ルーチン * ' ******************* ' Main: Address.8 = Code_sel0 'リモコンのアドレス選択ジャンパーピンを読み込む。 Address.9 = Code_sel1 Address.10 = Code_sel2 ' ' * 自動OFFの時間を計測する * ' If Tifr.ocf0a = 1 Then 'If 10m経過したか? Then Set Tifr.ocf0a Atofftime = Atofftime + 1 If Atofftime > Autooff Then 'If 自動OFF時間を越えたか? Then Tccr1a = &B0010_0000 '[OCR1B]を[L]にする。(赤外線LEDを消灯する) Reset Code_sel0pu 'リモコンのアドレス選択ジャンパーピン[0]接続ポートのプルアップを解除する。 Reset Code_sel1pu 'リモコンのアドレス選択ジャンパーピン[1]接続ポートのプルアップを解除する。 Reset Code_sel2pu 'リモコンのアドレス選択ジャンパーピン[2]接続ポートのプルアップを解除する。 Gosub Fslprst '[FSLP]センサーの接続ポートを初期化する。 Stop Adc 'A/Dコンバータの電源を切る。 Config Fslp_1 = Input 'センサーの端子[1]接続ポートを入力に設定する。 Config Fslp_r = Input '抵抗器接続ポートを入力に設定する。 Set Fslp_r '抵抗器接続ポートをプルアップする。 Reset Didr0.adc0d 'デジタル入力禁止レジスタの解除。(PA0) Waitms 10 '各設定の安定待ち時間。 Enable Pcint1 'スイッチのピン変化割り込みを許可する。 ' ' Power Powerdown 'スリープモードへ移行する。(スイッチ割り込みで再起動する) ' ' Disable Pcint1 'スイッチのピン変化割り込みを禁止する。 Set Didr0.adc0d 'デジタル入力禁止レジスタの設定。(PA0) Gosub Fslprst '[FSLP]センサーの接続ポートを初期化する。 Start Adc 'A/Dコンバータに電源を供給。 Set Code_sel0pu 'リモコンのアドレス選択ジャンパーピン[0]接続ポートをプルアップする。 Set Code_sel1pu 'リモコンのアドレス選択ジャンパーピン[1]接続ポートをプルアップする。 Set Code_sel2pu 'リモコンのアドレス選択ジャンパーピン[2]接続ポートをプルアップする。 Waitms 50 'プルアップの安定時間。 Atofftime = 0 '自動OFFのタイマーをリセットする。 End If End If ' ' * スイッチの検出 * ' If Swoffchk <> 0 Then Goto Swchk5 'If スイッチの[OFF]検出中か? Then If Sw_1 = 0 Then Goto Swchk1 'If [SW1]が押されたか? Then If Sw_2 = 0 Then Goto Swchk2 'If [SW2]が押されたか? Then If Sw_3 = 0 Then Goto Swchk3 'If [SW3]が押されたか? Then Goto Swchk9 ' ' Swchk1: Command = &B0001_1010 '[ON/OFF]コマンド。Addres = [xxxA_AA00] , data = [xx01_1010] Goto Swchk4 ' ' Swchk2: Command = &B0001_1011 '[Color]コマンド。Addres = [xxxA_AA00] , data = [xx01_1011] Goto Swchk4 ' ' Swchk3: Command = &B0001_1100 '[Preset]コマンド。Addres = [xxxA_AA00] , data = [xx01_1100] Swchk4: Tempw1 = Command '送信コードにコマンドを付加する。 Senddata = Address Or Tempw1 Gosub Sendcommand '制御コマンドを送信する。 Swoffchk = 1 'スイッチの[OFF](離した)を検出させる。 Atofftime = 0 '自動OFFのタイマーをリセットする。 Goto Swchk9 ' ' Swchk5: 'スイッチが離されるのを確認する。 Temp1 = Sw_1 And Sw_2 Temp1 = Temp1 And Sw_3 If Temp1 = 1 Then 'If スイッチが離されたか? Then Swoffchk = 0 Waitms 30 'スイッチのチャタリング待ち時間。 End If Swchk9: ' ' * [FSLP]に触れた位置の測定 * ' Set Fslp_2 'センサーの端子[2]を[H]レベルに設定する。 Reset Fslp_3 'センサーの端子[3]を[L]レベルに設定する。 Reset Fslp_r '抵抗接続端子を[L]レベルに設定する。 Config Fslp_r = Input '抵抗接続端子をハイ・インピーダンスにする。 Config Fslp_1 = Input 'センサーの端子[1]をA/D入力に設定する。 ' Waitus 10 '10μSの待ち時間。 Position = Getadc(fslp_ad1) 'センサーの端子[1]をA/D変換する。 ' ' * [FSLP]に触れた圧力の測定 * ' Set Fslp_2 'センサーの端子[2]を[H]レベルに設定する。 Config Fslp_1 = Input 'センサーの端子[1]をA/D入力に設定する。 Config Fslp_3 = Input 'センサーの端子[3]をA/D入力に設定する。 Config Fslp_r = Output '抵抗接続ポートを出力に設定する。 Reset Fslp_r '抵抗接続端子を[L]レベルに設定する。 ' Waitus 10 '10μSの待ち時間。 V1 = Getadc(fslp_ad3) 'センサーの端子[3]をA/D変換する。 V2 = Getadc(fslp_ad1) 'センサーの端子[1]をA/D変換する。 Gosub Fslprst '[FSLP]センサーの接続ポートを初期化する。 ' Tempw1 = 64 * V2 '圧力を計算する。 Tempw2 = V1 - V2 Pressure = Tempw1 / Tempw2 '圧力 = 64 * V2 / (V1-V2) ' ' * [FSLP]に触れたデータを送信する * ' If Pressure > 2 Then 'If 圧力が2以上か? Then If Position >= 20 Then 'If [FSLP]に触れたか? Then If Position < 40 Then 'If [20〜39]か? Then Position = 40 End If ' If Sw_3 = 1 Then 'If [SW3]が押されていない([Preset]ではない)か? Then Tempw1 = Position And &B0000_0000_0011_1111 '下位6ビットを取り出す。 Senddata = Address Or Tempw1 Set Senddata.6 '[下位データ]コマンド。Addres = [xxxA_AA01] Gosub Toggleinv 'トグルビットを反転させる。 Gosub Irsend '[FSLP]の下位6bitデータを送信する。 Waitms 5 ' Tempw1 = Position And &B0000_1111_1100_0000 '上位6ビットを取り出す。 Shift Tempw1 , Right , 6 '下位6bitへシフトする。 Senddata = Address Or Tempw1 Set Senddata.7 '[上位データ]コマンド。Addres = [xxxA_AA10] Gosub Toggleinv 'トグルビットを反転させる。 Gosub Irsend '[FSLP]の上位6bitデータを送信する。 Waitms 5 Else '[SW3]が押されている。([Preset]の送信) If Pressure > 100 Then 'If 圧力が100以上か? Then Select Case Position Case Is < 200 : Command = &B0001_0001 '[Preset(1)]コマンド。Addres = [xxxA_AA00] , data = [xx01_0001] Case Is < 400 : Command = &B0001_0010 '[Preset(2)]コマンド。Addres = [xxxA_AA00] , data = [xx01_0010] Case Is < 600 : Command = &B0001_0011 '[Preset(3)]コマンド。Addres = [xxxA_AA00] , data = [xx01_0011] Case Is < 800 : Command = &B0001_0100 '[Preset(4)]コマンド。Addres = [xxxA_AA00] , data = [xx01_0100] Case Else : Command = &B0001_0101 '[Preset(5)]コマンド。Addres = [xxxA_AA00] , data = [xx01_0101] End Select Tempw1 = Command '送信コードにコマンドを付加する。 Senddata = Address Or Tempw1 Gosub Sendcommand '制御コマンドを送信する。 Swoffchk = 1 End If End If Atofftime = 0 '自動OFFのタイマーをリセットする。 End If End If ' Goto Main ' ' ****************************************** ' * [FSLP]センサーの接続ポートを初期化する * ' ****************************************** ' Fslprst: Config Fslp_1 = Output 'センサーの端子[1]ポートを出力に設定する。 Config Fslp_2 = Output 'センサーの端子[2]ポートを出力に設定する。 Config Fslp_3 = Output 'センサーの端子[3]ポートを出力に設定する。 Config Fslp_r = Output '抵抗接続ポートを出力に設定する。 Reset Fslp_1 '全てのセンサー端子を[L]レベルにする。 Reset Fslp_2 Reset Fslp_3 Reset Fslp_r Return ' ' ************************************** ' * 制御コマンドを送信するサブルーチン * ' ************************************** ' Sendcommand: Gosub Toggleinv 'トグルビットを反転させる。 For Temp2 = 1 To 6 '同じコードを6回送信する。 Gosub Irsend '[RC5]フォーマットで14bitのデータを送信する。 Waitms 5 Next Temp2 Return ' ' **************************************** ' * トグルビットを反転させるサブルーチン * ' **************************************** ' Toggleinv: If Togglebit <> 0 Then 'If トグルビットは[1]か? Then Set Senddata.11 '送信コードのトグルビットを立てる。 End If Toggle Togglebit.0 'トグルビットフラグを反転させる。 Return ' ' ********************************************************** ' * [RC5]フォーマットで14bitのデータを送信するサブルーチン * (Senddata = 送信するデータ(下位14bit)) ' ********************************************************** ' Irsend: Timer1 = 0 For Temp1 = 13 To 0 Step -1 'MSBから14bitを送信する。 If Senddata.temp1 = 0 Then 'If 送信するビットが[0]か? Then Tccr1a = &B0001_0000 '[OC1B]をトグル動作。(赤外線LEDをパルス点灯する) Waitus 889 '送信パルスの幅。 Tccr1a = &B0010_0000 '[OC1B]を[L]にする。(赤外線LEDを消灯する) Else '[1]の場合。 Tccr1a = &B0010_0000 '[OC1B]を[L]にする。(赤外線LEDを消灯する) Waitus 889 '送信パルスの幅。 Tccr1a = &B0001_0000 '[OC1B]をトグル動作。(赤外線LEDをパルス点灯する) End If Waitus 889 '送信パルスの幅。 Next Temp1 Tccr1a = &B0010_0000 '[OC1B]を[L]にする。(赤外線LEDを消灯する) Return ' ' **************************** ' * スイッチ割り込みルーチン * ' **************************** ' Swint: '何も処理しない。 Return ' ' End