2013年2月11日月曜日

AldebaranプログラムVer.C83公開

コミックマーケット83で頒布させていただいた、同人フルカラーLEDペンライト「Aldebaran」のソースコードを公開いたします。 本ソースコードは「クリエイティブ・コモンズ 表示 2.1 日本 ライセンス」の下に提供致します。

;------------------------------------
; ●Aldebaranプログラム
; 作成日時:2012.12.12  Y.Yamashiro
; 更新日時:2012.12.26  Y.Yamashiro
;
; ●更新履歴
; Ver.0.1 2012.12.12 Y.Yamashiro INCLUDE,__CONFIGを作成
; Ver.1.0 2012.12.24 Y.Yamashiro 点灯確認、EEPROM記憶化確認
; Ver.1.5 2012.12.25 Y.Yamashiro ソースコードを整形
; Ver.C83 2012.12.26 Y.Yamashiro 初出
;
;------------------------------------
 LIST P=PIC12F675
 INCLUDE "P12F675.INC"
 __CONFIG _CP_OFF & _CPD_OFF & _BODEN_ON & _MCLRE_ON & _WDT_ON & _PWRTE_ON & _INTRC_OSC_NOCLKOUT
;------------------------------------
 CBLOCK 0x20 
TIMER_TMP  ; タイマ用カウンタ
COLD_START_TMP ; コールドスタート時ウェイト用カウンタ
DUTY_RED  ; 赤色のデューティ
DUTY_GREEN  ; 緑色のデューティ
DUTY_BLUE  ; 青色のデューティ
DUTY_TMP  ; 3パラレルPWM周期生成用
DUTY_RED_TMP ;
DUTY_GREEN_TMP ;
DUTY_BLUE_TMP ;
OUTPUT_TMP  ;
CHECK_PSW_PAST ; プッシュスイッチ入力リングバッファ
CURRENT_PRESET ; 現在のプリセットNo.
TOTAL_PRESET ; 総プリセット数
SET_COLOR_TMP ; プリセットNo.->アドレス変換用
WRITE_EEPROM_DATA ; EEPROM書き込み用
ALDEBARAN_SETTING ; Aldebaran設定
 ENDC

LED_RED  EQU GPIO1
LED_GREEN EQU GPIO2
LED_BLUE EQU GPIO0
PUSH_SW  EQU GPIO4
MASTER_DUTY EQU D'19'

;------------------------------------
 ; EEPROM DATA
  ORG 02100H
  ; プリセット記述(4bytesで一組,R,G,B,X)
  ; 各色0〜20で設定可能。
 DE D'20',D'00',D'00',D'00' ; 赤
 DE D'15',D'06',D'08',D'00' ; 桃
 DE D'20',D'09',D'00',D'00' ; 橙
 DE D'20',D'16',D'00',D'00' ; 黄
 DE D'00',D'20',D'00',D'00' ; 緑
 DE D'00',D'00',D'20',D'00' ; 青
 DE D'10',D'00',D'10',D'00' ; 紫
 DE D'15',D'15',D'08',D'00' ; 白

  ORG 0217DH
  DE B'00000001' ; 7D:アルデバラン設定
  DE D'00'    ; 7E:最終プリセットNo.
  DE D'07'  ; 7F:総プリセット数(0to30)
;------------------------------------
 ORG 0
 NOP
 CLRWDT
 GOTO INITIALIZE
 NOP
 NOP
 NOP
 NOP
 NOP
 GOTO INTERRUPT
;------------------------------------
; 割り込み発生時=異常事態と判断。
INTERRUPT
 BANKSEL GPIO
 CLRF GPIO
INTERRUPT_LP
 ; 無限ループ→WDTリセット。
 GOTO INTERRUPT_LP
;------------------------------------
; 初期設定
INITIALIZE 
; 電圧安定用のウェイト(約250ms)を入れる
 CALL COLD_START
; プリスケーラはWDT用(1:128)
; 内蔵プルアップ(GPIO)を有効
 BANKSEL OPTION_REG
 MOVLW B'00101111'
 MOVWF OPTION_REG
; 内蔵プルアップ(4,5)を有効
 BANKSEL WPU
 MOVLW B'00110000'
 MOVWF WPU
; 内蔵コンパレータをOFF
 BANKSEL CMCON
 MOVLW B'00000111'
 MOVWF CMCON
; 全てをデジタル入出力にする
 BANKSEL ANSEL
 CLRF ANSEL
; 入出力設定
 BANKSEL TRISIO
 MOVLW B'00111000'
 MOVWF TRISIO
; ポートの状態を初期値に
 BANKSEL GPIO
 CLRF GPIO
