Курс AVR123.nm.ru


Electronic Banner Exchange (ElBE)
 


 

 
         
 

 

Задача - упражнение  4

 

поиск   GOOGLE   по 
Краткому Курсу AVR

Книги и учебники по микроконтроллерам  AVR там



Как "прошить" микроконтроллер   AVR   и 
чем это сделать читайте на стр. 7 курса !

 

 

Компьютер - это мощный, универсальный инструмент разработки и отладки 
электронных устройств на МК.  
 

Цель задачи: 

1) Рассмотреть способы связи вашего электронного  устройства с компьютером для обмена данными.

2) Познакомится с методом отладки вашего реально спаянного устройства на МК - нахождение ошибок программы и "железа" с помощью вывода контрольных сообщений по ходу  программы.  

 

ПО ПОРЯДКУ:

  

Для связи ПК и вашего устройства необходим физический интерфейс. Очень удобен и прост интерфейс RS232 (подробней о нем читайте там) в ПК он реализован в виде COM-портов. 

Напряжение на выходе данных из COM-порта ПК (это ножка 3 в 9-ти штырьковом разъеме - рисунки ниже !) по стандарту RS232 таково:

логическая "1"    от -5 до -15 вольт  

логический "0"    от +5 до +15 вольт

На самом деле сигналы в COM называются по другому! 
я их назвал "логический" по аналогии названия в МК.   

Напряжения измеряются относительно вывода 5 который является "землей" или "общим проводом" интерфейса и обычно соединен с металлическим корпусом COM-разъема.

USART (или UART - универсальный приемо--передатчик осуществляющий кроме прочего и обмен данными по протоколу RS232 ) МК желает принимать на ножку RxD лишь напряжения допустимые для ножек МК (см стр. 2 курса). Кроме того для входа МК  "0" это напряжение близкое к нулю а "1" это напряжение близкое к напряжению питания МК (см стр. 2 курса).

 

     
 

Для согласования напряжений и логических уровней COM-порта 
и USART МК используют микросхемы типа MAX232

Я советую вам использовать современную микросхему ! 

Например sn65c3232E - ее можно питать напряжением от 3 до 5.5 вольт - при этом она поддерживает скорость передачи данных 
до 1 Mbs.

Вместо микросхемы можно использовать схему на 
транзисторах и "рассыпухе" - пример в АпНоуте 
AVR910 

 
     

 

 

Обычно ПК у вас один а устройств много

значит :

Достаточно одной микросхемы в составе кабеля адаптера  МК - ПК 
аналогично "шнурку" для связи ПК с мобильным телефоном.

 

     
 

Вы можете использовать готовый 
шнур-кабель от сотового телефона !

В интернете много схем кабелей для GSM телефонов, в них можно найти назначение контактов со стороны телефона - этой стороной кабель подключается прямо к USART  МК телефона. 

проблема в том, что обычно микросхема реализующая преобразование уровней сигнала - max232 (скорее ее более дешевый аналог) заправлена в вилку включаемую в сотовый, и вам придется проводки подключить к маленьким контактам этой вилки.

Еще нужно убедится что у данных телефонов именно rs232 
используется, опять же исходя из схем кабелей.

В кабеле для Siemens легко подключиться голыми медными проводками, там каждая ламелька разъема лежит в своем желобке, а проводки уже паять к гибкому проводу с колодкой на штырьки в плате с МК. затем замотать все изолентой. Таким образом кабель сможет выполнять в дальнейшем свое прямое назначение.

вот по этим ссылкам есть схемы кабелей:

allsiemens.ru

3ton.com/besik/cables.html

gsm.net.ua/siem.html


Обычно в адаптеры впаян стабилизатор питания 78L05 и питаются они от контактов 7 или 6,  9-штырькового разъема COM порта ПК, надо померить вольтметром чтоб хотя бы на одном из них было положительное напряжение более 8 вольт относительно "общего" контакта 5. 

Если этого нет то нужно отсоединить провода от этих контактов и подключить к ним внешнюю батарейку на 9-12 вольт.

