Главная » Микроконтроллеры
Призовой фонд
на май 2017 г.
1. Тестер компонентов MG328
Паяльник
2. Осциллограф DSO138
Паяльник
3. Регулируемый паяльник 60 Вт
Паяльник
4. 100 руб.
От пользователей

Отладка с помощью USART

Мощным средством для отладки и тестирования приложений на микроконтроллерной базе может выступать встроенный премо-передатчик USART. Этот узел реализован в модели ATtiny2313 и во всех без исключения моделях семейства ATmega. Основная задача USART – реализовать асинхронный обмен данными через интерфейс RS-232 или иные его аппаратные реализации (RS-485, RS-482 и т.). Обработку информации в этом случае можно переложить на компьютер.

Соединение производится с помощью COM-порта (COMunication port). В самом простом случае для этого потребуется 3-проводный минимальный нуль-модемный кабель. Один проводник будет выступать в качестве общего провода. Еще две линии TX, RX используются для передачи и приема данных. Для получения максимальной пропускной способности (до 115.2 кбит/с у RS-232) длина соединительного кабеля должна быть как можно меньше(≤2м).

Схема соединения микроконтроллеров AVR с COM-портом
Рис.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 стоп-бит).

Отладочная программа высокого уровня

Отладочная программа высокого уровня

Отладочная программа высокого уровня

Отладочная программа высокого уровня

Перейти к следующей части:

Теги:

Котов Игорь Юрьевич Опубликована: 2012 г. 0 0
Я собрал 0 0
x

Оценить статью

  • Техническая грамотность
  • Актуальность материала
  • Изложение материала
  • Полезность устройства
  • Повторяемость устройства
  • Орфография
0

Средний балл статьи: 0 Проголосовало: 0 чел.

Комментарии (0) | Я собрал (0) | Подписаться

Статью еще никто не комментировал. Вы можете стать первым.
Добавить комментарий
Имя:
E-mail:
не публикуется
Текст:
Защита от спама:
В чем измеряется электрическая мощность?
Файлы:
 
Для выбора нескольких файлов использйте CTRL

Программатор Pickit3
Программатор Pickit3
Конструктор для сборки: предусилитель на лампе 6N3 Печатная плата для усилителя "LM3886 + AD825"
вверх