Мощным средством для отладки и тестирования приложений на микроконтроллерной базе может выступать встроенный премо-передатчик USART. Этот узел реализован в модели ATtiny2313 и во всех без исключения моделях семейства ATmega. Основная задача USART – реализовать асинхронный обмен данными через интерфейс RS-232 или иные его аппаратные реализации (RS-485, RS-482 и т.). Обработку информации в этом случае можно переложить на компьютер.
Соединение производится с помощью COM-порта (COMunication port). В самом простом случае для этого потребуется 3-проводный минимальный нуль-модемный кабель. Один проводник будет выступать в качестве общего провода. Еще две линии TX, RX используются для передачи и приема данных. Для получения максимальной пропускной способности (до 115.2 кбит/с у RS-232) длина соединительного кабеля должна быть как можно меньше(≤2м).
Рис.1 Схема соединения микроконтроллеров AVR с COM-портом
На рис.1 показан один из возможных вариантов соединения AVR с компьютером через COM-порт. Для согласования логических уровней ТТЛ с уровнями RS-232 (3…12В лог.1, -3…-12В лог.0) применяется преобразователь MAX232. При замене DD1 другими аналогами (ST232,AD232 и т.д.) могут понадобиться иные номиналы C1…C4 в пределах 0.1…1.0 мкФ. Две пары выводов 4,6 и 7,8 необходимо соединить между собой в корпусе разъема. Это поможет избежать многих проблем, если будет применяться аппаратное управление потоком.
Интерфейс RS-232 появился еще на заре компьютерной техники (введен в 1969г.). В дальнейшем, претерпев множество изменений, за пару десятков лет он стал одним из промышленных стандартов. Однако бурное развитие электроники, уже в середине 90-х годов, выявило несоответствие RS-232 требованиям своего времени. Коренные недостатки, которые изначально были заложены в его основе, предопределили судьбу интерфейса. В 1996 г., благодаря совместным усилиями ряда передовых компаний в области компьютерных технологий, увидел свет новый стандарт USB (Universal Serial Bus). На данный момент USB почти полностью вытеснил RS-232 из тех областей, где он использовался как вид компьютерной связи. Сейчас уже очень трудно найти новую материнскую плату, где имеется хотя бы один разъем COM-порта. Тем не менее, существует ряд специализированных микросхем, позволяющих эмулировать работу RS-232 через USB-интерфейс. К ним относятся, например, такие популярные преобразователи, как FT232BM, CP2102 и др. Для их взаимодействия c операционной системой загружается функциональный драйвер, который формирует виртуальный COM-порт и предоставляет широкие возможности для программирования как через функции драйвера (находятся в прилагаемых dll-библиотеках), так и с помощью традиционных файловых API-функций. В последнем случае работа с портом ведется как с обыкновенным именованным каналом. При этом благодаря использованию HS-режима (High Speed) USB режима появляется возможность работать на скоростях вплоть до 460.8 кбит/с. Обсуждение подробностей работы c COM-порта выходит за рамки темы данной книги. Но если в этом все-таки есть необходимость, то исчерпывающее описание всех нюансов связанных с программированием COM-порта можно найти в [ссылка].
Ниже приведена небольшая подпрограмма breack_point, реализующая точку останова. В том месте программы, где встречается ее вызов, происходит вывод данных на компьютер и остановка до тех пор, пока дальнейшая работа не будет разрешена. Считыванию подлежит содержимое пространства РОН, РВВ, SRAM и EEPROM. Каждой точки останова можно задать свой адрес в диапазоне 0…255. Подпрограмма имеет размер в 127 слов и потребует для своего выполнения 1 регистр для передачи адреса точки останова и 16 б стека.
; Для обмена данными подпрограмма использует модуль USART и ; перед началом работы необходимо произвести его инициализацию. ; Тактовая частота подается на модуль от системного генератора ; через предделитель, коэффициент деления которого задается ; парой управляющих регистров UBRRH:UBRRL(0…4095). Скорость ; приема-передатчика в асинхронном режиме (baud rate) ; определится, как BAUD = Fclk/(16(UBRRH:UBRRL-1)) (Fclk – частота ; генератора в Гц). Если при этом установить бит U2X в регистре ; UCSRA, то величина BAUD снизится в 2 раза. Скорость обмена ; должна быть близка к одному из стандартных значений, ; поддерживаемых функциональным драйвером контроллера COM-порта ; компьютера (110,300,600,1200,…,57600,11520 бит/с). Если ; погрешность ≤ 2.0% еще более-менее приемлема, то расхождение ; частот в пределах 4…5% уже критично для работы интерфейса, тем ; боле на больших скоростях. Поэтому самым лучшим способом ; добиться надежной связи посредством RS-232 и любым другим ; видом асинхронной передачи данных, - это использовать частоту ; стабильную кварцем. Для этих целей существует ряд специальных ; опорных частот резонаторов таких, как 1.8432, 3.6864, 11.0592 ; МГц и т.д. Все они дают нулевую погрешность для большинства ; используемых на практике скоростей обмена. .equ XTAL = 3686 ;частота генератора в кГц .equ BAUD = 115200 ;необходимая скорость обмена в бит/с .equ NB = ((10000*XTAL)/(16*BAUD)-5)/10 .def temp = R16 .def numb = R27 ldi temp,high(RAMEND) ;инициализация стека out SPH,temp ldi temp,low(RAMEND) out SPL,temp . ldi temp,high(NB) out UBRRH,temp ldi temp,low(NB) out UBRRL,temp ; Настройки остальных режимов работы производятся через управляющие ; регистры: UCSRA,UCSRB,UCSRC. При этом регистр UCSRC имеет тот же ; адрес, что и UBRRH. Выбор регистра осуществляется с помощью бита ; URSEL(7-мой бит в этих регистрах). Если он установлен, то запись ; производится в URSEL; в противном случае в UBRRH. Для активизации ; линий приемника RXD и передатчика TXD должны быть установлены биты ; RXEN и TXEN в UCSRB. Там же находятся биты разрешения прерываний ; от модуля USART. Существует целых 3 условия по которым они могут ; быть сгенерированы и ,соответственно, 3 адреса в таблице векторов. ; Установка RXCIE приведет к прерыванию по завершению приема, TXCIE ; (используется редко) к прерыванию по завершению передачи, а ; установка UDRIE к прерыванию по опустошению регистра данных UDR. ; Флаги прерываний RXD,TXD,UDRE находятся в регистре UCSRA (там же ; Флаги различных ошибок работы приемо-передатчика). Размер слова ; данных задается битами UCSZ2:UCSZ0 (биты UCSZ1, UCSZ0 в UCSRC бит ; UCSZ2 в UCSRB) и составляет 5…8 разрядов (для 8-разрядных посылок ; UCSZ2:UCSZ0 = 011). Количество стоп-битов передатчика может быть 1 ; или 2 в зависимости от состояния бита USBS в UCSRC. Для повышения ; достоверности данных можно использовать так же аппаратный контроль ; четности(задается битами UPM1:UPM0 из UCSRC). ldi temp,(1<< RXEN)|(1<< TXEN) out UCSRB,temp ldi temp,(1<< URSEL)|(1<< UCSZ0)|(1<< UCSZ1) out UCSRC,temp . ldi numb,1 ;программная точка останова 1 rcall breack_point . ldi numb,2 ;программная точка останова 2 rcall breack_point . ; Подпрограмма для реализации точки останова ; R27 – регистры для передачи номера точки останова (0…255) ; В стеке используется 16 б для сохранения контекста breack_point: push R31 ;сохраняем в стеке регистры push R30 ;R31,R30,R29,R28,R27,SREG push R29 push R28 push R27 in R28,SREG cli push R28 rcall putc ;передаем номер точки останова (0…255) ldi R27,low(SRAM_START-0x20) rcall putc ldi R27,high(SRAM_START-0x20) rcall putc ;передаем количество РВВ (64…480) ldi R27,low(SRAM_SIZE) rcall putc ldi R27,high(SRAM_SIZE) rcall putc ;передаем размер SRAM (64…8192) ldi R27,low(EEPROMEND+1) rcall putc ldi R27,high(EEPROMEND+1) rcall putc ;передаем размер EEPROM (64…4096) rcall read_REGISTER ;передаем содержимое РОН rcall read_IO ;передаем содержимое РВВ rcall read_SRAM ;передаем содержимое SRAM rcall read_EEPROM ;передаем содержимое EEPROM bp1: sbis UCSRA,RXC ;ожидаем пока не будет получен байт rjmp bp1 ;данных с компьютера in R27,UDR cpi R27,'S' ;если принятый символ 'S', то окончание breq bp2 ;фазы ожидания и выход из подпрограммы cpi R27,'R' ;если принятый символ 'R', то переход brne bp1 ;на нулевой адрес rjmp 0 bp2: pop R28 ;восстанавливаем из стека регистры out SREG,R28 ;SREG,R27,R28,R29,R30,R31 pop R27 pop R28 pop R29 pop R30 pop R31 ret read_REGISTER: clr ZH ;подпрограмма передачи РОН clr ZL ;регистры R27…R31 считываются из стека rr1: ld R27,Z+ rcall putc cpi ZL,27 brne rr1 in ZH,SPH in ZL,SPL adiw ZH:ZL,4 ldi YL,5 rr2: ld R27,Z+ rcall putc dec YL brne rr2 ret read_IO: clr ZH ;подпрограмма передачи РВВ ldi ZL,0x20 ;содержимое SP считывается из стека ldi YH,high(SRAM_START-0x20) ldi YL,low(SRAM_START-0x20) ri1: cpi ZL,0x5D brne ri2 push ZH push ZL in ZH,SPH in ZL,SPL adiw ZH:ZL,12 mov R27,ZL rcall putc mov R27,ZH rcall putc sbiw ZH:ZL,7 ld R27,Z sbiw YH:YL,2 pop ZL pop ZH adiw ZH:ZL,3 rjmp ri3 ri2: ld R27,Z+ ri3: rcall putc sbiw YH:YL,1 brne ri1 ret read_SRAM: ldi ZH,high(SRAM_START) ;подпрограмма передачи SRAM ldi ZL,low(SRAM_START) ldi YH,high(SRAM_SIZE) ldi YL,low(SRAM_SIZE) rs1: ld R27,Z+ rcall putc sbiw YH:YL,1 brne rs1 ret read_EEPROM: in R27,EEARH ;подпрограмма передачи EEPROM push R27 ;содержимое регистров, управляющих in R27,EEARL ;EEPROM-памятью (EEARH,EEARL,EEDR,EECR) push R27 ;предварительно сохраняется в стеке in R27,EEDR push R27 in R27,EECR push R27 clr ZH clr ZL ldi YH,high(EEPROMEND+1) ldi YL,low(EEPROMEND+1) re1: sbic EECR,EEWE rjmp re1 out EEARH,ZH out EEARL,ZL sbi EECR,EERE in R27,EEDR adiw ZH:ZL,1 rcall putc sbiw YH:YL,1 brne re1 pop R27 out EECR,R27 pop R27 out EEDR,R27 pop R27 out EEARL,R27 pop R27 out EEARH,R27 ret putc: sbis UCSRA,UDRE ;подпрограмма передачи rjmp putc ;байта данных в компьютер out UDR,R27 ret
Внешний вид окна отладочной программы высокого уровня (файл DebbugInterface.exe) показан на рис.2. Для начала ее работы надо выбрать номер порта, скорость обмена и нажать на экранную кнопку “Соединение”. Если порт откроется успешно, то программа перейдет в состояние ожидания момента передачи данных, а после их получения в окнах можно будет просмотреть состояние соответствующих видов памяти AVR. После нажатия кнопки “Пуск” программа возобновит свое выполнение до следующей точки останова. Кнопка “Сброс” приводит к принудительному переходу на нулевой адрес памяти программ. Контроль четности или другие способы проверки достоверности данных не применяются. Формат данных 8-N-1 (8-разрядное слово данных, отсутствие контроля четности, 1 стоп-бит).
Перейти к следующей части: Операционные системы реального времени - Принцип действия ОСРВ
Комментарии (1)
|
Я собрал (0) |
Подписаться
Для добавления Вашей сборки необходима регистрация