SDK 1.1 + SDX-09

Учебный лабораторный комплекс SDK-1.1 на базе микроконтроллера ADuC812 с ядром MCS51 # RS-232C, I2C

SDK 1.1 + SDX-09

Сообщение bochal » 07 дек 2009, 02:10

При выполнении лабораторных работ возникла проблема подключения модуля ввода-вывода SDX-09 к учебному стенду SDK 1.1 (ADuC812). Не получаются работы с дискретными входами/выходами, с релейными, и аналоговыми. В руководстве пользователя недостаточно информации. Самостоятельно разобраться очень сложно.
На сайте есть пример программы, демонстрирующей работу стенда SDX-09 (Rev.1), подключенного к SDK-1.1.
Но программа не заработала. При компиляции появлялась ошибка, что очень большой объем программы.
Уже созданный hex-файл залить также не получилось (возможно указывались неправильные адреса оперативной памяти).
Поэтому хотел обратится за помощью. Может существуют какие-то готовые примеры, более легкие, чем который на сайте? Так как самостоятельно что-то написать не получилось.
bochal
 
Сообщения: 8
Зарегистрирован: 07 дек 2009, 00:59

Re: SDK 1.1 + SDX-09

Сообщение kluchev » 07 дек 2009, 17:42

bochal писал(а):При выполнении лабораторных работ возникла проблема подключения модуля ввода-вывода SDX-09 к учебному стенду SDK 1.1 (ADuC812). Не получаются работы с дискретными входами/выходами, с релейными, и аналоговыми. В руководстве пользователя недостаточно информации. Самостоятельно разобраться очень сложно.
На сайте есть пример программы, демонстрирующей работу стенда SDX-09 (Rev.1), подключенного к SDK-1.1.
Но программа не заработала. При компиляции появлялась ошибка, что очень большой объем программы.
Уже созданный hex-файл залить также не получилось (возможно указывались неправильные адреса оперативной памяти).
Поэтому хотел обратится за помощью. Может существуют какие-то готовые примеры, более легкие, чем который на сайте? Так как самостоятельно что-то написать не получилось.


1. Бесплатный компилятор Keil Software имеет ограничение на объём кода. Можно перейти на бесплатный компилятор SDCC или купить полный вариант компилятора Keil Software.
2. Программирование встроенных систем невозможно без минимальных знаний схемотехники. Боюсь, что придётся изучить электрические принципиальные схемы SDK-1.1 и SDX-09.
В споре рождается коллективное заблуждение, а истиной мы его называем для краткости
Аватара пользователя
kluchev
 
Сообщения: 995
Зарегистрирован: 04 апр 2008, 13:31
Откуда: SPb

Re: SDK 1.1 + SDX-09

Сообщение bochal » 26 апр 2010, 01:01

На сегодняшний день удалось разобраться с дискретными входами/выходами и релейными выходами. Но актуальной остаётся задача использования аналогвых входов/выходов. Наиболее сейчас важны аналоговые входы. В нашем университете планируется применять стенды SDK-1.1 и SDX-09 для задач автоматизации: различные системы управления освещением, кондиционированием воздуха, управление жалюзи, двигателями и др.
Помогите пожалуйста разобраться с аналоговыми входами. Существуюий драйвер "adc.c" не работает. Вроде получается инициализация, но функция get_voltage() не работает.
Код: Выделить всё
float get_voltage( unsigned char channel )
{
float v;
    while( ADCCON3 & BUSY );             
    ADCCON2 = START | ( channel & 0x7 ); 
    while( ADCCON3 & BUSY );             
    v = (( unsigned short )( ADCDATAH & 0xF ) << 8 ) | ADCDATAL;
    v = v * 5.0 / 0xFFF;                   // Не работает как мне кажется из-за этой строки
    return v;
}

Объясните пожалуйста, из-за чего может не работать?
bochal
 
Сообщения: 8
Зарегистрирован: 07 дек 2009, 00:59

Re: SDK 1.1 + SDX-09

Сообщение DinKa » 26 апр 2010, 17:02

