Перейти к содержанию

LEVV2006

Members
  • Постов

    398
  • Зарегистрирован

  • Посещение

  • Победитель дней

    1

LEVV2006 стал победителем дня 17 марта 2015

LEVV2006 имел наиболее популярный контент!

Информация о LEVV2006

  • День рождения 10.11.1990

Контакты

  • Skype
    LEVV2008

Информация

  • Пол
    Мужчина
  • Город
    Москва

Электроника

  • Стаж в электронике
    Не связан с электроникой
  • Сфера радиоэлектроники
    Микроконтроллеры, Усилители НЧ
  • Оборудование
    Matrix MOS-620CH
    Aoyue Int968A+
    DT860B+

Посетители профиля

5 719 просмотров профиля

Достижения LEVV2006

Энтузиаст

Энтузиаст (6/14)

  • 10 постов на форуме
  • Популярный Редкий
  • Неделя на форуме
  • Месяц на форуме
  • Год на форуме

Последние значки

166

Репутация

  1. Я сразу и не заметил что мы передаем адрес &uart Проверил. Ваш код работает!!!! Для оформления в библиотеку нужно немного подправить функции. В файл UART.c записываем так + функции FILE uart= FDEV_SETUP_STREAM(uart_putchar, uart_getchar, _FDEV_SETUP_RW); А в main.h добавляем это extern FILE* uart; И Все работает! И в итоге используем оригинальную stdio.h Всем Спасибо!
  2. Ну..... кое что у меня заработало. Суть проблемы. По умолчанию библиотека stdio.h заточена под 3 потока. (stdin, stdout, stderr). И следовательно для двухстороннего общения по 2 UART этого мало. Что сделал чтобы заработало. Файл stdio.h запрещен к изменению так как является частью среды разработки. Я сохранил копию файла stdio.h и добавил в свой проект под новым именем stdio_dual.h. Во всем проекте заменил stdio.h на stdio_dual.h. И внес в файл следующие изменения: Добавил 2 строчки //Было #define stdin (__iob[0]) #define stdout (__iob[1]) #define stderr (__iob[2]) //Добавил #define stdinsoft (__iob[3]) #define stdoutsoft (__iob[4]) Теперь спокойно можно организовать прием и передачу по 2 интерфейсам static FILE uart = FDEV_SETUP_STREAM(uart_putchar, uart_getchar, _FDEV_SETUP_RW); static FILE Soft_uart = FDEV_SETUP_STREAM(Soft_uart_putchar, Soft_uart_getchar, _FDEV_SETUP_RW); stdin=stdout=&uart; stdinsoft=stdoutsoft=&Soft_uart; Как читать и писать в порт fscanf(stdin,"%s",&StringUART); fprintf(stdout,"USART = %s\n",StringUART); fscanf(stdinsoft,"%s",&StringUART); fprintf(stdoutsoft,"Soft_USART = %s\n",StringUART); Подводные камни: Компилятор не мог найти эти переменные: stdinsoft и stdoutsoft. Мне пришлось их продублировать в main.h. Спустя некоторое время я решил их закомментировать и компилятор ругаться по новой не стал. При этом все продолжило работать. PS/ К сожалению пока тест проводился только на одном аппаратном UART. И частично на программном UART (Пока не могу добиться стабильной работы). Библиотека stdio.h достаточно мощная. И особо не требует громоздкого програмного кода от разработчика. Поэтому я и пользуюсь. Что касается места на МК. Да библиотека поджирает его. Ну и что? Я использую почти всегда 328р и мои проекты в редких исключением не превышают 20кб. Если не стоит цели экономии, то зачем этого делать?
  3. Всем привет! Для ввода и вывода данных по UART я использую библиотеку stdio.h и ей потоки. Но тут мне потребовалось в дополнений реализовать программный UART интерфейс. И возник такой вопрос. Как воспользоваться библиотекой stdio.h если её 2 стандартных потока (stdin и stdout) уже заняты аппаратным UART? А если например на МК есть 2 аппаратным UART. Как быть в таком случае?
  4. Под нагрузкой 2,5в А что вы предлагаете вместо AVR?......STM? Там с ума сойдешь пока разберешься! Кроме того для моих задач AVR c запасом и даже БОЛЬШЕ!
  5. Всем привет! Давно разрабатываю проект беспроводного и живучего датчика температуры. Вообще изначально я хотел найти готовое устройство с понятным интерфейсом взаимодействия. Что бы без гемороя и танцев с бубном можно было подключать датчик температуры к любому проекту (Как пример: часы на ГРИ или ВЛИ) и просто выводить температуру. К сожалению ничего вменяемого я не нашел. Либо датчики используются в закрытой эко-системе. Либо это BLE с которым вообще не понятно как работать ибо информации почти нет. Решил попробовать разработать такую вещь самостоятельно. Конечно это изобретение велосипеда, но лично для себя я практиковался с BME280, nrf24l01 и сном МК. Как минимум тут выгода есть Вот что получилось. Приемник и передатчик. Немножко информации. Приемник: МК (328p) + USB to COM (CP2102) ____ (Дополнительно светодиод и расшивка SPI) частота 8MHz от внутреннего кварца Передатчик: МК (328p) + BME280 + nrf24l01 + бат CR2032 +Опорное напряжение ____ (Дополнительно светодиод и расшивка SPI, uart, кнопка) частота 1MHz от внутреннего кварца Что по потреблению: Очень долго пытался понять по мультиметру, но он постоянно как то врал. При первом сне показывал 40мкА, а потом с каждой итерацией сна прибавлял +10мкА. В общем поставил стрелочный прибор на 100мкА По прибору. ЕСЛИ ВСЕ ШТАТНО РАБОТАЕТ!!!!! Во время сна стрелка лежит в 0. При измерении и отправке 70-100мкА. Но стрелка мгновенно дергается и потом сразу в 0. ВОТ Дальше я зашел в тупик! И мне нужна ваша помощь! 1) У меня в СОМ порт постоянно летят логи программы и как выяснилось это очень много жрет энергии. Странность вот в чем. Если вытащить провода Тх, Rx то МК как бы зависает несколько секунд для отправки пакета.... скажите разве у UART есть подтверждение отправки пакета? 2) Я решил убрать вообще весь код UART. И все равно если убрать провода Тх, Rx то зависание присутствует (Зависание я фиксирую на стрелочном приборе. Как максимальное потребление и неуход в сон). PS/ питаю все от 3,3в с платы конвектора 3)Теперь я подключаю батарейку она у меня немного подсевшая 2,8в, Но я планировал что устройство должно работать до 2в! . Раз я отключил UART, то решил использовать светодиод как метку как выполняется код. И вот еще САМАЯ СТРАННАЯ проблема. Программа не стартует! Вообще. Идет большое потребление тока, но светодиод не горит. Почему так происходит? ___________________________________________(У меня есть предположение что это бутлоадер как то не так себя ведет..... ) PS/ в Фьюзах я отключил отслеживание питания.
  6. Главное сам разобрался! Будет теперь наука
  7. ПОБЕДА! Но не совсем моя конечно..... 1) Я вносил изменения в Toolchain чтобы корректно отображался вывод числа с плавающей точкой. Зря я это делал..... Он давал кривой подсчет температуры. (Правда температура у меня почему то все равно отрицательная....) PS: нашел причину!!!! Не правильно производил чтение регистров. Младший байт задвигал на место старшего (не до разобрался в даташите ). (Я вообще не программист- это хобби по вечерам ). Температура заработала как надо! Но доделывать я свой код не буду сторонний мне понравился больше. 2) Совершенно случайно наткнулся на этот сайт. Библиотека с сайта стартанула СРАЗУ! и все заработало. Наконец то что то заработало без танцев с бубном! Кстати очень интересно (на мой взгляд) написан код! И весит он совсем не много Program Memory Usage : 6344 bytes 19,4 % Full Data Memory Usage : 125 bytes 6,1 % Full В общем прикладываю проект к этому сообщению + часть даташита на русском (может кому то будет интересно) bme280 Рус.DOCX BME280Term.rar
  8. Не у кого нет библиотеки........? Странно.... ну ладно. Я то продолжаю разбираться самостоятельно. Я частично (используя гугл) перевел даташит. Кое что узнал интересное и полезное. Решил разбираться с датчиком по частям и начать с температуры. Убрал из библиотеки все лишнее и оставил только температуру. Код отрабатывает. Но блин!!!!!! температура рассчитывается не верно! Что заметил: int32_t adc_T=bme280_read3Byte(BME280_REGISTER_TEMP_DATA); //Считываю регистры температуры. (прям по даташиту) printf("adc_T %x\n",adc_T); // Вывожу что считал с резисторв //adc_T a530 (к примеру такой ответ) adc_T >>= 4; //Сдвик на 4 в право так как там нули и эти бити не используются (по даташиту) printf("adc_T>> %x\n",adc_T); //adc_T>> 4a53 (а на деле вот такой ответ. Откуда 4 взялась?????) В общем я не знаю что за фигня твориться.... Толи числа большие и идет где то идет наслоение в оперативной памяти, то ли компилируется что то криво.... Других объяснений нет. Данные по другим резисторам: CHIPID 0x60 dig_T1 f270 dig_T2 56a dig_T3 3200 adc_T a890 adc_T>> 4a89 Temperature -29.21
  9. Всем привет! Порция очередных сложных вопросов от меня . Что то я совсем не соображу что не работает.... Подключаю датчик BME280 к Atmega328p 16МГц. Для работы с датчиком естественно требуется библиотека. Поискав в интернете я нашел (вроде как) рабочий вариант. Да еще и с примером! Всё это дело я скачал, скомпилировал и попробовал запустить. Итог предсказуем. Ничего не заработало и в первую очередь не стартанула библиотека I2C. Решил что будет надежнее написать самостоятельно попутно разбираясь в коде библиотеки. Библиотеку I2C я использовал свою проверенную :) ,а далее я вооруженный даташитом на BME280 адаптировал скачанную библиотеку для BME280. В целом ничего сложного нет. За вечер получилось все привести в норму. Считываются данные с регистров, ID датчика совпадает с даташитом. Кажется что все работает нормально. Но нет. Проблема в следующем: (Для теста я считываю только показатели температуры) 1) Не верные значения температуры. Причем любое не значительное изменение кода (не в формуле) влечет изменение показателя температуры. 2) Температура не изменяется. Все время в порт выводится одно и тоже. Она изменится если только что нибудь поменять в коде и перезалить прошивку. В чем может быть проблема? У кого нибудь есть уже проверенная и рабочая библиотека? main: I2C: BME280:
  10. Нашел причину зависания. У меня кроме часов на плате есть датчик температуры\влажности. В общем или я его перегрел когда впаивал или это из того что флюс из под датчика не вымылся. Я отпаял датчик и вроде все заработало.... Правда часы какую то чушь пишут... но хотя-бы контроллер не зависает. Буду дальше ковырять....
  11. Опять чудеса. Через каждую строчку кода прописал printf Код стал выполняться и добрался уже до библиотеке I2C. B Застрял в команде start... точнее в настройке TWCR = (1<<TWINT|1<<TWSTA|1<<TWEN); Что примечательно! Эту библиотеку я уже использовал в другом проекте и с тем же МК. Все работало....
  12. А можно поподробнее? Где это посмотреть\проверить?
  13. Я использую бутлоадер для загрузки прошивки. Настроен он так что запускается после нажатия кнопки ресет.
  14. IDE-AtmelStudio Watchdog - нет. Библиотека работы с I2C кривая - Выполнение кода не доходит до обращения к библиотеке. Режим отладки ? Не ? - Я не могу выбрать в настройках симулятор...
  15. Все привет! В очередной раз столкнулся с аномалией...... Пишу код опроса часов DS3231. Библиотеки есть, код написан (как мне кажется без ошибок), компилятор неначто не ругается. Заливаем. МК пытается стартовать..... А потом переключается на бутлоадер как будто после кнопки ресет.. Я немного сгруппировал код. Такой код выполняется (судя по монитору Сом пора) до строчки printf("0 (init_i2c)\n"); Дальше МК перезагрущается. Если код изменить так: То код выполняется как надо и программа продолжает работать. (Строчки printf("0 (init_i2c)\n"); и printf("1\n"); ) отрабатывают как надо. И значения переменным присваивается тоже нормально. Почему так происходит и куда копать? Вот из дизассемблера: Также заметил. Что при не рабочей версии кода иногда в Сом порте не полностью выводится сконтольная строка. Вместо: 0 (init_i2c) Может быть написана: 0 (init_i2c
×
×
  • Создать...