Скачиваний:
20
Добавлен:
01.05.2014
Размер:
39.42 Кб
Скачать

Санкт-Петербургский государственный электротехнический университет

Кафедра ВТ

Микропроцессорные системы

Отчет по лабораторной работе №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

3

Соседние файлы в папке Лабораторная работа 6