-
Постов
398 -
Зарегистрирован
-
Посещение
-
Победитель дней
1
Тип контента
Профили
Форумы
Блоги
Весь контент LEVV2006
-
Я сразу и не заметил что мы передаем адрес &uart Проверил. Ваш код работает!!!! Для оформления в библиотеку нужно немного подправить функции. В файл UART.c записываем так + функции FILE uart= FDEV_SETUP_STREAM(uart_putchar, uart_getchar, _FDEV_SETUP_RW); А в main.h добавляем это extern FILE* uart; И Все работает! И в итоге используем оригинальную stdio.h Всем Спасибо!
-
Ну..... кое что у меня заработало. Суть проблемы. По умолчанию библиотека 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кб. Если не стоит цели экономии, то зачем этого делать?
-
Всем привет! Для ввода и вывода данных по UART я использую библиотеку stdio.h и ей потоки. Но тут мне потребовалось в дополнений реализовать программный UART интерфейс. И возник такой вопрос. Как воспользоваться библиотекой stdio.h если её 2 стандартных потока (stdin и stdout) уже заняты аппаратным UART? А если например на МК есть 2 аппаратным UART. Как быть в таком случае?
-
Под нагрузкой 2,5в А что вы предлагаете вместо AVR?......STM? Там с ума сойдешь пока разберешься! Кроме того для моих задач AVR c запасом и даже БОЛЬШЕ!
- 8 ответов
-
- nRF24L01+
- atmega328p
-
(и ещё 1 )
C тегом:
-
Всем привет! Давно разрабатываю проект беспроводного и живучего датчика температуры. Вообще изначально я хотел найти готовое устройство с понятным интерфейсом взаимодействия. Что бы без гемороя и танцев с бубном можно было подключать датчик температуры к любому проекту (Как пример: часы на ГРИ или ВЛИ) и просто выводить температуру. К сожалению ничего вменяемого я не нашел. Либо датчики используются в закрытой эко-системе. Либо это 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/ в Фьюзах я отключил отслеживание питания.
- 8 ответов
-
- nRF24L01+
- atmega328p
-
(и ещё 1 )
C тегом:
-
ПОБЕДА! Но не совсем моя конечно..... 1) Я вносил изменения в Toolchain чтобы корректно отображался вывод числа с плавающей точкой. Зря я это делал..... Он давал кривой подсчет температуры. (Правда температура у меня почему то все равно отрицательная....) PS: нашел причину!!!! Не правильно производил чтение регистров. Младший байт задвигал на место старшего (не до разобрался в даташите ). (Я вообще не программист- это хобби по вечерам ). Температура заработала как надо! Но доделывать я свой код не буду сторонний мне понравился больше. 2) Совершенно случайно наткнулся на этот сайт. Библиотека с сайта стартанула СРАЗУ! и все заработало. Наконец то что то заработало без танцев с бубном! Кстати очень интересно (на мой взгляд) написан код! И весит он совсем не много Program Memory Usage : 6344 bytes 19,4 % Full Data Memory Usage : 125 bytes 6,1 % Full В общем прикладываю проект к этому сообщению + часть даташита на русском (может кому то будет интересно) bme280 Рус.DOCX BME280Term.rar
-
Не у кого нет библиотеки........? Странно.... ну ладно. Я то продолжаю разбираться самостоятельно. Я частично (используя гугл) перевел даташит. Кое что узнал интересное и полезное. Решил разбираться с датчиком по частям и начать с температуры. Убрал из библиотеки все лишнее и оставил только температуру. Код отрабатывает. Но блин!!!!!! температура рассчитывается не верно! Что заметил: 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
-
Всем привет! Порция очередных сложных вопросов от меня . Что то я совсем не соображу что не работает.... Подключаю датчик BME280 к Atmega328p 16МГц. Для работы с датчиком естественно требуется библиотека. Поискав в интернете я нашел (вроде как) рабочий вариант. Да еще и с примером! Всё это дело я скачал, скомпилировал и попробовал запустить. Итог предсказуем. Ничего не заработало и в первую очередь не стартанула библиотека I2C. Решил что будет надежнее написать самостоятельно попутно разбираясь в коде библиотеки. Библиотеку I2C я использовал свою проверенную :) ,а далее я вооруженный даташитом на BME280 адаптировал скачанную библиотеку для BME280. В целом ничего сложного нет. За вечер получилось все привести в норму. Считываются данные с регистров, ID датчика совпадает с даташитом. Кажется что все работает нормально. Но нет. Проблема в следующем: (Для теста я считываю только показатели температуры) 1) Не верные значения температуры. Причем любое не значительное изменение кода (не в формуле) влечет изменение показателя температуры. 2) Температура не изменяется. Все время в порт выводится одно и тоже. Она изменится если только что нибудь поменять в коде и перезалить прошивку. В чем может быть проблема? У кого нибудь есть уже проверенная и рабочая библиотека? main: I2C: BME280:
-
Нашел причину зависания. У меня кроме часов на плате есть датчик температуры\влажности. В общем или я его перегрел когда впаивал или это из того что флюс из под датчика не вымылся. Я отпаял датчик и вроде все заработало.... Правда часы какую то чушь пишут... но хотя-бы контроллер не зависает. Буду дальше ковырять....
-
Опять чудеса. Через каждую строчку кода прописал printf Код стал выполняться и добрался уже до библиотеке I2C. B Застрял в команде start... точнее в настройке TWCR = (1<<TWINT|1<<TWSTA|1<<TWEN); Что примечательно! Эту библиотеку я уже использовал в другом проекте и с тем же МК. Все работало....
-
А можно поподробнее? Где это посмотреть\проверить?
-
Я использую бутлоадер для загрузки прошивки. Настроен он так что запускается после нажатия кнопки ресет.
-
IDE-AtmelStudio Watchdog - нет. Библиотека работы с I2C кривая - Выполнение кода не доходит до обращения к библиотеке. Режим отладки ? Не ? - Я не могу выбрать в настройках симулятор...
-
Все привет! В очередной раз столкнулся с аномалией...... Пишу код опроса часов DS3231. Библиотеки есть, код написан (как мне кажется без ошибок), компилятор неначто не ругается. Заливаем. МК пытается стартовать..... А потом переключается на бутлоадер как будто после кнопки ресет.. Я немного сгруппировал код. Такой код выполняется (судя по монитору Сом пора) до строчки printf("0 (init_i2c)\n"); Дальше МК перезагрущается. Если код изменить так: То код выполняется как надо и программа продолжает работать. (Строчки printf("0 (init_i2c)\n"); и printf("1\n"); ) отрабатывают как надо. И значения переменным присваивается тоже нормально. Почему так происходит и куда копать? Вот из дизассемблера: Также заметил. Что при не рабочей версии кода иногда в Сом порте не полностью выводится сконтольная строка. Вместо: 0 (init_i2c) Может быть написана: 0 (init_i2c
-
Когда я писал алгоритм на С у меня была проблема с первым светодиодом. Он всегда загорался разным цветом, а остальные горели нормально...... Вот я и искал библиотеку. Хорошо что у вас заработало сразу!
-
Если подключить логически анализатор то вы увидите что код написанный на С выполняется дольше чем нужно. И во временные рамки протокола вам не попасть!!! Сам пробовал..... Единственный и нормальный выход из ситуации использовать стороннюю библиотеку. Прикрепил файл. Библиотека маленькая и понятная. Я её использую и по логическому анализатору все четко по временным рамкам. light_ws2812_AVR.rar
-
Извините что вмешиваюсь. Всю ветку не читал. НО яркость на своих диодах я меняю одной строчкой. 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] - Яркость.
-
Приветствую всех! Потихоньку изучаю контроллер 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 в диспетчере устройств?
-
Починил! @DrobyshevAlex Большое Спасибо за помощь! Было дело в конденсаторе. Стоял конденсатор на 45 pF. Поставил 220pF и все заработало! Питание я проверил сразу. Все было в норме. Для конечных устройств я естественно делаю плату. А на макете использую Arduino Nano. Очень удобная вещь на мой взгляд. Весть обвес для МК + USB-Uart + удобно вставляется в макетку.
-
Это первое что я сделал В общем я нашел что если положить палец на плату в этом месте то все начинает работать. Китайцы...... Что теперь только с этим делать?........
-
МК точно не может быть причиной проблемой так как с обычными модулями (без антенны) все работает стабильно. Зависает на моменте чтения данных. i = radio.write(&data, sizeof(data)); С этим я тоже недавно намучился Поиск в интернете говорит о том что проблема может быть в схемотехники модуля...........
-
Всем Привет! Возникли проблемы с радиомодулем 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? )
-
Да. Нашел это в Даташите. Большое Спасибо за помощь! Но второй вопрос пока не решен . SS я сконфигурировал как выход и подтянул его к 1. Одно устройство я подключить смогу. А как мне подключить второе устройство? Я завел ещё SPI_SSS на PORTB пин 0 и также сконфигурировал на выход и подтянул к 1. Но передать данные на SPI_SSS не удается.......