1
0

[ハード] アナログデータロガー (16F877A,温度計測)

Last updated at Posted at 2023-11-19

1.概要

・アメダス等、自動的に計測してデータを記録する仕組みに興味があり作ってみました。
・定期的に気温をSRAMに保存してシリアル経由でPCにデータを取り込みEXCELのグラフ機能を利用して可視化してます。

2.回路図

新しいビットマップ イメージ.jpg

3.ブレッドボードに組み込み

P1170312.JPG

・10分間隔で気温をSRAMに格納。データ出力ボタンでCSVで出力。100日は記録できる計算。
・SRAMなので電源切れるとデータも消えます。

MONI.JPG
・モニタ中の画面。

GRA.JPG
・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
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0