Вот у Ericsson 6ХХ/7ХХ питание адаптера идет от телефона - нам это удобней.

 
     

 

 

Не трудно собрать свой адаптер по типовой схеме включения микросхемы из ДШ. 

Вот схема для MAX232:

- в схеме все конденсаторы по 0.1 мкФ, однако если вы поставите другую микросхему - клон max232 - то посмотрите её ДатаШит на предмет номиналов конденсаторов. 

- ST232 дешевый клон max232 всего за 1.4 $ 

- вы можете обойтись без конденсаторов вовсе если используете например MAX233 или DS275 (схема ниже) - но они стоят подороже. 

С лева на схеме показан разъем для подключения к МК AVR. на плату впаивают 4-х штырьковую вилку. Штырьки подключаются к МК по названиям по ДатаШиту. 

Адаптера имеет разъем с 4-мя отверстиями для подключения к устройству на МК. 

Правильное подключение разъема удобно пометить лаком для ногтей. 

По линии TxD данные передаются от МК в ПК (через MAX232),
по линии RxD  МК принимает данные от ПК.

Микросхема адаптера питается от вашего устройства на МК.

Длину проводов от МК до микросхемы адаптера не делайте больше 20 см.
я их сделал из плоского кабеля - шлейфа для IDE.

Со стороны ПК я использовал провод от COM-"мышек" - длины какой был. 

 

     
 

НАПОМНЮ :

9 штырьковый разъем COM
-порта ПК принимает данные на ножку 2,  с ножки 3 дынные передаются от ПК, а ножка 5 является "землей" или общим проводом. 

Для 25 штырькового разъема это будут соответственно выводы 3, 2 и 7.

 
     


Вот еще пара схем:

перемычки 4-6 и 7-8 необязательны !

 

     
 

Если вы еще не скачали ВСЕ
примеры применения МК AVR
 
- АпНоуты 

прошу вас, сделайте это ОБЯЗАТЕЛЬНО - 

ЭТО СПРАВОЧНИК именно по AVR  -  для вас !

 
     

 

 

Если на вашем ПК нет COM-портов, а есть только USB 

советую вам использовать кабель для сотового телефона содержащий микросхему преобразователь USB -> COM. 

После установки драйверов на вашем ПК появится виртуальный COM-порт - с ним будут нормально работать программы перечисленные ниже и другие для COM-порта.

Например кабель DCA-510

 

Или сделайте адаптер USB-COM сами на микросхеме
FT232RL   -  по ее даташиту  и  АпНоутам.

 

 

 

Как и Чем 
принимать и анализировать 
данные на ПК ?

Можно использовать стандартный терминал Windows - я не пробовал. 


Советую вам скачать и использовать программы специально 
созданные для отладки устройств подключаемых к COM.

 

1)    Бесплатная, русская программа  ComVC  - может сканировать COM и LPT порты ПК .  На сайте автора есть еще полезные программы для LPT и уроки программирования работы с портами ПК.  Автор - Валерий Ковтун.


2)  
COM Port Toolkit   для Windows 95/98/Me/NT/2000/XP


Мощная программа [Размер около 1400 Kб и все по-русски!] - позволяет
гибко управлять обменом с вашим устройством, естественно сохраняет
все на жесткий диск. 

Имеет очень полезный режим монитора - программа не занимает COM порт, а просто захватывает все данные передаваемые по COM и может захватывать обмен одновременно по всем портам !

Грустно - но автор в новой версии 3.7 отключил режим
монитора в незарегистрированной программе.

Желательна версия 3.5 - в ней все работает.  

Идеально для анализа данных обмена любых 
устройств подключенных к ПК.

Показывает направление передачи данных, и присваивает 
посылкам время по часам ПК с разрешением 1 мС.

     
 

Вы можете сохранить результат захвата в виде .html

просто щелкните на поле лога обмена правой кнопкой 
мышки и выберите соответствующий пункт меню!

 
     

Внимание !  - вы можете сами писать макросы 
управляющие обменом на простом Си подобном языке. 