; 変数初期化
; CLRF DUTY_RED
; CLRF DUTY_GREEN
; CLRF DUTY_BLUE
; CLRF CURRENT_PRESET
; CLRF FLAG_SAVE_LAST_PRESET
 MOVLW 0xFF
 MOVWF CHECK_PSW_PAST
; 設定読み出し
 CALL LOAD_SETTING
 CALL SET_COLOR
; 設定終了
 GOTO MAIN
;------------------------------------
; メイン処理
MAIN
 CLRWDT
 BANKSEL GPIO
 CALL CHECK_PSW
 CALL MAIN_OUTPUT
 GOTO MAIN
;------------------------------------
; 設定読み出し
LOAD_SETTING
 BANKSEL GPIO
 MOVLW 0x7D
 CALL READ_EEPROM
 MOVWF ALDEBARAN_SETTING
 BTFSS ALDEBARAN_SETTING,0
 GOTO LOAD_SETTING_PRESET_NOSAVE
 GOTO LOAD_SETTING_PRESET_SAVE
LOAD_SETTING_PRESET_NOSAVE
 CLRF CURRENT_PRESET
 GOTO LOAD_SETTING_PRESET_TOTAL
LOAD_SETTING_PRESET_SAVE
 MOVLW 0x7E
 CALL READ_EEPROM
 MOVF CURRENT_PRESET,W
 GOTO LOAD_SETTING_PRESET_TOTAL
LOAD_SETTING_PRESET_TOTAL
 MOVLW 0x7F
 CALL READ_EEPROM
 MOVWF TOTAL_PRESET
 RETURN
;------------------------------------
; 色を設定
SET_COLOR
 BANKSEL GPIO
 MOVF CURRENT_PRESET,W
 MOVWF SET_COLOR_TMP
 RLF  SET_COLOR_TMP,F
 RLF  SET_COLOR_TMP,W
 ANDLW B'01111100'
 MOVWF SET_COLOR_TMP
SET_COLOR_READ_RED
 MOVF SET_COLOR_TMP,W
 ADDLW B'00000000'
 CALL READ_EEPROM
 MOVWF DUTY_RED
SET_COLOR_READ_GREEN
 MOVF SET_COLOR_TMP,W
 ADDLW B'00000001'
 CALL READ_EEPROM
 MOVWF DUTY_GREEN
SET_COLOR_READ_BLUE
 MOVF SET_COLOR_TMP,W
 ADDLW B'00000010'
 CALL READ_EEPROM
 MOVWF DUTY_BLUE
; 将来の拡張用
;SET_COLOR_READ_KAKUCHO
; MOVF SET_COLOR_TMP,W
; ADDLW B'00000011'
; CALL READ_EEPROM
; MOVWF DUTY_BLUE
 RETURN
;------------------------------------
; EEPROM読み込み
READ_EEPROM
 BANKSEL EEADR
 MOVWF EEADR
 BSF  EECON1,RD
 MOVF EEDATA,W
 BANKSEL GPIO
 RETURN 
;------------------------------------
; EEPROM書き込み
WRITE_EEPROM
 BANKSEL GPIO
 CLRF GPIO
 BANKSEL EEADR
 MOVWF EEADR
 MOVF WRITE_EEPROM_DATA,W
 MOVWF EEDATA
WRITE_EEPROM_GO
 BSF  EECON1,WREN
 BCF  INTCON,GIE
 MOVLW 0x55
 MOVWF EECON2
 MOVLW 0xAA
 MOVWF EECON2
 BSF  EECON1,WR
WRITE_EEPROM_LP
 BTFSC EECON1,WR
 GOTO WRITE_EEPROM_LP
 BANKSEL GPIO
 RETURN
;------------------------------------
; プッシュスイッチが押されているか?
CHECK_PSW
 BANKSEL GPIO
CHECK_PSW_LOTATE
 RLF  CHECK_PSW_PAST,F
 BTFSC GPIO,PUSH_SW
 BSF  CHECK_PSW_PAST,0
 BTFSS GPIO,PUSH_SW
 BCF  CHECK_PSW_PAST,0
CHECK_PSW_JUDGE
 MOVF CHECK_PSW_PAST,W
 XORLW B'00000011'
 BTFSC STATUS,Z
 GOTO CHECK_PSW_YES
 RETURN
CHECK_PSW_YES
 INCF CURRENT_PRESET,F
 MOVF CURRENT_PRESET,W
 SUBWF TOTAL_PRESET,W
 BTFSS STATUS,C
 CLRF CURRENT_PRESET
 CALL SET_COLOR
; 最後に使ったプリセットを保存しておくか?
 BTFSS ALDEBARAN_SETTING,0
 RETURN
 MOVF CURRENT_PRESET,W
 MOVWF WRITE_EEPROM_DATA
 MOVLW 0x7E
 CALL WRITE_EEPROM
 RETURN
