![]() Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву ![]() Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
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; просмотров: 306; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.145.178.65 (0.009 с.) |