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