Лабораторная работа 6 / mps_lab6
.docСанкт-Петербургский государственный электротехнический университет
Кафедра ВТ
Микропроцессорные системы
Отчет по лабораторной работе №6
Вариант 1
Выполнили: Попов А.
Таранюк М.
Гр.2372
Проверила: Головина Л.К.
Санкт-Петербург
2006
Описание работы
Из описания АЦП выяснили, что для его программного запуска требуется поместить в регистр ADCON1 45h (#04h – для включения АЦП, #40h – для разрешения прерывания по выполнению преобразования, #01h – для старта преобразования). Также необходимо разрешить прерывания от АЦП, что делается установкой соответствующего бита. В регистр ADINS записываем #0F0h для разрешения преобразования по всем каналам.
В программе обработчике прерывания от АЦП нужно сбрасывать флаг прерывания о выполнении преобразования (т.е. в начале приходит прерывание о выполнении – подсчитан результат по 1-му каналу, нам нужно сбросить флаг и ждать нового прерывания, которое будет сигнализировать о том, что подсчитано значение по следующему каналу). При получении 4-го прерывания (что означает, что по всем каналам преобразование выполнено), необходимо сбросить флаг старта преобразования.
При старте от переполнения таймера необходимо лишь вместо записи в ADCON1 старта преобразования записать #20h – для старта от переполнения от таймера.
Более понятно процесс работы АЦП можно уяснить из кода программы, который специально для этого снабжен комментариями.
Коды программ
Пункт1 – программный старт АЦП
$NOMOD51
#include <reg935.h>
Blinking SEGMENT CODE ; segment declaration
; defines a segment with the name 'Blinking' and the memory class CODE
RSEG Blinking ; switch to this code segment
JMP punkt1
org 073h
mov a,r0
subb a,#01h
jz finish
mov r0,a
mov a,ADCON1
subb a,#08h // clear flag of interrupt
mov ADCON1,a
jmp next
finish:
mov a,ADCON1
subb a,#09h // clear flag of interrupt and clear Immediate Start
mov ADCON1,a
next:
reti
ORG 0Bh ; 0BH is address for Timer 0 interrupt
PUSH PSW
PUSH ACC
POP ACC
POP PSW
RETI
punkt1:
MOV P2M1, #00h ; configure Port 2 as Quasi-bidirectional
SETB EA ; enable all interrupts
setb EAD // enable ADC interrupt
mov ADINS,#0F0h //enable all chanels
mov a,#04h // enable ADC
add a,#40h // enable interrupt from ADC when complete
add a,#01h // to immediate start
mov ADCON1,a
mov r0,#04h
jmp forever
forever:
JMP forever
END
Пункт 2 – старт по переполнению от таймера
$NOMOD51
#include <reg935.h>
Blinking SEGMENT CODE ; segment declaration
; defines a segment with the name 'Blinking' and the memory class CODE
RSEG Blinking ; switch to this code segment
JMP punkt2
org 073h
mov a,r0
subb a,#01h
jz finish
mov r0,a
mov a,ADCON1
subb a,#08h // clear flag of interrupt
mov ADCON1,a
jmp next
finish:
mov a,ADCON1
subb a,#28h // clear flag of interrupt and clear Timer Start
mov ADCON1,a
clr TR0
next:
reti
ORG 0Bh ; 0BH is address for Timer 0 interrupt
PUSH PSW
PUSH ACC
POP ACC
POP PSW
RETI
punkt2:
MOV P2M1, #00h ; configure Port 2 as Quasi-bidirectional
MOV TMOD, #01h ; configure Timer 0 in mode 1 (16-bit timer)
; programming interrupt logic
SETB EA ; enable all interrupts
SETB ET0 ; enable interrupt request from T/C0
SETB TR0 ; run Timer
setb EAD // enable ADC interrupts
mov ADINS,#0F0h //enable all chanels
mov a,#04h // enable ADC
add a,#40h // enable interrupt from ADC when complete
add a,#20h // to timer overflow start
mov ADCON1,a
mov r0,#04h
jmp forever
forever:
JMP forever
END