bochal писал(а):На сегодняшний день удалось разобраться с дискретными входами/выходами и релейными выходами. Но актуальной остаётся задача использования аналогвых входов/выходов. Наиболее сейчас важны аналоговые входы. В нашем университете планируется применять стенды SDK-1.1 и SDX-09 для задач автоматизации: различные системы управления освещением, кондиционированием воздуха, управление жалюзи, двигателями и др.
Помогите пожалуйста разобраться с аналоговыми входами. Существуюий драйвер "adc.c" не работает. Вроде получается инициализация, но функция get_voltage() не работает.
Код: Выделить всё
float get_voltage( unsigned char channel )
{
float v;
    while( ADCCON3 & BUSY );             
    ADCCON2 = START | ( channel & 0x7 ); 
    while( ADCCON3 & BUSY );             
    v = (( unsigned short )( ADCDATAH & 0xF ) << 8 ) | ADCDATAL;
    v = v * 5.0 / 0xFFF;                   // Не работает как мне кажется из-за этой строки
    return v;
}

Объясните пожалуйста, из-за чего может не работать?

Поясните, пожалуйста, конкретнее: что значит не работает? Какая схема подключения? Какой сигнал Вы оцифровываете?
Переключатели SW1 в SDK-1.1 находятся в положении OFF?
DinKa
 
Сообщения: 247
Зарегистрирован: 23 апр 2008, 18:01

Re: SDK 1.1 + SDX-09

Сообщение bochal » 26 апр 2010, 20:32

На аналоговый вход 0 модуля SDX-09 подается напряжение от 0 до 10 В с помощью регулируемого блока питания. Переключатель SW1 в положении OFF.
В программе выводится надпись на дисплей, зажигаются светодиоды. Далее инициализируется АЦП, и программа пытается считать значение напряжения на аналоговом входе с помощью фунции get_voltage().
Но программа не работает, т.е. ничего не выводится ни на дисплей, ни на светодиоды, если в коде присутствует функция get_voltage(). Если ее убрать, то хотя бы что-то выведется на дисплей и светодиоды.

АЦП получается инициализировать, задать режим работы, получается считать содержимое регистров ADCDATAH и ADCDATAL. Вся проблема в этой строке:
Код: Выделить всё
v = v * 5.0 / 0xFFF;

Мне кажется это из-за того, что переменная v типа float.
Потому что даже простое произведение:
Код: Выделить всё
v = v * 5.0;

не работает, если переменная этого типа.
Сталкивался ли кто-нибудь с этой проблемой? Также объясните пожалуйста, почему именно такое арифметическое выражение почему надо умножать на 5, и делить на 0xFFF?
bochal
 
Сообщения: 8
Зарегистрирован: 07 дек 2009, 00:59

Re: SDK 1.1 + SDX-09

Сообщение Shico » 28 апр 2010, 00:41

bochal писал(а):Мне кажется это из-за того, что переменная v типа float.
Потому что даже простое произведение:
Код: Выделить всё
v = v * 5.0;

не работает, если переменная этого типа.
Сталкивался ли кто-нибудь с этой проблемой?

Очень может быть, что из-за типа данных float. Каким Вы пользуетесь компилятором? Не исключено, что Ваш компилятор по умолчанию не подключает библиотеки для работы с числами с плавающей точкой. Не выдает ли компилятор предупреждений при сборке проекта?

bochal писал(а):Также объясните пожалуйста, почему именно такое арифметическое выражение почему надо умножать на 5, и делить на 0xFFF?

АЦП производит оцифровку сигнала в диапазоне от 0 до 5 вольт. Так как АЦП имеет 12-разрядную точность, то нулю вольт соответствует число 0, а 5 вольтам - максимальное измеряемое значение - 4095 (0xFFF). Соответственно выражение
Код: Выделить всё
v = v * 5.0 / 0xFFF;

вычисляет измеренное напряжение: умножаем на верхнее значение диапазона, делим на максимальное измеряемое значение.
"Раньше гусиными перьями писали вечные мысли, а теперь вечными перьями пишут гусиные мысли". В. Солоухин
Аватара пользователя
Shico
 
Сообщения: 301
Зарегистрирован: 06 апр 2008, 16:15
Откуда: Санкт-Петербург

Re: SDK 1.1 + SDX-09

Сообщение Рустам » 28 апр 2010, 12:06

