読者です 読者をやめる 読者になる 読者になる

もじずり技術会

Since:2011.07.04 連絡先:info@mojizuri.jp

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