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

LEVV2006

Members
  • Постов

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

  • Посещение

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

    1

Весь контент LEVV2006

  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
  16. Когда я писал алгоритм на С у меня была проблема с первым светодиодом. Он всегда загорался разным цветом, а остальные горели нормально...... Вот я и искал библиотеку. Хорошо что у вас заработало сразу!
  17. Если подключить логически анализатор то вы увидите что код написанный на С выполняется дольше чем нужно. И во временные рамки протокола вам не попасть!!! Сам пробовал..... Единственный и нормальный выход из ситуации использовать стороннюю библиотеку. Прикрепил файл. Библиотека маленькая и понятная. Я её использую и по логическому анализатору все четко по временным рамкам. light_ws2812_AVR.rar
  18. Извините что вмешиваюсь. Всю ветку не читал. НО яркость на своих диодах я меняю одной строчкой. ws2812_buff=(uint8_t)((double)DataArray[i+3]*(((double)DataArray[2]*25.0+1.0)/255.0)); Данный приходят с ПК в виде R (0-254), G (0-254), B (0-254) И яркости (0-100) ws2812_buff - буфер цвета DataArray[i+3] - Код цвета. DataArray[2] - Яркость.
  19. LEVV2006

    Bootloader для Atmega32u4

    Приветствую всех! Потихоньку изучаю контроллер Atmega32u4. Все вроде нормально, но вот bootloader срабатывает как то через раз. По нескольку раз приходится нажимать на кнопку ресет. Изначально (прям с завода) в МК был залит bootloader от Arduino Leonardo. При сбросе МК в диспетчере устройств так и писалось Arduino Leonardo COM - порт такой то. Я сильно заморочился и выяснил что исходники bootloaderа лежат вместе с самой ARDUINO IDE. И основаны они на библиотеке LUFA-111009. Ближе к делу. Используя LUFA-111009 + WinAVR-20100110 я пересобрал bootloader и теперь все работает нормально. НО в процессе правки кода я изменил PID и VID устройства, а также названия устройства (Вместо arduino leonardo установил 32u4 Bootloader). Прошил МК. Сам bootloader работает стабильно, но в диспетчере устройств почему то вместо моего названия ("32u4 Bootloader") написано "Устройство с последовательным интерфейсом USB", а в свойствах Модель:32u4 Bootloader. Хотя если подключить arduino leonardo, то так и определяется как arduino leonardo. Как сделать чтобы при активации моего bootloaderа было написано 32u4 Bootloader в диспетчере устройств?
  20. LEVV2006

    nrf24l01+pa+lna

    Починил! @DrobyshevAlex Большое Спасибо за помощь! Было дело в конденсаторе. Стоял конденсатор на 45 pF. Поставил 220pF и все заработало! Питание я проверил сразу. Все было в норме. Для конечных устройств я естественно делаю плату. А на макете использую Arduino Nano. Очень удобная вещь на мой взгляд. Весть обвес для МК + USB-Uart + удобно вставляется в макетку.
  21. LEVV2006

    nrf24l01+pa+lna

    Это первое что я сделал В общем я нашел что если положить палец на плату в этом месте то все начинает работать. Китайцы...... Что теперь только с этим делать?........
  22. LEVV2006

    nrf24l01+pa+lna

    МК точно не может быть причиной проблемой так как с обычными модулями (без антенны) все работает стабильно. Зависает на моменте чтения данных. i = radio.write(&data, sizeof(data)); С этим я тоже недавно намучился Поиск в интернете говорит о том что проблема может быть в схемотехники модуля...........
  23. LEVV2006

    nrf24l01+pa+lna

    Всем Привет! Возникли проблемы с радиомодулем nrf24l01+pa+lna (nrf24l01+ усилитель + антенна). Но обо всем по порядку. Задумал я небольшой проект для освещения и чтобы быстро проверить дальность связи я собрал проект на обычном модуле nrf24l01 и написал программу на Arduino Использовал библиотеку RF24.h а настройки модуля такие: radio.setDataRate (RF24_1MBPS); // Указываем скорость передачи данных (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS) radio.setPALevel (RF24_PA_MAX); // Указываем мощность передатчика (RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_HIGH=-6dBm, RF24_PA_MAX=0dBm) На стандартных модулях все работало нормально, но на большом расстоянии передача данных происходила с ошибками. И я решил купить модули с антенной. И вот возникла проблема. Данные модули при таких настройках не работают. МК зависает и все. Они начинаю работать когда изменишь настройки на: radio.setDataRate (RF24_1MBPS); radio.setPALevel (RF24_PA_MIN); <---------------------------------- Но это не выход так как дальность по прежнему никакая. Было ли у кого ни будь подобная проблема? В чем может быть причина? (И на будущее есть ли у кого ни будь рабочая библиотека на С под модуль nrf24l01? )
  24. А все! Разобрался (Был не внимателен при подключении проводов)! Пора отдыхать. За целый день уже глаз замылился. Все спасибо за помощь! Все работает. По SS вот здесь хорошо написано.
  25. Да. Нашел это в Даташите. Большое Спасибо за помощь! Но второй вопрос пока не решен . SS я сконфигурировал как выход и подтянул его к 1. Одно устройство я подключить смогу. А как мне подключить второе устройство? Я завел ещё SPI_SSS на PORTB пин 0 и также сконфигурировал на выход и подтянул к 1. Но передать данные на SPI_SSS не удается.......
×
×
  • Создать...