Есть готовые макросы !  

Цитата: 

" ... Макросы используются программой для автоматизации рутинных задач передачи и модификации данных. Вы можете использовать их после добавления в каталог '\Macros' программы COM Port Toolkit. Макросы, выложенные ниже, являются хорошим примером для написания собственных скриптов для COM Port Toolkit.


CRC16pl.gc Вычисление CRC16 по полиномиальному алгоритму. 
(пример использования макроса 'при отправке') Михаил В. Голиков 

emu_barrier.gc Эмуляция работы прибора. 
(пример использования макроса 'при приеме') Михаил В. Голиков 

MODBUS_CRC16.gc Вычисление CRC16 MODBUS Михаил Н. Страшевский 

StringWithHex.gc Инкапсуляция байтов в HEX внутри строковых данных. Валерий В. Вишняк  ..."


Скачайте любой макрос и подивитесь их простоте.

 

 

3)    Далее простенькая программка - LookRS232  

полнофункциональная 15-дневная Демо версия. Я ее использовал 
с удовольствием, примеры принятых данных есть в задаче 07.  

 

4)   Очень мощные

Advanced Serial Data Logger for Windows 9x/Me/NT/2000/XPо

Advanced Serial Data Logger input RS232 data directly into file, Excel, Access or any Windows application. 

Advanced Serial Data Logger provides real-time data collection from any serial device or instrument. Send and receive RS232 data across a RS232 port or RS485 port with hardware converter.

и... 

Advanced Serial Port Monitor

A program that could mostly be used to check the flow of data through the computers COM ports under governing the operating system Windows. 

Supports: full duplex mode, flexible adjusting of parameters, output received data to file, automatic and manual mode, free data source, serial and RS232 sniffer (spy) mode. 

OS: Windows 95, 98, ME, NT 4.0, 2000, XP.

Обе программы хороши , как и 2) имеют режим "шпиона" - сами не занимаю порт а пишут в файл что шлет ПК в порт общаясь с подключенным устройством и что от туда получает, удобно для расшифровки протокола обмена различных устройств - сотовый телефон, модем, всякая всячина.

Обе программы имеют язык макросов. 

Программа повыше полнофункциональна в демо режиме и имеет плагины 
для конвертации полученных данных в формат Excel и Access .

 

 

 

 

Отладка МК устройства
с помощью адаптера MK - ПК


Идея проста как лапоть, но работает! 

В программе расставляются тестовые сообщения выводимые 
через описанный выше адаптер на ПК. 

Таким образом Мы видим в каком месте программы находимся, 
и где зависаем или спотыкаемся ! 

Можно выводить на ПК значения важных и нужных переменных !

вот так примерно:

Настраиваем скорость и включаем передачу USART:

#include <stdio.h>
// для любого компилятора  

Для AT90Sxxxx вот так:



UCR=0x00; // UART Off - выключить

// UART Baud rate: 115200 при частоте 3,68 МГц
UBRR=0x01; 
// 8 Data, 1 Stop, No Parity
/* значение в регистре определяет скорость 
работы UART в бодах. 

Нужное значение удобно получить с помощью генератора начального jrlf/ F А жно рассчитать по ДШ. 
в ДШ смотрите и доступные для данного МК скорости работы USART
 */


UCR=0x08; // UART Transmitter: On - Включить

 

 

Для  ATmegaXX  (с одним USART) вот так:

// 8 Data, 1 Stop, No Parity
// USART Receiver: Off
// USART Transmitter: On
// USART Mode: Asynchronous

UCSRA=0x00;
UCSRB=0x08;
UCSRC=0x86;

// USART Baud rate: 9600 для 4 MHz 
UBRRH=0x00;
UBRRL=0x19;

 
Теперь UART готов передавать данные.

 

 

     
 

Еще один способ вывода отладочной информации
на COM-порт ПК вы можете посмотреть в курсе
для начинающих   avr.nikolaew.org

 
     

 

 

Пример отладки привожу из своего опыта. 

