Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Rjmp RESET ;В начало программы

Поиск

Org ACIaddr

rjmp ANA_COMP;В подпрограмму обработки прерывания от AC

;******** Подпрограмма обработки прерывания от AC*********************

;* Эта подпрограмма увеличивает содержимое 16–ти разрядного счетчика

;* всякий раз когда возникает прерывание по аналоговому компаратору

;*******************************************************************

.def ac_tmp =r0;временный регистр хранения для SREG

ANA_COMP:

in ac_tmp,SREG;запоминание SREG

Subi cntL,low(–1)

sbci cntH,high(–1);инкремент 16–ти разрядного счетчика cnt(H,L)=cnt(H,L)–(–1)

out SREG,ac_tmp;восстановление SREG

Reti; возврат из прерываний

;******************* Основная программа *****************************

RESET:

;***** Инициализация стека

Ldi temp,low(RAMEND)

Out SPL,temp

Ldi temp,high(RAMEND)

Out SPH,temp

;***************** «ожидание_edge1»

;* Эта часть осуществляет ожидание (задержку) пока выход компаратора

;* (ACO–bit в ACSR) не станет равным 1.

;* extremely short pulses can be missed, since the program runs three clock

;* cycles between each time the comparator is checked. Another disadvantage

;* is that the program has to wait for the output to be come negative first,

;* in case the output is positive when polling starts.

;* Number of words:4

;* Number of cycles:4 per loop. Response time: 3 – 5 clock cycles

;* Low registers used:None

;* High registers used:None

wait_edge1:

Sbic ACSR,ACO;if output is high

rjmp wait_edge1; wait

we1_1:

Sbis ACSR,ACO;if output is low

rjmp we1_1; wait

;********************* «ожидание_edge2» **************************

;* This piece of code waits until the output of the comparator (the ACO–bit

;* in ACSR) goes high. This is a more secure solution, since the interrupt

;* flag is polled. This allows the user to insert code within the wait loop

;* because hardware «remembers» pulses of shorter duration than the polling

;* interval. Another positive feature is that there is no need to wait for

;* a preceeding negative edge.

;* Number of words:5

;* Number of cycles:Inital setup:2

;* Flag clearing:1

;* Loop:4

;* Response time:3 – 5

;* Low registers used:None

;* High registers used:None

wait_edge2:

;***** Инициализация режима прерывания, при пуске (reset) ACIE = 0

Sbi ACSR,ACIS0

Sbi ACSR,ACIS1;установка режима прерывания с 0 в 1

;***** Ожидание

Sbi ACSR,ACI;запись «1» в ACI

we2_1:

Sbis ACSR,ACI;if ACI is low

rjmp we2_1

;****************** «ana_init» ****************************************

;* This code segment enables Analog Comparator Interrupt on output toggle.

;* The program then enters an infinite loop.

;* The 16–bit counter is cleared prior to enabling the interrupt.

;* Performance figures apply to interrupt initialization only.

;* Number of words:4

;* Number of cycles:5

;* Low registers used:None

;* High registers used:1 (temp)

;*********************************************************************

ana_init:

;***** Обнуление 16–ти разрядного счетчика

Clr cntL

Clr cntH

;***** Установка прерываний, т. к. ACIE = 0 после пуска

ldi temp,(ACI<<1);очистить флаг прерываний и ACIS1/ACIS0...

out ACSR,temp;...выбрать прерывание при люб. измен. сиг–ла на вых. комп–ра

Sei; разрешить глобальные прерывания

Sbi ACSR,ACIE;разрешение прерывания от AC

Forever:rjmp forever

Порядок выполнения лабораторной работы

 

Нужно выполнить все необходимые операции с проектом Lab_7.prj и программой Lab7.asm в среде VMLab.

 

Содержание отчета

 

Отчет по проделанной лабораторной работе должен содержать:

- структурную схему алгоритма программы на лабораторную работу;

- схему электрическую принципиальную разработанного устройства;

- текст программы на языке ассемблера (распечатка файла *asm);

- распечатка файла проекта (*.prj);

- результаты моделирования (окно VMLab с запущенной программой и результатами вычислений).

Контрольные вопросы

 

1. Входные сигналы аналогового компаратора микроконтроллера ATmega16.

2. Управление компаратором микроконтроллера ATmega16.

3. Задание режима прерывания микроконтроллера ATmega16.

