Гребнев В.В. - Микроконтроллеры семейства AVR фирмы Atmel, страница 26
Описание файла
DJVU-файл из архива "Гребнев В.В. - Микроконтроллеры семейства AVR фирмы Atmel", который расположен в категории "". Всё это находится в предмете "цифровая обработка сигналов (цос)" из 8 семестр, которые можно найти в файловом архиве МГТУ им. Н.Э.Баумана. Не смотря на прямую связь этого архива с МГТУ им. Н.Э.Баумана, его также можно найти и в других разделах. Архив можно найти в разделе "книги и методические указания", в предмете "цифровая обработка сигналов" в общих файлах.
Просмотр DJVU-файла онлайн
Распознанный текст из DJVU-файла, 26 - страница
ЯРО.авгп показывает, как при передаче данных в последовательный канал освободить процессор от необходимости опроса флага готовности, используя прерывание по готовности передатчика и промежуточный кольцевой буфер НЕО (Г1гяг 1п — Его Оиг). Драйвер последовательного канала на передачу теперь содержит две подпрограммы: "МоувВпГ и "Тгапв1п1" (рис.
П10,1.). Рпс. П10.1. Организация программ для передачи данных в последовательный канал с использованием кольцевого буфера Кольцевой буфер УАКТ ОПТ организуется во внутренней оперативной памяти АЧК (рис. П10.2.). В памяти также отводится место ге1 1прот;1п тешр, РРЯ оцт рогтЬ, тешр гет ;В противно~ случае вывести содеожимое вег1а1 в ;ОАЯТ :Выйти из подпрограммы :Если флаг ЯХС в РВЯ сброшен.
т.е. в приемнике :нет новых байт, то пропустить следующую команду, : В противном случае перейти к считыванию байта :из приемника : Выйти из подпрограммы. : Считать байт из приемника :и вывести его в порт В Примеры программ для микрокоитроллеров семейства АЧК Начало буфера ОАй7 Е ь ч> Ъс Гоаоба очередц со :3 пз С0 сс3 Э~ Хбопп о череда Конец буфера Рис. П10.2.
Оргаииааиия буфера НГО в памяти Подпрограмма "Тгапяпт," после передачи из очереди в 1ИКТ очередного байта проверяет, не опустел ли буфер. Если все данные уже переданы, то она сбрасывает бит УРК1Е, запрещая дальней иис запросы для двух переменных — указателей на голову очереди (Неай) и ее хвост (Та~!). Если буфер пуст, оба указателя равны. Подпрограмма "Мо~ъВиГ вызывается из головной программы. Она, не дожидаясь готовности передатчика, записывает в буфер УАКТ Оиг. (ставит в очередь на передачу) требуемое количество байт.
Подпрограмма "Тгапк1п~" вызывается по прерыванию при установке флага УРКЕ, что происходит, когда передатчик 13АКТ готов принять в 1ЛЭК новый байт. Подпрограмма Тгаы1пс переписывает один байт из очереди ПАКТ Оцг в рсгистр данных передатчика ЬАКТ (13РК), Обе описанные подпрограммы требуют от процессора мшшмальиых затрат времени. Подпрограмма "МочвВв1" записывает очередной байт в буфер по адресу, на который указывает указатель хвоста очереди, и увеличивает значение этого указателя. Чем больше байт в буфере, тем больше разрыв между указателями. Программа чтения из буфера "Тгапз1пг"считывает байт из ячейки, на которую указывает указатель головы очереди, и увеличивает значение этого указателя. Таким образом, указатели, двигаясь по кольцу, все время стремятся догнать друг друга. Когда буфер пустеет, указатель головы догоняет указатель хвоста и, наоборот, когда Ь~фер ш.имяется., уалтел ядств вогоияет указатель головы.
152 Приложения СОВЕТ. Сравните длительность исполнения программы 6тО в этом примере и в предыдущем. ПРОГРАММА Г!!=О.А$М 1пс1цбе "8515дег.спс ; Подключить Файл описаний имен : регистров ввода!вывода ;Задание символических имен регистрам .сей Сешр=г16 .сей 1авс всасе=г18 : Состояние клавиатуры при прошлом опросе .Бег ргевепС зтате=г19 :Состояние клавиатуры при текущем опросе .Бес соипс=г20 :Счетчик цикла .дет вегса1=г21 ; Данные для передачи в последовательный канал ;Определение символических имен для констант .ецц 0АНТ ОБТ=3сО ;Адрес буфера БАНТ ОБТ в НАМ .ецц БАНТ ОБТ Т=ЗЬе ;Адрес указателя на хвост очереди БАНТ ОБТ .есц БАНТ ОБТ Н=ЗЬТ :Адрес указателя на голову очереди БАНТ ОБТ ;Установка векторов ,огц 0 ГЗшр .огц ОЧЕОаоог г)шр с1ю0 прерывания ; В эту точку процессор попадает после сброса всагс ; Адрес вектора прерывания по переполнению : таймера 0 (имя "ОЧГОабб г" определено в ; файле "8515с$еГ.
1пс") ; Адрес вектора прерывания по Флагу БОНЕ ; готовности передатчика БАНТ .огц БОНЕаббг гаер Тгапз1пс ; Инициализация всагс: 1ос сешр. ~Ои(нАмем0): инициализация указателя стека для Ачн, имеющих оцс вр1. сешр ; программный стек. обязательно выполняется 101 сешр,Н16Н(НАМЕМО);в начале программы огас зрп,сешр гса11 рогс спсс гса11 СсшО спсС гса11 иагс спсс ; Инициализация портов ;Инициализация таймера 0 ; Инициализация БАНТ ;Установка глобального бита разрешения ;прерывания должна быть самой последней командой на прерывание.
Восстановление передачи данных (установку бита 11РК1Е) осуществит затем программа "Мат вВиГ' после того, как она выполнит новую запись в буфер. Наоборот, за переполнением буфера следит подпрограмма "МочвВиГ, Она игнорирует очередной байт, который головная программа пытается поставить в очередь, если буфер полон. Примеры лрогромм для микроконтроллеров семейство АИ 153 ; инициализирующей части программы.
; Бесконечный цикл: Еоор: г)щр Еоор : Основная программа в этом, примере ; ничего не делает. ; Подпрограмма обработки прерывания от таймера 0 ; вызывается — 1 раз в 70 мс. 11щО; ризЬ тешр ; Сохранение регистров в стеке (станет необходимым, тп тещр, в гео ; когда основная программа будет выполнять рцзп тещр ; какие-либо действия) сов 1азт зтате ; Если прошлый раз кнопка была нажата ("0") 1п ргезепт зтате, р1па апб 1авт агате, ргезепт агате ; и в этот раз отпущена( " 1" ), то 1п тещр, рогтЬ еог тешр. 1азт втате ;инвертировать состояние бита порта В оцт рогтЬ.тешр щоч 1авт зтате, ргевепт агате ; Сохранить текущее состояние клавиатуры ;для следующего входа в подпрограмму.
;Послать в последовательный канал ; управляющий АЯСП- код "перевод строки" ;Послать в последовательный канал ;управляющий АВС11-код "возврат каретки" 1Ш зег1а1, $0а гса11 МожвВц1 1с1 вег~а1, $0Ь гса11 тгапв гса11 гесе1че рор тещр оцт в гео, тещр рор тешр : Восстановление регистров из стека гет1 ; Подпрограмма передачи байта в буфер ВАНТ ОПТ из регистра вег1а1 МочвВц1: рцвп г1 ; Сохранение содержимого регистров в стеке ;Для каждого разряда порта В посылаем в последовательный канал АВСП-код "0"($30) или " 1" ($31) в зависимости от состояния разряда. 101 соцпт, 8 ;Инициализировать счетчика разрядов пехт Ьфт: го1 тещр с1г вег1а1 го1 вег~а1 вцЬ1 зег(а1, -$30 гса11 МожвВцГ бес соцпт Ьгпе пехт Ьфт Приложвния ровЬ гп рыяЬ тешр вт к, вепа1 1ов г1.
ОАНТ ООТ Т пс г1 апо'1 г1.$3Г втв ВАНТ ООТ Т, яЬ1 ысг,ибг1е прерывания от ОВНЕ 1бя 21, ОАНТ ООТ Т 1бя тешр, ОАНТ ООТ Н ср л1, тешр Ьгпе ш1 вЬ1с исг, оог1е г>шр епош ш1: с1г 7Ь виЬ1 г1, -ОАНТ ООТ епеш; рор тешр рор УЬ рор л1 гет ; Подпрограмма обработки Тгапя1пг; рывЬ г1 ривЬ гп ривЬ "гешр дп сешр, вгес ривЬ теяр 1бя г1, ОАНТ СОТ Н с1г ~Ь яиЬ1 г1,-0АНТ ООТ 1о тешр,л сит 00Н,тешр 1ов г1, ОАНТ ООТ Н 1пс к1 апб1 71, $3Г 1дя гЬ.ОАНТ ООТ Т ; Считать указатель хвоста очереди ; Считать указатель головы очереди ; Сравнить адреса головь, и хвоста очереди ; Если указатель на голову и хвост равны : и 0()НХЕ="1", ; то буфер переполнен, следовательно ; выходим из подпрограммь ;Добавить к указателю хвоста очереди ; адрес начала буфера.
т. е вычислить ;фактический адрес :и записать в него данные из регистра вег1а1 : Считать указатель хвоста очереди ; Увеличить его на 1 ;Если величина указателя больше 15, то вернуться к началу буфера (в нашем буфере 16 байт) ;Сохранить новое значение указателя ; Разрешить прерывание 0()НЕ :Восстановить из стека значения регистров ; Сохранить содержимое регистров в стеке ;Считать указатель головы очереди : Вычислить абсолютный адрес первого в очереди байта ; Считать из буфера этот байт ;Вывести его в ОАНТ ; Проверка: не стал ли буфер теперь пустым? Примеры программ для микроконтропперов семейство АУЯ 155 ср г1, гп Ьгпе т1 ; Если еще нет, перейти на т1 сЬ| 0СН, 00Н1Е т1: втв 0ДНТ 00Т Н, л1 ; Если буфер пуст, запретить дальнейшие прерывания по флагу 00НЕ (передатчик пуст) ;Сохранить в памяти новое значение : указателя головы очереди.
рор Тетр опт в ге0, тешр рор теар рор гп рор ~1 гет1 ; Восстановить из стека значения регистров "гесеьуе" приведена в примере П10.3. "рог. Фпфт" приведена в П10.2 "тил0 Фпгт" приведена в П10.2 "ыагт тп1Г" приведена в П10.3 ; Подпрограмма : Подпрограмма ; Подпрограмма ', Подпрограмма П10.5. 1.сд.аяп позволяет выводить данные на стандартный символьный жидкокристаллический индикатор (ЖКИ), построенный на базе контроллера НР44780. Такой ЖКИ не входит в комплект ЯТК500, но может быть подключен к нему при помощи имеющихся на отладочной плате разъемов, на которые выведены порты ввода/вывода АЪ'К.
Присоедините символьный ЖКИ к отладочной плате согласно таблице П10.1. В данном примере используется способ подключения индикатора при помощи 4-разрядной шины данных и предполагается, что данные будут передаваться только в одном направлении — от микроконтроллера к ЖКИ. При этом каждый байт данных передается по линиям РВ4 — РВ7 последовательно двумя тетрадами, начиная со старшей. М'В.-микроконтроллер посылает в ЖКИ команды (табл. П10.2), управляющие режимами его работы, и АЯС11-коды выводимых символов.