Shico писал(а):Так как АЦП имеет 12-разрядную точность, то нулю вольт соответствует число 0, а 5 вольтам - максимальное измеряемое значение - 4095 (0xFFF).

5 вольтам соответствует 4096 и делить нужно на 0x1000. Только не понятно, откуда взялись 5 вольт. В начале вроде фигурировали 10 вольт.
Аватара пользователя
Рустам
 
Сообщения: 164
Зарегистрирован: 27 май 2008, 01:24

Re: SDK 1.1 + SDX-09

Сообщение bochal » 28 апр 2010, 21:53

Очень может быть, что из-за типа данных float. Каким Вы пользуетесь компилятором? Не исключено, что Ваш компилятор по умолчанию не подключает библиотеки для работы с числами с плавающей точкой. Не выдает ли компилятор предупреждений при сборке проекта?

Использую Keil uVision 2 бесплатную версию. При сборке никаких предупреждений компилятор не выдает.
bochal
 
Сообщения: 8
Зарегистрирован: 07 дек 2009, 00:59

Re: SDK 1.1 + SDX-09

Сообщение DinKa » 29 апр 2010, 14:01

bochal писал(а):
Очень может быть, что из-за типа данных float. Каким Вы пользуетесь компилятором? Не исключено, что Ваш компилятор по умолчанию не подключает библиотеки для работы с числами с плавающей точкой. Не выдает ли компилятор предупреждений при сборке проекта?

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

Есть такое предложение: временно отложите стенд SDX-09 и запустите в стенде SDK-1.1 пример работы с ЦАП и АЦП. Для этого попробуйте использовать другой компилятор SDCC - можно будет сравнить с Keil C51 :) . Зашейте в стенд полученный при помощи SDCC исполняемый модуль - для этого Вам может понадобится утилита make и инструментальная система m3p (для освоения поможет этот документ). Этот тестовый пример демонстрирует совместную работу ЦАП и АЦП, т.е. когда выходы ЦАП замыкаются на АЦП при помощи переключателя SW1, меню для работы и результаты преобразования выводятся в последовательный канал. Функция get_voltage() драйвера АЦП из этого примера, которую Вы использовали у себя, определяется указанной задачей: ЦАП настраивается на диапазон 0-5В (см. функцию init_dac()), далее при замыкании переключателя SW1 напряжение поступает на соответствующие входы АЦП через резистивный делитель, т.е. делится на 2, потому что сам АЦП работает в диапазоне 0-2.5 В (Vref = 2.5 В).
Если быть совсем точным, то действительно в функции get_voltage() 5 В нужно делить на 4096:
Код: Выделить всё
v = v * 5.0 / 4096;          //Вместо v = v * 5.0 / 0xFFF;

Посмотрите: заработает или нет?
DinKa
 
Сообщения: 247
Зарегистрирован: 23 апр 2008, 18:01

Re: SDK 1.1 + SDX-09

Сообщение bochal » 29 апр 2010, 23:36

Для этого попробуйте использовать другой компилятор SDCC - можно будет сравнить с Keil C51 .

Моя студенческая версия компилятора Keil действительно не поддерживает тип float, и как выяснилось некоторые арифметические операции ( / , % ). Хорошо хоть сдвиги работают, можно заменить деление. :) Нужно срочно переходить на SDCC.
Возник еще один вопрос - я считываю состояние регистров ADCDATAH и ADCDATAL, и вывожу их на экран в двоичной форме. Для того чтобы экспериментально установить соответствие между значением регистров и напряжением на аналоговом входе, и самостоятельно вывести формулу расчета напряжения.
Но проблема в том, что у меня не меняется значения в этих регистрах. Я не до конца понимаю, какая связь между аналоговым входами и каналами АЦП? Входов - 4, каналов - 8. Это ведь ни одно и тоже?
И применяя фунцию
Код: Выделить всё
x=get_voltage(0);
Я получаю значение на нулевом входе или выбираю канал на котором будет осуществляться преобразование?
Если я подаю напряжение на нулевой вход, то в программе его считывает команда get_voltage(0) ?
bochal
 
Сообщения: 8
Зарегистрирован: 07 дек 2009, 00:59

Re: SDK 1.1 + SDX-09

Сообщение Shico » 01 май 2010, 02:10