Готовя задачу 07, я подключил память AT45DB161 к готовому устройству содержащему AT90s8535 - это был один из кучки адаптеров AVRISP присланных мне добрыми американцами. 

Монтаж там очень миниатюрный (smd 0603) и не смотря на все ухищрения я просмотрел что ножка МК PB1 заземлена через резистор 1,5 кОм - а к ней я подключил вывод RDY микросхемы памяти. 

Когда память свободна от выполнения внутренних операций на этой ножке должна возникать лог. "1" - высокий уровень  напряжения - близкий к напряжению питания +5 вольт. 

По поведению светодиодов (были уже на моей плате)

     
 

Светодиоды - тоже очень хорошее 
средство отладки-диагностики ! 

Используйте разные режимы горения светодиодов 
для индикации состояния вашего устройства!

 
     

я обнаружил, что МК виснет в процедуре стирания памяти.

Вот кусок программы из задачи 07 в котором я разместил 
контрольные сообщения - я буду писать из красным

while (block_counter < 512)
{
PORTB &= ~DF_CHIP_SELECT; 
// enable DataFlash

// тестовое сообщение
putsf("TP 0001"); // выводится 8 байт !!!


SPDR = BLOCK_ERASE;
while (!(SPSR & temp)); 
// wait for data transfer to be completed


putsf("TP 0002"); 

SPDR = (char)(block_counter>>3); //
точно по стр. 4 ДШ
while (!(SPSR & temp)); 
// wait for data transfer to be completed


putsf("TP 0003"); 

SPDR = (char)(block_counter<<5); //
точно по стр. 4 ДШ
while (!(SPSR & temp)); 
// wait for data transfer to be completed


putsf("TP 0004"); 

SPDR = 0x00; // don't cares
while (!(SPSR & temp)); 
// wait for data transfer to be completed


putsf("TP 0005"); 

PORTB |= DF_CHIP_SELECT; 
// disable DataFlash


block_counter++; 

putsf("TP 0006"); 

while(!(PINB & 0x02)); 
// wait until block is erased
 

putsf("TP 0007"); 

}   // все 512 блоков по 8 страниц стерты.


Я откомпилировал программу с тестовыми сообщениями, запустил программу LookRS232 на ПК для приема данных от МК, и прошил МК новой прошивкой. 

Включил МК и программа заработала. 

Скоро на экране ПК появились сообщения:

TP 0001 TP 0002 TP 0003 TP 0004 TP 0005 TP 0006

Последним пришло сообщение TP 0006 - значит не выполняется участок между Тестовыми Точками (TestPoint) 6 и 7. 

 

Я стал анализировать этот код между этими точками:

putsf("TP 0006"); 

while(!(PINB & 0x02)); 
// wait until block is erased
 

putsf("TP 0007"); 

 

Строка программы:

while(!(PINB & 0x02));  

это "цикл-ожидание" (см. стр. 5 курса - Си для МК) появления на ножке МК  PB1 уровня лог. "1" - раз программа останавливается на этой строчке значит почему-то уровень на этом выводе МК остаётся лог. "0". 

Я измерил вольтметром напряжение на ножке PB1, оно оказалось 0,54 вольта - логический "0" (см. стр. 2 курса) в чистом виде !  

Выключил устройство и померил сопротивление от ножки PB1 на "землю" и на питание. Сопротивление на землю оказалось 1,52 кОм. тогда я взял лупу стал разбираться "плотнее", что куда идет от этой ноги и обнаружил чип резистор на "землю" - отпаял его. 

Померил сопротивление снова - теперь все в порядке - теперь 
оно почти бесконечно большое.

Запустил программу на ПК по новой и включил МК - все заработало - на экране побежала строка:

TP 0001 TP 0002 TP 0003 TP 0004 TP 0005 TP 0006 TP 0007 

и далее по программе ...

 

Принцип надеюсь вам ясен - ведь он прост.

Однако нужно тщательно продумывать размещение тестовых
сообщений - они не должны искажать ход программы по времени! 


