list 16f877a Include file change directory if needed include p16f877a

  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
list p=16f877a
; Include file, change directory if needed
#include "p16f877a.inc"
org 0x000
nop
goto main
main
adc1 EQU 0x73
adc2 EQU 0x74
adc3 EQU 0x75
adc4 EQU 0x76
buff EQU 0x77
buff2 EQU 0x78
buff3 EQU 0x79 ;ИЗМЕНЕНИЯ!!!!!(создали доп переменную)
BANKSEL TRISB
CLRF TRISB
nop
;main
;Настройка АЦП
;Настройка модуля АЦП
BANKSEL TRISB
CLRF TRISB
loop1 ;Установка выводов в режим аналоговых входов:
BANKSEL ADCON1
bcf ADCON1, PCFG3
bcf ADCON1, PCFG2
bcf ADCON1, PCFG1
bcf ADCON1, PCFG0
;Регистры ADCON1, TRISA, TRISE отвечают за настройку выводов АЦП, в режиме аналоговых входов
;должны быть настроены как входы
; BANKSEL TRISA
; bsf TRISA, 2
; BANKSEL TRISE
; bsf TRISE, 2
;Формат сохранения 10-разрядного результата
bcf ADCON1, ADFM ;выравнивание по левому краю
;Выбор входного канала АЦП: (000 - RA0/AN0)
BANKSEL ADCON0
bcf ADCON0, CHS2
bcf ADCON0, CHS1
bcf ADCON0, CHS0
;Выбор источника тактового импульса: (10 - Fosc/32)
bsf ADCON0, ADCS1
bcf ADCON0, ADCS0
;Включение модуля АЦП
bsf ADCON0, ADON
;Прерывание не используется
;Выдержка паузы, необходимой для зарядки конденсатора С_hold
cd call MKS
;Начало АЦП1
BANKSEL ADCON0
bsf ADCON0, 2
;Ожидание окончания преобразования - бит "ADCON0, 2" будет сброшен в 0
m1 BTFSC ADCON0, 2 ;конец преобразования в АЦП, результат уже в ADRESH
goto m1
BANKSEL ADRESH
MOVF ADRESH, 0
MOVWF adc1
bcf ADCON0, ADON
;второй АЦП
;Настройка модуля АЦП
BANKSEL TRISB
CLRF TRISB
;Установка выводов в режим аналоговых входов:
BANKSEL ADCON1
bcf ADCON1, PCFG3
bcf ADCON1, PCFG2
bcf ADCON1, PCFG1
bcf ADCON1, PCFG0
;Регистры ADCON1, TRISA, TRISE отвечают за настройку выводов АЦП, в режиме аналоговых входов
;должны быть настроены как входы
; BANKSEL TRISA
; bsf TRISA, 2
; BANKSEL TRISE
; bsf TRISE, 2
;Формат сохранения 10-разрядного результата
bcf ADCON1, ADFM ;выравнивание по левому краю
;Выбор входного канала АЦП: (000 - RA0/AN0)
BANKSEL ADCON0
bcf ADCON0, CHS2
bcf ADCON0, CHS1
bsf ADCON0, CHS0
;Выбор источника тактового импульса: (10 - Fosc/32)
bsf ADCON0, ADCS1
bcf ADCON0, ADCS0
;Включение модуля АЦП
bsf ADCON0, ADON
;Прерывание не используется
;Выдержка паузы, необходимой для зарядки конденсатора С_hold
cd2 call MKS
loop3
;Начало АЦП1
BANKSEL ADCON0
bsf ADCON0, 2
;Ожидание окончания преобразования - бит "ADCON0, 2" будет сброшен в 0
m2 BTFSC ADCON0, 2 ;конец преобразования в АЦП, результат уже в ADRESH
goto m2
BANKSEL ADRESH
MOVF ADRESH, 0
MOVWF adc2
;второй АЦП
; rlf adc2,1
; rlf adc2,1
bcf ADCON0, ADON
; MOVWF adc2
; ADDWF adc1,0
MOVF adc2, 0
SUBWF adc1, 0
MOVWF buff3
BANKSEL TRISC
bcf TRISC,2 ;настройка ССР1 как выхода
BTFSC STATUS, 0 ;смотрим знак результата вычитания (проверяем отрицательность)
bsf TRISC,1 ;выполняется если результат разности отрицательный
BTFSS STATUS, 0 ;смотрим знак результата вычитания (проверяем положительность)
bcf TRISC,1 ;выполняется если результат разности положительный
BANKSEL PR2
movlw 0x80;1 Hz
;movlw 0x1F;5Hz
movwf PR2 ;установка периода ШИМ
;ИЗМЕНЕНИЯ!!!!!
; BANKSEL ADRESH
; MOVF ADRESH, 0
; SUBLW 0x6f ; вычитаем из нулевого значения значения с АЦП 0x6f - ADRESH
; MOVWF buff2 ;записываем значение разности в переменную
;MOVF adc1, 0
BANKSEL CCPR1L
;MOVLW ADRESH
MOVF buff3, w ;записываем разность в "w"
BTFSS STATUS, 0 ;смотрим знак результата вычитания (проверяем отрицательность)
SUBLW 0x0 ;отрицательный результат вычитаем из нуля, для избежания переполнения
MOVWF buff3
rlf buff3,1
rlf buff3,1
rlf buff3,1
MOVF buff3, w
MOVWF CCPR1L
;ИЗМЕНЕНИЯ!!!!!
; BANKSEL CCP1CON
; bcf CCP1CON,4
; bcf CCP1CON,5
BANKSEL T2CON
bcf T2CON,1
bsf T2CON,0 ;настройка предделителя 1/4
bsf T2CON,2
BANKSEL CCP1CON ;включение ССР1 в режиме ШИМ
bsf CCP1CON,2
bsf CCP1CON,3
;Считывание результата преобразования из регистров ADRESH:ADRESL
BANKSEL ADRESH
MOVF ADRESH, 0
MOVWF adc1 ;установка старших бит результата из АЦП в свободную переменную adc1
BANKSEL ADRESL
MOVF ADRESL, 0
MOVWF adc2 ;установка младших бит результата из АЦП в свободную переменную adc2
movf ADRESH, 0
BANKSEL PORTB
; movwf PORTB
; rrf adc1,f ; сдвиг вправо на разряд результата АЦП
; rrf adc1,f
; movf adc1,w
; movwf PORTB
goto loop1
MKS
movlw 0x23
movwf 0x71
loop2
decfsz 0x71,1
goto loop2
nop
return
end