bochal писал(а):Но проблема в том, что у меня не меняется значения в этих регистрах. Я не до конца понимаю, какая связь между аналоговым входами и каналами АЦП? Входов - 4, каналов - 8. Это ведь ни одно и тоже?

Микроконтроллер ADuC812 имеет 8 каналов АЦП. Все они выведены на разъем J1 стенда SDK-1.1. Стенд SDX-0.9 имеет только 4 аналоговых входа. При соединении стендов кабелем, 4 канала АЦП (с 0-го по 3-й) стенда SDK-1.1 соединяются с четырьмя аналоговыми входами стенда SDX-0.9. Таким образом остальные четыре канала АЦП стенда SDK, просто не реализованы в стенде SDX.

bochal писал(а):И применяя фунцию
Код: Выделить всё
x=get_voltage(0);
Я получаю значение на нулевом входе или выбираю канал на котором будет осуществляться преобразование?
Если я подаю напряжение на нулевой вход, то в программе его считывает команда get_voltage(0) ?

Функция get_voltage(0) должна вернуть напряжение на нулевом аналоговом входе.
В первом сообщении Вы пишите, что у Вас стенд SDX-09 (Rev.1), если это так, то как следует из документации к стенду первой ревизии (ссылка) его аналоговые входы рассчитаны на напряжение 0 - 5В, а Вы подаете на него напряжение 0 -10В. Так же проверьте на всякий случай схему подключения.
"Раньше гусиными перьями писали вечные мысли, а теперь вечными перьями пишут гусиные мысли". В. Солоухин
Аватара пользователя
Shico
 
Сообщения: 301
Зарегистрирован: 06 апр 2008, 16:15
Откуда: Санкт-Петербург

Re: SDK 1.1 + SDX-09

Сообщение bochal » 03 май 2010, 14:57

Спасибо за объяснение про АЦП.
В первом сообщении Вы пишите, что у Вас стенд SDX-09 (Rev.1), если это так, то как следует из документации к стенду первой ревизии (ссылка) его аналоговые входы рассчитаны на напряжение 0 - 5В, а Вы подаете на него напряжение 0 -10В. Так же проверьте на всякий случай схему подключения.

У меня SDX-09 rev.2, и судя по документации на аналоговые входы можно подавать ±10 В. А напряжение 0 - 5В взялось из драйвера adc.c, который написан для SDX-09 rev.1.
Сейчас мне надо получить точную формулу преобразования значений регистров ADCDATAH и ADCDATAL в напряжение. Формула:
Код: Выделить всё
v = v * 10 / 0xFFF;

Не правильная. Т.к. 0В - это не 0x000, 10 В - не 0xFFF. Им соответствуют другие значения в регистрах. Так ли это на самом деле?

Для того, чтобы вывести правильную формулу. Я попробовал выводить значение регистров на дисплей, и каждому значению напряжения на входе (1, 2, 3, ... 10 В) - найти соответствующее значение в регистрах. Затем по полученным точкам построил график, у которго по оси X напряжение в вольтах, по оси Y значения регистров в десятичной форме. Провел через эти точки прямую, получил фунцию: y=kx+b. Функция получилась соедующая (в десятичной форме):
Код: Выделить всё
Напряжение = ((значение в регистрах в дес. форме) - 496 / 47)

Но по этой формуле значение напряжения получается не точным. Как Вы думаете сам принцип получения формулы правильный?
bochal
 
Сообщения: 8
Зарегистрирован: 07 дек 2009, 00:59

Re: SDK 1.1 + SDX-09

Сообщение bochal » 03 май 2010, 15:18

Все же у меня трудности с переходом на SDCC и m3p. Прочитал документацию, посмотрел соседнюю тему на форуме. Но это кажется таким сложным, по сравнению с Keil uVision 2, в котором и редактировать можно и компилировать. Который очень мне нравится, жалко только, что в нем нельзя использовать операцию деления. Нам для ВУЗа как-то надо разобраться с SDCC. Я на сайте "ЛМТ" видел список учебных заведений, в которых применяются эти стенды. Неужели во всех используются SDCC и m3p. Ведь должны тогда быть какие-то нормальные пособия по этому ПО, в котором в доступной форме описывется пошаговая сборка, компиляция и загрузка программы в стенд.
bochal
 
