forked from magkopian/pic-asm-wattage-meter
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathWATTAGE_METER.asm
385 lines (283 loc) · 6.85 KB
/
WATTAGE_METER.asm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Copyright (c) 2013 Manolis Agkopian and Yiannis Chaldeos ;
;See the file LICENCE for copying permission. ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;; WATTAGE METER VERSION 1.0 ;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
PROCESSOR '16F876A'
INCLUDE <P16F876A.INC>
__CONFIG _XT_OSC & _WDT_OFF & _PWRTE_OFF & _CP_OFF & _LVP_OFF & _BODEN_OFF
CBLOCK 0x20
;DIVISION VARIABLES
NUMERATOR:4 ;USE 4 BYTES WITH SAME LABEL (0x20, 0x21, 0x22, 0x23)
REMAINDER ;THE REMAINDER (0x24)
LCNT ;LOOP COUNTER (0x25)
;CONVERTION VARIABLES
CONVL ;CONVERTION CONSTANT LOW BYTE (0x26)
CONVH ;CONVERTION CONSTANT HIGH BYTE (0x27)
CONVRESL ;TEMP VAR FOR ADRESL (0x28)
CONVRESH ;TEMP VAR FOR ADRESH (0x29)
V0 ;CONV TO VOLTS RES BYTE 0 (0x2A)
V1 ;CONV TO VOLTS RES BYTE 1 (0x2B)
V2 ;CONV TO VOLTS RES BYTE 2 (0x2C)
V3 ;CONV TO VOLTS RES BYTE 2 (0x2D)
;RESULT
V_ASCII_0 ;00,001 V (0x2E)
V_ASCII_1 ;00,010 V (0x2F)
V_ASCII_2 ;00,100 V (0x30)
V_ASCII_3 ;01,000 V (0x31)
V_ASCII_4 ;10,000 V (0x31)
;GENERAL USE REGISTERS
CNT0 ;(0x32)
CNT1 ;(0x33)
CNT2 ;(0x34)
TMP ;(0x35)
ANIN1L ;(0x36)
ANIN1H ;(0x37)
ANIN2L ;(0x38)
ANIN2H ;(0x39)
CCL ;(0x3A)
CCH ;(0x3B)
INPUT_PIN ;(0x3C)
VOLTAGE:2 ;(0x3D)
CURRENT:2 ;(0x3E)
ZERO_INDICATOR ;(0x3F) (IF BIT0 IS SET, VOLTAGE IS ZERO. IF BIT1 IS SET, CURRENT IS ZERO)
SIGN ;(0x40)
ENDC
;CONVERTION CONSTANTS
CCLV EQU 0x18 ;VOLTAGE CONVERTION CONSTANT LOW BYTE
CCHV EQU 0x13 ;VOLTAGE CONVERTION CONSTANT HIGH BYTE (4888) (AN2)
CCLA0 EQU 0x55 ;AMPS CONVERTION CONSTANT LOW BYTE
CCHA0 EQU 0x10 ;AMPS CONVERTION CONSTANT HIGH BYTE (4181) (AN0)
CCLA1 EQU 0xEC ;AMPS CONVERTION CONSTANT LOW BYTE
CCHA1 EQU 0x13 ;AMPS CONVERTION CONSTANT HIGH BYTE (5100) (AN1)
V EQU 0 ;ZERO_INDICATOR FLAG FOR VOLTAGE
A EQU 1 ;ZERO_INDICATOR FLAG FOR AMPS
MODE_BTN EQU 4 ;BIT 4, PORT A
;ANALOG CHANNELS
HALL0_IN EQU B'01000001' ;ADCON0 TO SET ANALOG CHANNEL 0
HALL1_IN EQU B'01001001' ;ADCON0 TO SET ANALOG CHANNEL 1
VOLTAGE_IN EQU B'01010001' ;ADCON0 TO SET ANALOG CHANNEL 2
ORG 0x000
GOTO INIT ;INCLUDE THE LCD DRIVER, AND OTHER FILES AND GOTO INIT ROUTINE
INCLUDE <LCD_DRIVER.INC>
INCLUDE <ADC.INC>
INCLUDE <ANALOG_PROC.INC>
INIT:
CALL LCD_INIT ;FIRST OF ALL WE HAVE TO INITIALIZE LCD (IT ALSO SETS PORTB AS OUTPUT, FOR MORE INFO CHECK THE .INC FILES)
BSF STATUS, 5 ;SELECT BANK 01
;PORTA IS SET TO INPUT MODE
MOVLW B'11111111'
MOVWF TRISA
BCF STATUS, 5 ;SELECT BANK 00
MAIN:
CLRF ZERO_INDICATOR
MOVLW ' '
MOVWF SIGN
BTFSC PORTA, MODE_BTN ;CHECK IF INIT MODE BUTTON HAVE BEEN PRESSED
CALL INIT_MODE
;;;START OF VOLTS READING;;;
MOVLW VOLTAGE_IN ;ANALOG CHANNEL 2
CALL ADC_INIT ;INIT ADC MODULE
CALL ADC_READ ;READ ANALOG VALUE AND STORE TO CONVRES REGISTER
;CHECK IF CONVRES IS ZERO
MOVF CONVRESL, W
IORLW 0x00
BTFSS STATUS, Z
GOTO CONTINUE_0 ;IF NOT ZERO
MOVF CONVRESH, W
IORLW 0x00
BTFSS STATUS, Z
GOTO CONTINUE_0 ;IF NOT ZERO
BSF ZERO_INDICATOR, V
CALL CLRDIGITS ;ELSE
GOTO OUTPUT
CONTINUE_0:
CALL CONVERT_VOLTAGE_TO_ASCII
OUTPUT:
MOVF V_ASCII_3, W
CALL LCD_CHAR
MOVLW '.'
CALL LCD_CHAR
MOVF V_ASCII_2, W
CALL LCD_CHAR
MOVF V_ASCII_1, W
CALL LCD_CHAR
MOVF V_ASCII_0, W
CALL LCD_CHAR
MOVLW 'V'
CALL LCD_CHAR
MOVLW 0x20
CALL LCD_CHAR
;;;END OF VOLTS READING;;;
;;;START OF AMPS READING;;;
;READ THE ANALOG PIN HALL0_IN
MOVLW HALL0_IN ;SET ANALOG CHANNEL 0
CALL ADC_INIT ;INIT ADC MODULE
CALL ADC_READ ;READ ANALOG VALUE AND STORE TO CONVRES REGISTER
MOVF CONVRESL, W
MOVWF ANIN1L
MOVF CONVRESH, W
MOVWF ANIN1H
;READ THE ANALOG PIN HALL1_IN
MOVLW HALL1_IN ;SET ANALOG CHANNEL 1
CALL ADC_INIT ;INIT ADC MODULE
CALL ADC_READ ;READ ANALOG VALUE AND STORE TO CONVRES REGISTER
;CHECK IF BOTH READINGS ARE ZERO
MOVF CONVRESL, W
MOVWF ANIN2L
MOVF CONVRESH, W
MOVWF ANIN2H
MOVF ANIN1L, W
IORLW 0x00
BTFSS STATUS, Z
GOTO CONTINUE_1 ;IF NOT ZERO
MOVF ANIN1H, W
IORLW 0x00
BTFSS STATUS, Z
GOTO CONTINUE_1 ;IF NOT ZERO
MOVF ANIN2L, W
IORLW 0x00
BTFSS STATUS, Z
GOTO CONTINUE_1 ;IF NOT ZERO
MOVF ANIN2H, W
IORLW 0x00
BTFSS STATUS, Z
GOTO CONTINUE_1 ;IF NOT ZERO
BSF ZERO_INDICATOR, A
CALL CLRDIGITS ;ELSE
GOTO OUTPUT_1
CONTINUE_1:
CALL CONVERT_AMPS_TO_ASCII ;CONVERT AMPS TO ASCII
OUTPUT_1:
MOVLW 0x20
CALL LCD_CHAR
MOVF SIGN, W
CALL LCD_CHAR
MOVF V_ASCII_3, W
CALL LCD_CHAR
MOVLW '.'
CALL LCD_CHAR
MOVF V_ASCII_2, W
CALL LCD_CHAR
MOVF V_ASCII_1, W
CALL LCD_CHAR
MOVF V_ASCII_0, W
CALL LCD_CHAR
MOVLW 'A'
CALL LCD_CHAR
;;;WATTAGE CALCULATION;;;
BTFSC ZERO_INDICATOR, V
GOTO CONTINUE_22
BTFSC ZERO_INDICATOR, A
GOTO CONTINUE_22
CONTINUE_3:
CALL CALC_WATTAGE
GOTO OUTPUT_2
CONTINUE_22:
CALL CLRDIGITS ;ELSE
OUTPUT_2:
CALL LCD_L2
MOVF V_ASCII_4, W
CALL LCD_CHAR
MOVF V_ASCII_3, W
CALL LCD_CHAR
MOVLW '.'
CALL LCD_CHAR
MOVF V_ASCII_2, W
CALL LCD_CHAR
MOVF V_ASCII_1, W
CALL LCD_CHAR
MOVF V_ASCII_0, W
CALL LCD_CHAR
MOVLW 'W'
CALL LCD_CHAR
CALL LCD_L1
GOTO MAIN
;
;CLEAR LCD DIGITS
;
CLRDIGITS:
MOVLW 0x30
MOVWF V_ASCII_0
MOVWF V_ASCII_1
MOVWF V_ASCII_2
MOVWF V_ASCII_3
MOVWF V_ASCII_4
RETURN
;
;INIT MODE
;
INIT_MODE:
CALL LCD_CLR ;CLEAR DISPLAY
CALL LCD_L1 ;GOTO START OF ROW
INIT_MODE_0:
CLRF NUMERATOR + 0
CLRF NUMERATOR + 1
CLRF NUMERATOR + 2
;READ THE ANALOG PIN HALL0_IN
MOVLW HALL0_IN ;SET ANALOG CHANNEL 0
CALL ADC_INIT ;INIT ADC MODULE
CALL ADC_READ ;READ ANALOG VALUE AND STORE TO CONVRES REGISTER
MOVF CONVRESL, W
MOVWF ANIN1L
MOVF CONVRESH, W
MOVWF ANIN1H
;READ THE ANALOG PIN HALL1_IN
MOVLW HALL1_IN ;SET ANALOG CHANNEL 1
CALL ADC_INIT ;INIT ADC MODULE
CALL ADC_READ ;READ ANALOG VALUE AND STORE TO CONVRES REGISTER
MOVF CONVRESL, W
MOVWF ANIN2L
MOVF CONVRESH, W
MOVWF ANIN2H
;SUB THE HIGH BYTES OF 2 READINGS
MOVF ANIN1L, W
SUBWF ANIN2L, W
MOVWF NUMERATOR + 0
BTFSS STATUS, C
DECF ANIN2H
;SUB THE LOW BYTES
MOVF ANIN1H, W
SUBWF ANIN2H, W
MOVWF NUMERATOR + 1
;IF THE SUBTRUCTOR IS > THAN THE SUBTRACTIVE
;FIRST WE CHECK THE HIGH BYTE
MOVF ANIN1H, W
SUBWF ANIN2H, W
BTFSS STATUS, C
GOTO COMH
;AND IF FALSE, THEN WE CHECK AND THE LOW BYTE
MOVF ANIN1L, W
SUBWF ANIN2L, W
BTFSS STATUS, C
GOTO COML
GOTO NOCOM
;THEN WE HAVE TO TAKE THE COMPLEMENT, BECAUSE WE NEED AN ABSOLUTE VALUE AND NOT A NEGATIVE NUM
COML:
COMF NUMERATOR + 0, F
COMH:
COMF NUMERATOR + 1, F
INCF NUMERATOR + 0
;IF WE DONT HAVE A NEGATIVE CONVERT TO ASCII AND OUTPUT TO THE LCD
NOCOM:
MOVLW B'00000011'
ANDWF NUMERATOR + 1, F
CALL CONVERT2ASCII
INIT_OUTPUT:
MOVF V_ASCII_4, W
CALL LCD_CHAR
MOVF V_ASCII_3, W
CALL LCD_CHAR
MOVF V_ASCII_2, W
CALL LCD_CHAR
MOVF V_ASCII_1, W
CALL LCD_CHAR
MOVF V_ASCII_0, W
CALL LCD_CHAR
CALL LCD_L1
BTFSC PORTA, MODE_BTN
GOTO INIT_MODE_0
RETURN
END