;------------------------------------
; LEDを点灯させる処理
MAIN_OUTPUT
 BANKSEL GPIO
 MOVLW MASTER_DUTY
 MOVWF DUTY_TMP
 MOVF DUTY_RED,W
 MOVWF DUTY_RED_TMP
 MOVF DUTY_GREEN,W
 MOVWF DUTY_GREEN_TMP
 MOVF DUTY_BLUE,W
 MOVWF DUTY_BLUE_TMP
;--------------------
; ループ
MAIN_OUTPUT_LP
 CLRF OUTPUT_TMP
;----------
; 赤色を出力
MAIN_OUTPUT_LP_RED
 MOVF DUTY_RED_TMP,W
 BTFSC STATUS,Z
 GOTO MAIN_OUTPUT_LP_RED_END
 DECFSZ DUTY_RED_TMP,F
 GOTO MAIN_OUTPUT_LP_RED_ON
 GOTO MAIN_OUTPUT_LP_RED_OFF
MAIN_OUTPUT_LP_RED_ON
 BSF  OUTPUT_TMP,LED_RED
 NOP
 NOP
 GOTO MAIN_OUTPUT_LP_GREEN
MAIN_OUTPUT_LP_RED_OFF
 BCF  OUTPUT_TMP,LED_RED
 GOTO MAIN_OUTPUT_LP_GREEN
MAIN_OUTPUT_LP_RED_END
 NOP
 NOP
 NOP
 NOP
 NOP
 NOP
 GOTO MAIN_OUTPUT_LP_GREEN 
;----------
; 緑色を出力
MAIN_OUTPUT_LP_GREEN
 MOVF DUTY_GREEN_TMP,W
 BTFSC STATUS,Z
 GOTO MAIN_OUTPUT_LP_GREEN_END
 DECFSZ DUTY_GREEN_TMP,F
 GOTO MAIN_OUTPUT_LP_GREEN_ON
 GOTO MAIN_OUTPUT_LP_GREEN_OFF
MAIN_OUTPUT_LP_GREEN_ON
 BSF  OUTPUT_TMP,LED_GREEN
 NOP
 NOP
 GOTO MAIN_OUTPUT_LP_BLUE
MAIN_OUTPUT_LP_GREEN_OFF
 BCF  OUTPUT_TMP,LED_GREEN
 GOTO MAIN_OUTPUT_LP_BLUE
MAIN_OUTPUT_LP_GREEN_END
 NOP
 NOP
 NOP
 NOP
 NOP
 NOP
 GOTO MAIN_OUTPUT_LP_BLUE
;----------
; 青色を出力
MAIN_OUTPUT_LP_BLUE
 MOVF DUTY_BLUE_TMP,W
 BTFSC STATUS,Z
 GOTO MAIN_OUTPUT_LP_BLUE_END
 DECFSZ DUTY_BLUE_TMP,F
 GOTO MAIN_OUTPUT_LP_BLUE_ON
 GOTO MAIN_OUTPUT_LP_BLUE_OFF
MAIN_OUTPUT_LP_BLUE_ON
 BSF  OUTPUT_TMP,LED_BLUE
 NOP
 NOP
 GOTO MAIN_OUTPUT_LP_DEAD
MAIN_OUTPUT_LP_BLUE_OFF
 BCF  OUTPUT_TMP,LED_BLUE
 GOTO MAIN_OUTPUT_LP_DEAD
MAIN_OUTPUT_LP_BLUE_END
 NOP
 NOP
 NOP
 NOP
 NOP
 NOP
 GOTO MAIN_OUTPUT_LP_DEAD
MAIN_OUTPUT_LP_DEAD
 MOVF OUTPUT_TMP,W
 MOVWF GPIO
 DECFSZ DUTY_TMP,F
 GOTO MAIN_OUTPUT_LP
 RETURN
;------------------------------------
; 簡易タイマー
TIMER
 BANKSEL GPIO
 MOVWF TIMER_TMP
 MOVF TIMER_TMP,W
 BTFSC STATUS,Z
 RETURN
TIMER_LP
 NOP
 DECFSZ TIMER_TMP,F
 GOTO TIMER_LP
 RETURN
;------------------------------------
; コールドスタート時に電圧安定まで待つ
COLD_START
 BANKSEL GPIO
 MOVLW 0xFF
 MOVWF COLD_START_TMP
COLD_START_LP
 MOVLW 0xFF
 CALL TIMER
 DECFSZ COLD_START_TMP,F
 GOTO COLD_START_LP
 RETURN
;------------------------------------
 END