Сообщения: 8
Зарегистрирован: 07 дек 2009, 00:59

Re: SDK 1.1 + SDX-09

Сообщение Shico » 03 май 2010, 20:34

bochal писал(а):
Код: Выделить всё
Напряжение = ((значение в регистрах в дес. форме) - 496 / 47)

Но по этой формуле значение напряжения получается не точным. Как Вы думаете сам принцип получения формулы правильный?

Честно говоря не понял Вашей формулы.

Попробую объяснить так: на аналоговом входе может быть напряжение от -10 до +10 вольт, АЦП имеет 12 разрядов, значит если на вход подать -10 вольт с АЦП должен считаться 0, если +10 вольт должно считаться значение 4095. Нулю вольт должно соответствовать среднее значение диапазона АЦП: 2048. Таким образом для Вашего диапазона напряжений (от 0 до +10 вольт) можно использовать упрощенную формулу:
Код: Выделить всё
v = ((v - 2048) * 10) / 2048

В более сложной формуле, позволяющей измерять напряжение во всем диапазоне, нужно сначала понять положительное или отрицательное напряжение подано на вход (т.е. значение АЦП больше или меньше 2048) и затем рассчитать значение для каждого из диапазонов.

Но это все в теории, на практике АЦП работает не идеально и нужно проводить калибровку, то есть подавать на аналоговый вход напряжения с точного источника питания и выяснить чему соответствуют значения АЦП для крайних точек измеряемого диапазона напряжений, затем скорректировать формулу с учетом этих значений.
"Раньше гусиными перьями писали вечные мысли, а теперь вечными перьями пишут гусиные мысли". В. Солоухин
Аватара пользователя
Shico
 
Сообщения: 301
Зарегистрирован: 06 апр 2008, 16:15
Откуда: Санкт-Петербург

Re: SDK 1.1 + SDX-09

Сообщение DinKa » 03 май 2010, 22:45

bochal писал(а):Все же у меня трудности с переходом на SDCC и m3p. Прочитал документацию, посмотрел соседнюю тему на форуме. Но это кажется таким сложным, по сравнению с Keil uVision 2, в котором и редактировать можно и компилировать. Который очень мне нравится, жалко только, что в нем нельзя использовать операцию деления. Нам для ВУЗа как-то надо разобраться с SDCC. Я на сайте "ЛМТ" видел список учебных заведений, в которых применяются эти стенды. Неужели во всех используются SDCC и m3p. Ведь должны тогда быть какие-то нормальные пособия по этому ПО, в котором в доступной форме описывется пошаговая сборка, компиляция и загрузка программы в стенд.

Какая ревизия у Вашего стенда SDK-1.1? Какой в нем резидентный загрузчик - HEX-202 или UL3? От этого зависит последовательность шагов по сборке и загрузке программ в стенд.
Предлагаю следующий вариант прохождения этого пути (наиболее простой из нескольких вариантов при имеющемся недостатке информации по Вашему стенду и инструментальному обеспечению, которым Вы пользуетесь) на примере работы с ЦАП и АЦП:
  1. Если в стенде SDK-1.1 загрузчик UL3, то пропускаете этот пункт. Если же HEX-202, то заменяете его на UL3. Для этого скачиваете архив, в котором есть инструкция по прошивке.
  2. Скачиваете SDCC и устанавливаете. Далее в переменную окружения PATH добавляете путь к SDCC (папка bin). В эту же папку помещаете утилиту make и m3p.
  3. Скачиваете предложенный пример, распаковываете его и работаете с командной строкой. Для сборки проекта набираете в командной строке make (в папке, где находится makefile - корневой каталог проекта). После чего Вы должны получить test_dac.hex и test_dac.bin.
  4. Если Вы используете не COM1 для загрузки программ в стенд, то нужно отредактировать файл (скрипт) load.m3p. Для загрузки программы в стенд наберите в командной строке make load (в папке, где находится makefile) и, если все прошло успешно, в терминале m3p Вы увидите "Test DAC & ADC" и меню для теста АЦП и ЦАП.
