Jump to content

    

ILSF15

Участник
  • Content Count

    61
  • Joined

  • Last visited

Community Reputation

0 Обычный

About ILSF15

  • Rank
    Участник

Recent Profile Visitors

The recent visitors block is disabled and is not being shown to other users.

  1. Elresearch, ясно, нет, мне нужен именно вывод в порт COM, чтобы можно было на стареньком нетбуке запускать PuTTy и читать, что МК там пишет. И я вполне успешно с этим справился - настолько, что портировал своё решение для Arduino Nano, дабы экономить занимаемое программой место. Разница весьма ощутимая получается, если не использовать стандартную библиотеку Serial. Правда, обработку ввода не писал, но мне она, собсно, до сих пор не пригодилась. Понадобится - напишу. UPD. А, там вроде как можно перенаправить и на COM. Ну, нээээприииигодиииилоооос
  2. Ну вот результат: Написал две раздельных функции, одна выводит не более чем девятизначное положительное целое число или переменную соответствующего значения, другая (оказалось, совсем простая задача, с числами и то сложнее было) выводит текстовую строку. Сравнил: размер кода IAR с моими функциями, выводящий "Hello, World!" с переносом строки и восьмизначное число с переносом строки - 732 байта размер кода Energia IDE (там, правда, одна универсальная функция с возможностями форматирования, да и запуск последовательного порта поддерживает выбор скоростей - я этим решил не заморачиваться, т.к. хардверный UART всё равно не поддерживает выше 9600 бод) - 2222 байта. Поскольку лично у меня максимум задач ограничивается тем, что делают написанные мной функции, а использовать две разных вместо одной универсальной совершенно не напрягает - считаю, успешно. Зря боялся, можно сказать. Буду портировать на Ардуино, т.к. им я нынче активно пользуюсь - тоже выигрыш в размере кода будет, очевидно.
  3. Хм... Пример из Energia IDE заработал через USB с повёрнутыми джамперами. Впрочем, подозреваю, что там используется не модуль UART, а софтовая эмуляция. Но по большому счёту это не должно иметь особого значения, ведь в конечном счёте сигналы-то те же, просто в эмуляции генерируются процессором, а не встроенным модулем. UPD появился-таки вывод и из моей тестовой программки в IAR. Ещё немного исследований - и могу приступать к созданию прикладных функций
  4. А куда оно его выводит-то? В обычном С - на консоль, а в микроконтроллерах? Я уже говорил, что я очень мало знаю о программировании? Пока что пытаюсь разобраться в выводе на последовательный порт на чужих примерах... если сумею хотя бы одну конкретную букву отправить - может, и займусь реализацией собственной подпрограммы вывода, а то у языка ардуино, конечно, вместо порога вхождения канава вхождения, но результирующий код таких размеров, что пользуйся я им, ничего не втиснул бы даже в Nano с 32kb кодовой памяти, не то что в MSP с 16... Например, в качестве необразованного неспециалиста - есть чем гордиться: благодаря курению мануалов и смекалке сумел сам написать алгоритмы для записи и чтения eeprom для ардуино и flash для MSP с бережным отношением к ресурсу перезаписей. Особенно интересно было с MSP, т.к. переменных на постоянку хранится аж 4 штуки, и в отличие от ардуино, нельзя отдельный байт стереть и записать заново. И места код занял гораздо меньше, чем на ардуинском языке. Так что может быть, и правильно - самому делать. Но библиотеки, возможно, помогли бы разобраться, что к чему. А разберусь на MSP - думаю, на Ардуино смогу портировать достаточно легко (уже убедился с тем кодом, который писал раньше) UPD с помощью примера из сети сумел передать буковку. Через пины 1.1 и 1.2. Хорошо бы понять, как ту же буковку передать через USB... UPD2 вроде как пишут, что достаточно развернуть джамперы... но результата - ноль...
  5. Я попытался. Знаний не хватает, я вообще-то на очень поверхностном уровне всё это знаю. Не моя тема вообще-то. Я не программист, я так, поднахватавшийся. "- Пациент, почему вы сбежали из операционной? - Сестра сказала, что аппендэктомия - самая простая операция... - Так и есть! - Но сказала-то не мне, а молодому хирургу с дрожащими руками!" Как подумаю о том, что надо не только задать нужные параметры блоку UART, а ещё и написать функции, чтобы он превращал строки в буковки, посылал буковки в нужном порядке и т.д. - сразу перестаёт хотеться разбираться, как оно работает. Я через таймер-то с трудом прорвался... Объективно - никакого не нужно Я себе чисто для практического применения сообразил, как задействовать МК, валяющийся со времён безуспешной попытки учиться. Проектик по оснащению автоматикой стеклоподъёмников в Кангу (они в комплекте совсем базовые) начался с MSP, переехал на Ардуино и оброс дополнительными функциями, Ардуино за неимением программатора отлаживаю через вывод на серийный порт. Вот, подумал, что неплохо бы всё-таки и MSP430 научить хоть как-то похожий вывод делать. Пока что получилось только из Energia хоть что-то вытянуть (и то: в отличие от Ардуино, он на "свой" USB ничего не вывел, пришлось внешний COM2USB задействовать, благо тоже валялся давно). Но и там не то, чего я ожидал, скажем так. И если в IAR можно хотя бы в контекстном меню перейти к декларации той или иной инструкции и попытаться понять, что к чему, то в Энергии и этого нет. Вот и подумал - может, есть "готовое" решение, чтобы не самому с нуля строить...
  6. Ох, снова я с вопросом, подозреваю, давно имеющим ответ, но что-то не могу найти ничего внятного, так что всё-таки задам: Существует ли библиотека для IAR MSP430, являющаяся аналогом библиотеки Serial для Arduino? Или может быть, кто-то может подсказать, как перетащить библиотеку Serial из Energia IDE в IAR? Самому с нуля писать набор функций, воспроизводящих необходимый функционал, может, и правильно, но очень уж муторно...
  7. Тоже, кстати, догадываюсь, почему (проверять не охота, но звучит достоверно): в первую попытку я писал analogRead(A7), а он, видимо, не смог преобразовать это в 21...
  8. Стоп. Тьфу. Он же срезал передний 0 с ADMUX! (ворона я, не посчитал биты). То есть, да, выходит, что нужно использовать REFS1/0 = 01! UPD: Да! Заработало, как надо (и 18 байт экономии после компиляции). Всем спасибо за подсказки!
  9. Правый верхний угол контроллера, сразу под джамперами. Никуда не подключен. Если об этом речь. Если речь о внутренней логике контроллера - простите, ничего не могу сказать. Я уже писал, что не очень понимаю на таком уровне. Для интересу набросал программку с выводом значений регистров на серийный порт. До вызова analogRead: ADCSRA = 0 ADMUX = 0 После (в бинарном представлении): ADCSRA = 10010000 ADMUX = 1000111 Интересно, что в datashit комбинация REFS1/0 = 10 указана, как зарезервированная В приведённом коде analog_refrence = DEFAULT, а DEFAULT (тоже где-то в библиотеках ардуино накопал) определена как 0. 01 и 11 подразумевают наличие внешнего конденсатора на пине AREF, которым я вообще не пользуюсь. 10 зарезервирован (хотя, как я писал выше, ардуино выдаёт именно такое значение регистра). Что именно нужно?
  10. Хм... очень странно... В первую попытку приложенный ниже код не сработал - а теперь да (соответственно, вместо уродца вызов стандартной функции языка Ардуино - гораздо пристойней, возможно, на этом можно и остановиться на первый случай): int main() { while (1) { unsigned char pin=21; unsigned int acd_r; ADCSRA |= (1 << ADEN); acd_r=analogRead(pin); ADCSRA &= ~(1 << ADEN); Serial.begin(115200); Serial.print("Result = "); Serial.println(acd_r); Serial.end(); for (volatile unsigned int i=1000000; i>0; i--); } return 0; }
  11. Воткнул в виде уродца в основную программу - судя по всему, работает (там нет вывода на серийный порт - в зависимости от данных датчика должно срабатывать или не срабатывать реле, частота опроса тоже зависит значения от последнего замера). Но хотелось бы всё-таки понять, что именно делает с регистрами функция analogRead (и/или сама среда Arduino IDE), и воспроизвести это в "пристойном" варианте.
  12. Подключение вот такое: Функция analogRead(); использует, если верить источникам, значения REFS1, REFS0 по умолчанию (0). Как я понимаю, любые другие значения требуют дополнительного подключения внешнего конденсатора и подключения датчика на AREF вместо 5V. В библиотеке wiring_analog.c от Arduino IDE код выглядит Судя по тому, что я понимаю оттуда - менять значения этих битов мне не следует (экспериментировать наугад точно не хочу - как бы чего не спалить). Надо признать, что я понятия не имею,что выставляет Arduino IDE, (видимо, нужные значения, что доказывается тем, что работает мой уродец с функцией setup), поэтому как раз и предпочитаю не трогать то, что трогать не надо. Делители перепробовал все - без результата. Опять же, опирался на datasheet и на описание функции analogRead, приведённое выше. Только А6 и А7, остальные заюзаны, как цифровые входы/выходы (разумеется, не здесь, а в целевой программе). Возможно, стоит ещё раз подчеркнуть, что даже с тем уродцем, которого я написал через функцию setup(); (см. выше) датчик работает исправно
  13. Пока что сумел заставить работать вот такого монстрика, но это же уродское уродство... Хорошо бы всё-таки найти адекватное решение... unsigned char pin=20; unsigned int acd_r; int main() { ADCSRA |= (1 << ADEN); while (1) { setup(); Serial.begin(115200); Serial.print("Result = "); Serial.println(acd_r); Serial.end(); } return 0; } void setup() { acd_r=analogRead(pin); }
  14. Я сам не очень это дело понимаю, но судя по тому, что я прочёл про работу функции analogRead(); - там используется такое же опорное напряжение, и подключение одно и то же. Спасибо за поправку. Там, где оно будет использоваться, оно будет включаться по требованию и выключаться для экономии. Написал так, потому что первое преобразование занимает больше циклов - для воспроизведения условий. Не принципиально. Вынес - результат тот же. 1. Нет потенциометра. Скорее всего, меняться не будут: что-то не так в коде, если с ардуиновским датчик работает исправно, а с этим - нет. 2. Способна. И в ардуиновском коде, и в моём выводит 1023 и меньшие, а большего быть не может, преобразователь десятибитный. Видимо, чтобы понять, что не так, нужен кто-то, кто знает, что именно делает ардуиновский код, и чем это отличается от кода, который написал я (моих весьма скромных знаний не хватает, чтобы понять, что там в ардуиновских библиотеках написано, и воспроизвести это в С...)
  15. Уж извините, что снова прошу подсказки. Безуспешно пытаюсь понять, почему вот этот код в Arduino IDE не работает (писал по даташит): int main() { unsigned int result_l, result_h, result; unsigned char pin=7; while (1) { ADCSRA |= (1 << ADEN); // ADC Enable ADCSRA |= (1 << ADPS0) | (1 << ADPS1) | (1 << ADPS2); // ADC Prescaler CLK/128 ADMUX = pin; // ADC Source ADCSRA |= (1 << ADSC); // Start conversation while (bit_is_set(ADCSRA, ADSC)); // Wait for conversation end ADCSRA |= (0 << ADEN); // ADC Disable result_l = ADCL; // Get ADC LOW Byte result_h = ADCH; // Get ADC HIGH Byte result = result_l + result_h * 256; // Output Serial.begin(115200); Serial.print("Result = "); Serial.println(result); Serial.end(); for(volatile unsigned long int i=200000; i>0; i--); } return 0; } Ардуиновский отлично выводит на серийный порт данные с датчика влажности (с хорошей точностью: сухой - 1023, пальцами дотрагиваюсь - 1000-900, воду капаю - в зависимости от количества - 500-300): void setup() { Serial.begin(115200); } void loop() { int result = analogRead(A7); Serial.print("Result = "); Serial.println(result); delay(1000); } а нужный - выводит практически всё время 1023, пару раз удалось добиться хоть каких-то изменений в показаниях, при залитом датчике, но даже и это теперь не получается... Необходимо именно через регистры, мне в другую программу вставлять (а из main функция analogRead(); вообще нули выводит). Пробовал менять значение делителя и порядок операторов. Чего тут ещё не хватает-то?