4. Источники входных сигналов аналогового компаратора в микроконтроллере ATmega16.

5. Разрешение входа захвата таймером AC в микроконтроллере ATmega16.

6. Бит разрешения прерывания в AC микроконтроллера AVR ATmega16.

7. Флаг прерывания в AC микроконтроллера ATmega16.

8. Бит выхода аналогового компаратора микроконтроллера ATmega16.

9. Бит выбора эталона аналогового компаратора микроконтроллера ATmega16.

10. Бит отключения аналогового компаратора микроконтроллера ATmega16.

 


Лабораторная работа № 8

 

ПРОГРАММирование микроконтроллеров

НА ЯЗЫКЕ СИ

 

Цель работы: Изучение и освоение методики программирования микроконтроллеров на языке СИ.

 

Задание к лабораторной работе

Изучить программу Lab8.c и файл проекта Lab_8.prj. Отладить программу в среде VMLab, подключив необходимую периферию к микроконтроллеру AVR – интерфейс UART. Программа вводит через устройство UART целое число, извле­кает корень квадратный, вычитает 23 и выводит результат через устройство UART. На рис 31 представлены результаты моделирования программы на языке СИ.

 

 

 

Рис. 31. Результаты моделирования программы на языке СИ

 

Файл Lаb_8.prj

.MICRO "ATmega16"

.TOOLCHAIN "GENERIC"

.TARGET "lab8.hex"

.COFF "lab8.cof"

.SOURCE "lab8.c"

.TRACE; Activate micro trace

.POWER VDD=5 VSS=0; Power nodes

.CLOCK 8meg; Micro clock

.STORE 250m; Trace (micro+signals) storage time

X1 TTY(19200 8 0 0 1 2) PD0 PD1; Place an interactive TTY cell.

.PLOT V(PD0) V(PD1)

 

Файл Lab8.с

#include <avr/io.h>

#include <avr/interrupt.h>

#include <avr/signal.h>

#include <avr/pgmspace.h>

#include <stdio.h>

#include <math.h>

#define TBUFSIZE 32

#define RBUFSIZE 32

#define TMASK (TBUFSIZE–1)

#define RMASK (RBUFSIZE–1)

// Static variables

unsigned char tbuf[TBUFSIZE]; // TX buffer

unsigned char rbuf[RBUFSIZE]; // RX buffer

unsigned char t_in; // TX buffer in index

unsigned char t_out; // TX buffer out index

unsigned char r_in; // RX buffer in index

unsigned char r_out; // RX buffer out index

SIGNAL(SIG_UART_RECV) {

//завершение приема

char c;

c = UDR;

rbuf[r_in] = c;

r_in++;

}

SIGNAL(SIG_UART_DATA) {

//завершение передачи

if(t_in!= t_out) {

UDR = tbuf[t_out & TMASK];

t_out++;

}

else {

UCSRB &= ~(1<<UDRIE);

}

}

char tbuflen(void) {

// Retrieve pending chars in TX buffer

return(t_in – t_out);

}

int UART_putchar(char c) {

// Fills the transmit buffer, if it is full wait

while((TBUFSIZE – tbuflen()) <= 2); // Wait...

// Add data to the transmit buffer, enable TXCIE

tbuf[t_in & TMASK] = c;

t_in++;

UCSRB |= (1<<UDRIE); // Enable UDR empty interrupt

return(0);

}

char rbuflen(void) {

// Retrive pending chars in RX buffer

return(r_in – r_out);

}

int UART_getchar(void) {

// Retieves character from UART. This function is to be passed

// to fdevopen

unsigned char c;

while(rbuflen() == 0); // Wait...

c = rbuf[r_out & RMASK];

r_out++;

return(c);

}

void UART_first_init(void) {

UBRRL = 25;

UCSRB = (1<<RXCIE)|(1<<TXEN)|(1<<RXEN);

fdevopen(UART_putchar, UART_getchar, 0);

sei();

}

int main(void) {

char s[10];

int y,x;

char r[10];

UART_first_init(); // First init UART

for(;;) {

puts("Input and press ENTER");

while(scanf("%s",s) == 0);

x=atoi(s);

y=sqrt(x)–23;

itoa(y,r,10);

puts(r);

}

}



Поделиться:


Последнее изменение этой страницы: 2016-08-12; просмотров: 303; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.190.176.176 (0.006 с.)