В дальнейшем для написания собственных проектов Вы можете:
  • использовать для редактирования исходных текстов в качестве текстового редактора для программного кода: от блокнота до IDE (например, Eclipse);
  • настроить IDE (например, Eclipse) для компиляции программ при помощи SDCC;
  • изучить глубже утилиту make и правила написания makefile (есть такой документ);
  • разобраться лучше с инструментальной системой m3p, которая в минимальном необходимом для Вас варианте выполняет функцию доставки (программы в стенд) и терминала (для связи со стендом по последовательному каналу).
Последний раз редактировалось DinKa 03 май 2010, 23:27, всего редактировалось 1 раз.
DinKa
 
Сообщения: 247
Зарегистрирован: 23 апр 2008, 18:01

Re: SDK 1.1 + SDX-09

Сообщение DinKa » 03 май 2010, 22:52

Shico писал(а):... на практике АЦП работает не идеально и нужно проводить калибровку, то есть подавать на аналоговый вход напряжения с точного источника питания и выяснить чему соответствуют значения АЦП для крайних точек измеряемого диапазона напряжений, затем скорректировать формулу с учетом этих значений.

По калибровке АЦП МК ADuC812 у Analog Devices есть соответствующий Application Note "ADuC812 ADC Software Calibration".
DinKa
 
Сообщения: 247
Зарегистрирован: 23 апр 2008, 18:01

Re: SDK 1.1 + SDX-09

Сообщение bochal » 06 май 2010, 22:53

Спасибо за объяснение про АЦП.
У наших стендов ревизия 4. Загрузчик HEX-202. Есть стенд на ADuC812 (программа записывается в оперативную память), а есть на базе ADuC842 (записывается во flash). Для загрузки программ в ADuC842 используем WSD.
Чем будет отличаться применение альтернативных средств (SDCC, make, m3p, Eclipse) для SDK-1.1 на базе ADuC842? Там нет загрузчиков UL3, HEX-202. Может нам легче использовать этот стенд для таких задач?
bochal
 
Сообщения: 8
Зарегистрирован: 07 дек 2009, 00:59

Re: SDK 1.1 + SDX-09

Сообщение kluchev » 07 май 2010, 09:42

bochal писал(а):Чем будет отличаться применение альтернативных средств (SDCC, make, m3p, Eclipse) для SDK-1.1 на базе ADuC842? Там нет загрузчиков UL3, HEX-202.


SDCC выдаёт загрузочный модуль в формат Intel Hex, как и Keil. В этом плане они идентичны. m3p это эквивалент программы t167b. t167b была написана в прошлом веке под MS DOS, m3p в этом, под Win32 и Unix :)

Может нам легче использовать этот стенд для таких задач?


Попробуйте, тут важно начать, а там разберетесь. В принципе, ничего сложного нет. Единственная проблема, для ADuC 842 меньше готовых примеров (они немного отличаются).
В споре рождается коллективное заблуждение, а истиной мы его называем для краткости
Аватара пользователя
kluchev
 
Сообщения: 995
Зарегистрирован: 04 апр 2008, 13:31
Откуда: SPb

Re: SDK 1.1 + SDX-09

Сообщение Shico » 09 май 2010, 23:41

bochal писал(а):... Может нам легче использовать этот стенд для таких задач?

Отличия стендов с микроконтроллерами ADuC812 и ADuC842 описаны в документе "Отличия SDK-1.1s от SDK-1.1: отличия в программировании стенда SDK-1.1 с ADuC812 и ADuC842". На мой взгляд в понимании работы АЦП смена стенда мало чем поможет, так что лучше сначала научиться работать с АЦП на обычном стенде, а уже потом экспериментировать со стендом SDK-1.1s.
"Раньше гусиными перьями писали вечные мысли, а теперь вечными перьями пишут гусиные мысли". В. Солоухин
Аватара пользователя
Shico
 
Сообщения: 301
Зарегистрирован: 06 апр 2008, 16:15
Откуда: Санкт-Петербург

Re: SDK 1.1 + SDX-09

Сообщение PROF2190 » 23 янв 2012, 18:06

Уважаемая Администрация Скажите пожалуйста пароли к лабораторным.
Очень надо для курсовой!!!
PROF2190
 
Сообщения: 1
Зарегистрирован: 23 янв 2012, 16:07

След.

Вернуться в SDK 1.1

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1