После окончания отладки можно либо удалить тестовые сообщения, либо закомментировать их - т.е. поставить перед ними две черточки  //  - т.е. 
сделать их комментариями.

 

     
 

Советую сделать профессионально

При отладке в начале программы пишут:

#define DEBUG

а тестовые сообщения пишут вот так:

#ifdef DEBUG
putsf("Test Mess"); 
#endif

Теперь код написанный красным будет выполнятся. 

 

А когда устройство уже отлажено вам нужно закомментировать 
строку -
#define DEBUG  двумя черточками - вот так:

// #define DEBUG

и теперь при компиляции код написанный красным НЕ будет выполнятся. 


Это очень удобно когда программа большая и тестовые 
сообщения во множестве расположены в разных частях 
программы, даже в разных файлах проекта ! 

всего двумя черточками  //   вы отключаете или включаете все тестовые сообщения сразу !

 
     


Тестовые сообщения могут быть разными, в зависимости от допустимости их длины по времени, желательно их делать длинными с понятным текстом вызывающим ассоциацию с соответствующим участком программы. 

В местах критичных к времени выполнения можно делать короткие тестовые сообщения, либо вовсе не делать вначале отладки. 

А уже убедившись что проблема именно в этом скоростном участке - вставить скоростные метки: т.е. в качестве тестового сигнала выводить по 1 символу не тратя времени на вызов функции вывода. 


Вот так например для AVR серии AT90sXXXX:

while (!USR.5); /* ждем окончания передачи предыдущего байта (символа) если не уверены что он уже был отправлен */

UDR = (тестовый символ - число от 0 до 255 но лучше печатаемый на экране - см. таблицу символов); 
// передаем нужный тестовый символ

 

Для ATmega названия регистров отличаются 

и соответственно конструкция для ATmega8 будет такой: 

while (!(UCSRA.5)); /* ждем очистки регистра данных USART - т.е. окончания передачи предыдущего байта (символа) - в ДШ это написано так: 
while ( !(UCSRA & (1<<5)) ); */

UDR = ('5'); /* поместить число соответствующее символу 5 в регистр данных USART - он называется UDR - это стартует передачу символа на ножке TxD. и в принимающем терминале появится символ  5  */


так в нужном месте программы мы вывели контрольное сообщение 
состоящее из одного символа.

Если вы уверены по тексту вашей программы, что между выводом тестовых символов  проходит достаточно времени для их передачи то можно написать просто:

UDR = ('5'); 

 

     
 

На передачу одного символа (в формате 8N1 - установленном нами выше при настройке UART) тратится время в Сек : 

10 разделить на скорость USART в бод/сек. 

Для запаса делите не 10 а 11 или 12 - не промахнетесь!

 
     

 

 

Внимание ! функция :

putsf("что-то");

передает на 1 символ больше чем количество 
символов между кавычками !

 

     
 

Если UART MK настроен как сказано выше, то 

для вывода чисел в нужном вам виде в компиляторах ImageCraft ICC и  CodeVisionAVR вы можете использовать функцию форматированного вывода  -   printf()

Если переменная   val    содержит число 166   то 

printf("val = %d",val);

Выведет на терминал ПК:       val = 166

и ...

printf("val = 0x%X",val);

Выведет на терминал ПК:    val = 0xA6


Подробней о 
printf() читайте в следующей задаче 
и в  Help'ах  к  компиляторам.

 
     

 

 

 

Всё !   Задача закончена.

 

Если вам что-то не понятно, пожалуйста перечитайте 
задачу еще раз просмотрите рекомендованный материал.  

 

 

Дальше ->  Задача 5

 

В которой я рассказываю и показываю как: 

1)  Создать программу для ATmega16 принимающую и передающую данные обмениваясь ими с ПК через COM-порт по интерфейсу rs232  с помощью USART встроенного в МК серии ATmega.

2)  угл'У'бить навыки создания программы в CVAVR и продОлжить 

 
                       использование Си для микроконтроллеров


3)  Подключить и "порулить" символьным ЖКИ -
LCD 16x2

 

 

 

 

 

 

 

Hosted by uCoz