1.概要
・アメダス等、自動的に計測してデータを記録する仕組みに興味があり作ってみました。
・定期的に気温をSRAMに保存してシリアル経由でPCにデータを取り込みEXCELのグラフ機能を利用して可視化してます。
2.回路図
3.ブレッドボードに組み込み
・10分間隔で気温をSRAMに格納。データ出力ボタンでCSVで出力。100日は記録できる計算。
・SRAMなので電源切れるとデータも消えます。
・CSVを加工してEXCELでグラフ化。20時過ぎから気温が下がって6時頃から上がり始めているのがわかる。
4.アセンブリソースコード
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; ANALOG DATA LOGGER Rel1.00 (C)inf102
; 参照書籍 はじめてのPICアセンブラ入門 A/D、シリアル通信部
; http://orange.zero.jp/electronics/pic/pic.html 10進数変換部 (リンク切れ)
; [232C 2400BPS N81][XTAL 3.58MHz]
; RB0,1,2,3 - I/O DATA
; RA1 - SRAM ADDRESS COUNT UP
; RA2 - SRAM ADDRESS CLEAR
; RA3 - SRAM W.E.
; RA4 - SRAM O.E.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
LIST P=16F877A
#INCLUDE P16F877A.INC
__CONFIG _XT_OSC & _CP_OFF & _PWRTE_ON & _WDT_OFF & _LVP_OFF
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ERRORLEVEL -302 ;SUPPRESS BANK WARNING
CBLOCK 020H
PRM1B
PRM1A
PRM3E
PRM3D
PRM3C
PRM3B
PRM3A
SRLC1
SRWK1
CNT1
CNT2
CNT3
CNT4
CNT5
CNT6
CODEA
CODEB
CODEC
C1 ;SEC
C2 ;SEC
C3 ;MM
C4 ;MM
C5 ;HH
C6 ;HH
DAY1
DAY2
MINCNT ;MINCNT==5 -> SRAMWRITE
ENDC
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ORG 0X2100
DE "0123456789ABCDEF"
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ORG 0X000
START
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
BCF STATUS, RP0 ;BK0
BCF STATUS, RP1
; 232C
MOVLW B'10010000'
MOVWF RCSTA
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
clrf INTCON ; 割り込み禁止
MOVLW B'00000001'
MOVWF PORTA
CLRF PORTB
CLRF PORTC
CLRF PORTD
; A/D
MOVLW B'01000001'
MOVWF ADCON0
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
BSF STATUS, RP0 ;BK1
; A/D PORTA
MOVLW B'00000001'
MOVWF TRISA
; 232C
MOVLW B'00100010'
MOVWF TXSTA
MOVLW D'23' ;3.58MHz/2400BPS
MOVWF SPBRG
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; A/D
MOVLW B'11001110'
MOVWF ADCON1
CLRF TRISB
MOVLW B'10000000'
MOVWF TRISC
MOVLW B'11100000' ;6=SRAM READ->232C OUT/5=MINUP/7=HOURUP
MOVWF TRISD
BCF STATUS, RP0 ;BK0
CLRF PORTC
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; CLOCK
MOVLW D'255'
MOVWF CNT1 ;CALC DATA
CLRF CNT2
CLRF CNT3
CLRF CNT4
CLRF CNT5
CLRF CNT6
CLRF C1 ;PRINT DATA
CLRF C2
CLRF C3
CLRF C4
CLRF C5
CLRF C6
; DATE
CLRF DAY2 ;CALC DATA
MOVLW 1
MOVWF DAY1
MOVWF CNT1
; SRAM
BCF PORTA,2 ; CLR
BSF PORTA,2
BCF PORTA,2
BSF PORTA,3 ; WE
BSF PORTA,4 ; OE
; CRLF(232C)
CALL CRLF
CALL CRLF
CALL CRLF
; DEFAULT TIME SET (8:00:00)
MOVLW 8
MOVWF CNT5
MOVLW 0
MOVWF CNT6
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; MAIN LOOP 10分毎に記録;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
LOOP
CALL SECWAIT
; HOUR UP BUTTON
BTFSC PORTD,7
GOTO LV
; 24:XX:XX -> 00:XX:XX :;;;;;;;;;;;;;;;;;;
INCF CNT5,F
MOVF CNT5,W
SUBLW D'4'
BTFSS STATUS,Z
GOTO LV
MOVF CNT6,W
SUBLW D'2'
BTFSS STATUS,Z
GOTO LV
CLRF CNT5
CLRF CNT6
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
LV
; MIN UP B.T.
BTFSS PORTD,5
INCF CNT3,F
BTFSS PORTD,6 ; SRAM READ B.T. -> 232C OUT
CALL READ
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; A/D START
BSF ADCON0, GO
BTFSC ADCON0, GO
GOTO $-1
;;;;;;;;;;;;;;;;;;;;;;;;;;; HI
MOVF ADRESH,W
MOVWF PRM1B
;;;;;;;;;;;;;;;;;;;;;;;;;;; LO
BSF STATUS,RP0
MOVF ADRESL,W
BCF STATUS,RP0
MOVWF PRM1A
; BIN A/D値 -> DEC変換;;;;;;;;;;;;
movlw SRLC1 ;格納場所初期値
MOVWF 4H ;4H=FSR
CALL DEVIDE ;最下
CALL DEVIDE
CALL DEVIDE
CALL DEVIDE
CALL DEVIDE ;最上位変換
MOVFW PRM3D
ADDLW 30H
MOVWF PRM3D
MOVFW PRM3C
ADDLW 30H
MOVWF PRM3C
MOVFW PRM3B
ADDLW 30H
MOVWF PRM3B
MOVFW PRM3A
ADDLW 30H
MOVWF PRM3A
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; SEC-CNT UP
DEA
INCF CNT1,F
MOVF CNT1,W
SUBLW D'10'
BTFSS STATUS,Z
GOTO A1
CLRF CNT1
INCF CNT2,F
A1
MOVF CNT2,W
SUBLW D'6'
BTFSS STATUS,Z
GOTO A2
CLRF CNT2
INCF CNT3,F
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; MIN
A2
MOVF CNT3,W
SUBLW D'10'
BTFSS STATUS,Z
GOTO A3
CLRF CNT3
INCF CNT4,F
CALL DATAWRITE;;;;;;;;;
A3
MOVF CNT4,W
SUBLW D'6'
BTFSS STATUS,Z
GOTO A5
CLRF CNT4
INCF CNT5,F
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; HOUR
A5
MOVF CNT5,W ; 24:00:00 -> 00:00:00
SUBLW D'0'
BTFSS STATUS,Z
GOTO A6
MOVF CNT6,W ;[2]
SUBLW D'0'
BTFSS STATUS,Z
GOTO A6
CLRF CNT5
CLRF CNT6
GOTO CAL
A6
MOVF CNT5,W
SUBLW D'10'
BTFSS STATUS,Z
GOTO CAL
CLRF CNT5
INCF CNT6,F
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; TIME CAL
CAL
MOVF CNT1,W
ADDLW 30H
MOVWF C1
MOVF CNT2,W
ADDLW 30H
MOVWF C2
MOVF CNT3,W
ADDLW 30H
MOVWF C3
MOVF CNT4,W
ADDLW 30H
MOVWF C4
MOVF CNT5,W
ADDLW 30H
MOVWF C5
MOVF CNT6,W
ADDLW 30H
MOVWF C6
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 00:00:00 CHECK
MOVF CNT1,F
BTFSS STATUS,Z
GOTO DEA2
MOVF CNT2,F
BTFSS STATUS,Z
GOTO DEA2
MOVF CNT3,F
BTFSS STATUS,Z
GOTO DEA2
MOVF CNT4,F
BTFSS STATUS,Z
GOTO DEA2
MOVF CNT5,W
SUBLW 4
BTFSS STATUS,Z
GOTO DEA2
MOVF CNT6,W
SUBLW 2
BTFSS STATUS,Z
GOTO DEA2
CLRF CNT5
CLRF CNT6
INCF DAY1,F
;CALL DATAWRITE
GOTO DET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; XX:00:00 CHECK
DEA2
MOVF CNT1,F
BTFSS STATUS,Z
GOTO DET
MOVF CNT2,F
BTFSS STATUS,Z
GOTO DET
MOVF CNT3,F
BTFSS STATUS,Z
GOTO DET
MOVF CNT4,F
BTFSS STATUS,Z
GOTO DET
;CALL DATAWRITE
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; DATE CAL AND 232C OUTPUT
DET
;DAY
MOVFW DAY2
ADDLW 30H
CALL OUT232C2
MOVFW DAY1
ADDLW 30H
CALL OUT232C2
MOVLW ' '
CALL OUT232C2
;TIME HH
MOVFW CNT6
ADDLW 30H
CALL OUT232C2
;HH
MOVFW CNT5
ADDLW 30H
CALL OUT232C2
MOVLW ':'
CALL OUT232C2
;MM
MOVFW CNT4
ADDLW 30H
CALL OUT232C2
;MM
MOVFW CNT3
ADDLW 30H
CALL OUT232C2
MOVLW ':'
CALL OUT232C2
;SEC
MOVFW CNT2
ADDLW 30H
CALL OUT232C2
;SEC
MOVFW CNT1
ADDLW 30H
CALL OUT232C2
MOVLW ' '
CALL OUT232C2
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; A/D値 -> シリアル;;;;;;;
MOVF PRM3D,w
CALL OUT232C2
MOVF PRM3C,w
CALL OUT232C2
MOVF PRM3B,w
CALL OUT232C2
MOVF PRM3A,w
CALL OUT232C2
CALL CRLF
GOTO LOOP
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SECWAIT
MOVLW D'255'
MOVWF CODEA
T05LP
GOTO T100mS
B1
DECFSZ CODEA,F
GOTO T05LP
RETURN
T100mS
MOVLW D'231' ;
MOVWF CODEB
GOTO $+1
GOTO $+1
GOTO $+1
T100LP
GOTO T04mS
B2 DECFSZ CODEB,F
GOTO T100LP
GOTO B1
T04mS
MOVLW D'2'
MOVWF CODEC
T04LP
DECFSZ CODEC,F
GOTO T04LP
GOTO B2
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 10進数変換;;
DEVIDE ;÷10サブルーチン (10で除算);;;
movlw d'16' ;16ビットくり返し;;;
MOVWF SRLC1
CLRF SRWK1
DEVIDE0
bcf 3h,0 ;キャリフラグのクリア;;;
RLF PRM1A,1
RLF PRM1B,1
RLF SRWK1,1
MOVLW B'11110110'
ADDWF SRWK1,0
BTFSC 3H,0
MOVWF SRWK1
BTFSC 3H,0
INCF PRM1A,1
DECFSZ SRLC1,1
GOTO DEVIDE0
DECF 4H,1 ;4H=FSR
MOVF SRWK1,0
movwf 0h ;余り (0h=indirect)
RETURN
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
BIN2HEX
ANDLW 0FH ; Wregの下位4ビットを取り出す;;;
BSF STATUS,RP1
BCF STATUS,RP0
MOVWF EEADR
BSF STATUS,RP0
BCF EECON1,EEPGD
BSF EECON1,RD
BCF STATUS,RP0
MOVF EEDATA,W ; 16進表現文字をセット;;;
BCF STATUS,RP1
RETURN
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; SRAM READ -> 232C (CSV FORMAT)
READ
CALL SECWAIT
CALL CRLF
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
BSF STATUS, RP0 ;BK1
MOVLW B'00001111'
MOVWF TRISB
BCF STATUS, RP0 ;BK0
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
BCF PORTA,2 ;CLR
BSF PORTA,2
BCF PORTA,2
BSF PORTA,3 ;WE
BCF PORTA,4 ;OE
READLOOP
BTFSS PORTD,6 ; SRAM ReREAD -> 232C OUT
GOTO READ
;DAY
MOVLW '"'
CALL OUT232C2
CALL OUT232C
CALL OUT232C
MOVLW '"'
CALL OUT232C2
MOVLW ','
CALL OUT232C2
;HH
MOVLW '"'
CALL OUT232C2
CALL OUT232C
CALL OUT232C
MOVLW '"'
CALL OUT232C2
MOVLW ','
CALL OUT232C2
;DATA
MOVLW '"'
CALL OUT232C2
CALL OUT232C
CALL OUT232C
CALL OUT232C
CALL OUT232C
MOVLW '"'
CALL OUT232C2
;;;;;;;;;;;;;;;;;;;;;;;;;;
CALL CRLF
GOTO READLOOP
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
OUT232C ; SRAM -> BIN2HEX -> 232C
MOVF PORTB,W
CALL BIN2HEX
BTFSS PIR1, TXIF
GOTO $-1
MOVWF TXREG
BCF PORTA,1 ; CLK
BSF PORTA,1
BCF PORTA,1
RETURN
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
OUT232C2 ;W Reg -> 232C
BTFSS PIR1, TXIF
GOTO $-1
MOVWF TXREG
RETURN
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
CRLF
MOVLW '\R'
CALL OUT232C2
MOVLW '\N'
CALL OUT232C2
RETURN
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; SRAM WRITE AND CNT-UP. WReg -> SRAM
WRITE
MOVWF PORTB
BSF PORTA,3
BCF PORTA,3 ; WE
BSF PORTA,3
BCF PORTA,3
BCF PORTA,1
BSF PORTA,1 ;CLK
BCF PORTA,1
RETURN
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; SRAM WRITE. [DAY][HOUR][A/D] -> SRAM
DATAWRITE
; DAY (DD)
MOVF DAY2,W
CALL WRITE
MOVF DAY1,W
CALL WRITE
; TIME (HH)
MOVF CNT6,F ; 0 0A -> 10
BTFSS STATUS,Z
GOTO S44
MOVF CNT5,W ;A
SUBLW 0AH
BTFSS STATUS,Z
GOTO S44
MOVLW 1
MOVWF PORTB
CALL WRITE
MOVLW 0
MOVWF PORTB
CALL WRITE
GOTO S1
S44
MOVF CNT6,W ;1 1A -> 20
SUBLW 1
BTFSS STATUS,Z
GOTO NOMAL
MOVF CNT5,W ;A
SUBLW 0AH
BTFSS STATUS,Z
GOTO NOMAL
MOVLW 2
MOVWF PORTB
CALL WRITE
MOVLW 0
MOVWF PORTB
CALL WRITE
GOTO S1
NOMAL
; TIME (HH) ;ex 24:XX:XX -> 00:XX:XX
MOVF CNT6,W
SUBLW 2
BTFSS STATUS,Z
GOTO NOMAL2
MOVF CNT5,W
SUBLW 4
BTFSS STATUS,Z
GOTO NOMAL2
MOVLW 0
MOVWF PORTB
CALL WRITE
MOVLW 0
MOVWF PORTB
CALL WRITE
GOTO S1
NOMAL2
MOVF CNT6,W;
MOVWF PORTB
CALL WRITE
MOVF CNT5,W;
MOVWF PORTB
CALL WRITE
S1
; A/D (XXXX) Ex D'1023' (3FFH)
MOVF PRM3D,W ;1
MOVWF PORTB
CALL WRITE
MOVF PRM3C,W ;0
MOVWF PORTB
CALL WRITE
MOVF PRM3B,W ;2
MOVWF PORTB
CALL WRITE
MOVF PRM3A,W ;3
MOVWF PORTB
CALL WRITE
RETURN
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
END