-
Постов
264 -
Зарегистрирован
-
Посещение
Весь контент Serega Doc
-
Плата для разработки на ARM Olimex
Serega Doc ответил Serega Doc тема в Продам
Срочно продам. Возможен торг. -
Плата для разработки на ARM Olimex
Serega Doc опубликовал тема в Продам
Доброго всем времени суток. Нашел у себя в заначке плату SAM7-EX256. Абсолютно новая (пару раз меняли тестовую прошивку). Подробности конфигурации платы: Отладочная плата фирмы OLIMEX. Установлен микроконтроллер AT91SAM7X256 ARM7TDMI-S. Плата позволяет разработчику загружать через порт USB или RS-232 пользовательскую программу, подключать внешний JTAG-эмулятор. На плате установлены все необходимые для быстрого старта компоненты. микроконтроллер AT91SAM7X256: ARM7TDMI-S™ 16/32 бит, 256кБ Flash-памяти программ, 64кБ ОЗУ, Ethernet 10/100, USB 2.0, CAN, часы реального времени, 10-битный АЦП 384ksps, ЦАП, 2 порта UART, I2C (TWI), SPI, три 32-битных таймера, SSC, DMA, ШИМ (четыре выхода), «WatchDogTimer», 5В совместимые входы/выходы, работоспособность до 60МГц (встроенный PLL); 18,432МГц кварцевый резонатор; JTAG-коннектор 2x10 пин, ARM-JTAG (Wiggler) совместимый; 128x128 TFT 12 бит цветной ЖКИ; Ethernet 10/100 PHY на базе KSZ8721BL; держатель карт MMC/SD; два порта RS-232 и USB интерфейс; аудио-интерфейс: стерео вход (микрофон) и стерео выход на наушники; две пользовательские кнопки и джойстик; напряжение питания 9V DC, 6V AC; термистор, подключённый к АЦП; разъём для внешнего источника питания; установленный регулятор на 3,3В с выходным током до 800 мА; свободные выводы микроконтроллера доступны на IDC разъёмах; размеры: 128 x 98мм Новая стоит порядка 160$ Свою отдам за 100$ или 800 грн. Я нахожусь в Одессе - Украина. Тел: 067 488 75 44 E-mail: [email protected] -
- поясните пожалуйста. Не понял что имеется в виду. Тестирование в не целевом окружении возможно лишь для задач не зависящих от железа как Если же существует контроллер с обвеской: регистры, ключи, кнопки, LCD экраны и прочее. И тестирование нужно проводить с учетом нюансов электронной схемы. Подскажите насколько правильна вот такая структура формирования тестов: И тогда можно получать информацию о прохождении тестов либо в симуляторе (например Протеус) либо в реальной плате + терминал COM порта.
-
А вы под какую платформу используете googletest? И как вы интегрировали эти тесты с компилятором для железа? Что бы запускать их непосредственно из среды в которой пишем программу. Если можно то по подробнее пожалуйста.
-
TDD для микроконтроллеров
Serega Doc опубликовал тема в GNU/OpenSource средства разработки
Доброго всем дня. Наткнулся на статьи Развитие в направлении разработки встроенных систем и Эффективная разработка встроенного ПО через тестирование про модульное тестирование для встроенных систем. Хочу уточнить есть unit тесты и mock объекты для компиляторов под AVR/STM8? Что бы свою программу на с++ можно было покрывать тестами. Вести разработку ПО максимально отделив логику от уровня железа. И при этом не испытывать проблем или же минимизировать вопросы перехода с одной платформы на другую. Как например есть программа для контроллера AVR и по каким либо причинам (дефицит, цена, характеристики) решили перейти на STM8. Переписываем классы взаимодействия с аппаратурой контроллера и в минимальные сроки получаем работоспособную (не проваливающую тесты) программу. -
Как ПРАВИЛЬНО программировать на С++
Serega Doc ответил Serega Doc тема в Программирование
Можно и два списка по 32. Вопрос не в этом. Обычно на spi все регистры висят последовательно. Как два списка будут работать с одной колбаской из 8-ми регистров? скажем даже так есть два регистра IN и два OUT. Можно ли описать их двумя списками по 16 бит, но при этом что бы списки по SPI работали каждый со своими регистрами? -
Как ПРАВИЛЬНО программировать на С++
Serega Doc ответил Serega Doc тема в Программирование
to neiver Добрый день. Можешь посоветовать как описать набор из n регистров 74HC595(выходы) и 74HC597(входы) для работы с произвольными pin этого набора. Если в связке будет до 8 регистров или 64 входа/выхода в зависимости от конкретной схемы. В статье описано как работать с одним регистром. А вот как описать пины для большей разрядности не понятно. Заранее спасибо. .... Кажется понял template<class ClockPin, class DataPin, class LatchPin, unsigned ID, class T = uint8_t> class ThreePinLatch { public: typedef T DataT; // нужен для сортировки портов в списках линий enum{Id = ID}; //разрядность регистра enum{Width=sizeof(DataT)*8}; // запись значения static void Write(T value) { _currentValue = value; for(uint8_t i=0; i < Width; ++i) { DataPin::Set(value & 1); ClockPin::Set(); value >>= 1; ClockPin::Clear(); } LatchPin::Set(); LatchPin::Clear(); } static DataT Read() { return _currentValue; } static void ClearAndSet(DataT clearMask, DataT value) { Write(_currentValue = (_currentValue & ~clearMask) | value); } static void Set(DataT value) { Write(_currentValue |= value); } static void Clear(DataT value) { Write(_currentValue &= ~value); } static void Togle(DataT value) { Write(_currentValue ^= value); } static void DirWrite(DataT value) { /*не можем менять направление*/ } static DataT DirRead() { return 0xff; //всегда выход } static void DirSet(DataT value) {/* не можем менять направление */} static void DirClear(DataT value) {/* не можем менять направление */ } static void DirTogle(DataT value) {/* не можем менять направление */} protected: // текущее значение в регистре static DataT _currentValue; }; template<class ClockPin, class DataPin, class LatchPin, unsigned ID, class T> T ThreePinLatch<ClockPin, DataPin, LatchPin, ID, T>::_currentValue = 0; и объявление из статьи typedef ThreePinLatch<Pa0, Pa1, Pa3, 'R1'> ShiftReg1; typedef TPin<ShiftReg1, 0> Rg0; typedef TPin<ShiftReg1, 1> Rg1; typedef TPin<ShiftReg1, 2> Rg2; typedef TPin<ShiftReg1, 3> Rg3; typedef TPin<ShiftReg1, 4> Rg4; typedef TPin<ShiftReg1, 5> Rg5; typedef TPin<ShiftReg1, 6> Rg6; typedef TPin<ShiftReg1, 7> Rg7; но можно же определять сдвиговый регистр как typedef ThreePinLatch<Pa0, Pa1, Pa3, 'R1', unsigned long> ShiftReg1; typedef TPin<ShiftReg1, 0> Rg0; typedef TPin<ShiftReg1, 1> Rg1; typedef TPin<ShiftReg1, 2> Rg2; typedef TPin<ShiftReg1, 3> Rg3; typedef TPin<ShiftReg1, 4> Rg4; typedef TPin<ShiftReg1, 5> Rg5; typedef TPin<ShiftReg1, 6> Rg6; typedef TPin<ShiftReg1, 7> Rg7; ... typedef TPin<ShiftReg1, 27> Rg27; typedef TPin<ShiftReg1, 28> Rg28; typedef TPin<ShiftReg1, 29> Rg29; typedef TPin<ShiftReg1, 30> Rg30; typedef TPin<ShiftReg1, 31> Rg31; И немного переписать методы DataT Read() и void Write(T value) что бы обновлялись регистры значениями из переменной _currentValue и наоборот. Но тогда не вижу как можно сделать больше чем 32 пина? -
Как ПРАВИЛЬНО программировать на С++
Serega Doc ответил Serega Doc тема в Программирование
Решил все сделать через указатель на функцию. Огромное спасибо. Только вопрос в чем разница между кодом как привели Вы: class Bar { public: Bar(WriteFuncPtr func) :_func(func) {} и кодом который работает аналогично только занимает на 10 байт больше: class Bar { public: Bar(WriteFuncPtr func) { _func = func; } И если я передаю в конструктор два указателя на функцию. Как это описать? -
Как ПРАВИЛЬНО программировать на С++
Serega Doc ответил Serega Doc тема в Программирование
Добрый день. Есть вопрос по С++. В этом топике выше подымалась тема библиотеки статических классов по управлению портами. При работе с этой библиотекой возник вопрос. Можно ли различные списки пинов привести к какой либо ссылке что бы в классе который реализует одинаковую логику но для разных списков использовать просто указатель на список. Пример чего хочу: typedef PinList <Pb6, Pb7> TestList1; typedef PinList <Pb4, Pb5> TestList2; template <class lst> class A { public: unsigned char Read(void) { lst::Read(); } } class B { public: B(A *ptrA)(pA = ptrA;) unsigned char Calc(void) { unsigned char data; data = pA->Read(); // преобразования data; return data; } private: A *pA; } Но ничего не выходит потому что указатель класса B объявлен без списка параметров. Пока реализовал класс B с шаблоном по списку пинов, но не устраивает что несколько членов-методов которые работают с данными из шаблона дублируются столько раз сколько раз я определяю шаблон. Есть ли выход из данной ситуации. Или это оптимальное решение. Все компилирую на IAR. -
Спасибо большое. JMP изящнее на мой взгляд чем просто переходное отверстие с жестко нарисованной перемычкой. В таком вариате в процессе трассировки есть возможность выбора где проводить перемычку в TOP или BOTTOM. Лучше не получится.
-
Добрый день. Я могу купить на радио базаре Реле NPA-5A-DC12V и NPA2-5A-DC12V (pdf в приложении) Эти реле отличаются только положением одного вывода на корпусе. Можно ли нарисовать патерн что бы в нем два пада считались одним выводом в компоненте. Что бы не зависимо от того какое из реле есть в наличии спокойно паять на плату. Как вариант решил в патерн добавить переходное отверстие и к нему подвести дорожку от того пада который уже есть. Но мне кажется что это кривое решение. Подскажите как правильно p_npa_as5_05.pdf
-
Как ПРАВИЛЬНО программировать на С++
Serega Doc ответил Serega Doc тема в Программирование
Спасибо за рекомендации. inline я активно использую в header файле. И для данной функции это бессмысленно из-за дублирования кода. Я в принципе тоже так думал что нет такой возможности. Но надеялся что я чего-то не ведаю. Еще раз спасибо. -
Как ПРАВИЛЬНО программировать на С++
Serega Doc ответил Serega Doc тема в Программирование
Добрый день. Неожиданно был удивлен что здесь из-за такого вопроса получился холивар. Считаю что разработчик сам должен для себя решить на каком языке и с какой эффективностью он будет реализовывать проект. Так что считаю вообще спор бессмысленным. И прошу его прекратить. И если можно ответить еще на один вопрос. Можно ли каким либо образом сделать переход из одного метода класса в другой не вызовом его через Call а переходом через Jmp. Вернее что бы компилировалось так. А то сейчас у меня два метода которые возвращают один и тот же тип WatcherState Но при этом один просто выполняет проверки и возвращает значение Второй же более длинный по времени выполнения выполняет расчет и так же возвращает WatcherState Вот как я это пока написал if (Tvalue == TimerValue) { return Next(); } else { return WAIT; } Что можете посоветовать? -
Как ПРАВИЛЬНО программировать на С++
Serega Doc ответил Serega Doc тема в Программирование
Спасибо все заработало. Что бы не плодить тем буду в будущем писать сюда по вопросам проектирования. Жаль что мне самому не пришла идея использовать указатель на SPI. -
Как ПРАВИЛЬНО программировать на С++
Serega Doc ответил Serega Doc тема в Программирование
Это глупый вопрос который обсуждали миллион раз? -
Как ПРАВИЛЬНО программировать на С++
Serega Doc опубликовал тема в Программирование
Добрый день. Учусь программировать на С++. И иногда возникают вопросы в правильном проектировании классов. Сейчас описываю класс для работы с последовательными регистрами 74HC595. Уже есть класс для работы с SPI. Где инициализировать SPI блок AT Mega 168 в классе работы с регистром или же глобально во всей программе. Сейчас SPI будет использоваться только в регистрах. Но в будущем планирую параллельно регистрам подключить еще и FLASH память (еще один класс по работе с памятью FLASH) на SPI. Что посоветуете? Вдогонку PS И как правильно писать классы для регистров и FLASH наследовать от SPI или же внутри классов объявлять член класса SPI? -
C++ и работа с однотипной аппаратурой
Serega Doc ответил BAT тема в Программирование
Добрый день. По мотивам предыдущего поста написал работу с портом для АТМеги как с объектом (в приложении) Смущает очень сильно быстродействие того что я написал (с++ только начинаю изучать так что прошу совета как писать правильно). Инициализация объекта: portio pb (IOPORTB, IODDRB, IOPINB); // 130 тактов LOW, 129 MEDIUM и 25 HIGH оптимизация не зависит от вида по скорости или по объему. Перевод порта в Z состояние pb.portz(); // 65-LOW 64-MEDIUM 17-HIGH Можно ли писать более оптимально по скорости изначально? И как написать конструктор структуры что бы не было холостой инициализации на нулевой адрес? M48M88M168.zip -
Сложная тема.AVR __io область как параметр функции
Serega Doc ответил dormouse тема в AVR
Вот что с оптимизацией 13 void Set_Port(uchar PortNumber, uchar BitNumber) ??Set_Port: // 14 { // 15 *((uchar*)PortNumber) |= BitNumber; MOV R30, R16 LDI R31, 0 LD R16, Z OR R16, R17 REQUIRE ?Subroutine0 ; // Fall through to label ?Subroutine0 // 16 } RSEG CODE:CODE:NOROOT(1) ?Subroutine0: ST Z, R16 RET // 17 Но операция ST Z, R16 никогда не будет оптимизироваться в OUT 0x18, R16 Первое работа с ОЗУ второе с I/O. Так что описанный выше метод вообще не подходит. Да и врядли вообще можно написать что то требуемое потому как в ассемблере IN и OUT конструкции используются с константой и в них номер регистра вообще нельзя передать. Так что нужно писать таблицу типа и делать переходы на эти метки или как то с помощью кейсов описывать. Иначе на мой взгляд никак. ??RD_PORTB IN 0x18,R16 RET; ??RD_PORTC IN 0x15,R16; RET; -
Сложная тема.AVR __io область как параметр функции
Serega Doc ответил dormouse тема в AVR
Попробовал вашу конструкцию вот что вышло в процессе компиляции в IAR 5.5 без оптимизации void Set_Port(uchar PortNumber, uchar BitNumber) ??Set_Port: // 36 { // 37 *((uchar*)PortNumber) |= BitNumber; MOV R30, R16 LDI R31, 0 LD R18, Z OR R18, R17 ST Z, R18 // 38 } RET // 39 RSEG CODE:CODE:NOROOT(1) // 40 void Clr_Port(uchar PortNumber, uchar BitNumber) ??Clr_Port: // 41 { // 42 *((uchar*)PortNumber) &= ~BitNumber; MOV R18, R17 COM R18 MOV R30, R16 LDI R31, 0 LD R19, Z AND R19, R18 ST Z, R19 // 43 } RET // 44 // 45 RSEG CODE:CODE:NOROOT(1) // 46 int main() main: // 47 { // Пример работы с портом // 48 PORTB = 10; LDI R16, 10 OUT 0x18, R16 // 49 PORTB++; IN R16, 0x18 INC R16 OUT 0x18, R16 // 50 // Ваши процедуры // 51 Clr_Port(porta, bit); LDI R17, 1 LDI R16, 24 RCALL ??Clr_Port // 52 // 53 Set_Port(porta, bit); LDI R17, 1 LDI R16, 24 RCALL ??Set_Port // 54 // 55 // 56 return 0; LDI R16, 0 LDI R17, 0 RET REQUIRE _A_PORTB // 57 } Что то тут не то :( -
Умный дом.
Serega Doc ответил ps1x тема в AVR
А к чему лежит? Я пока нашел построение таких вещей только в Zig Bee И еще вопрос периемо передатчик который я преводил выше можно применять для Zig Bee. Диапазон вроде совпадает? -
Умный дом.
Serega Doc ответил ps1x тема в AVR
У меня возник вопрос как нужно реализовывать управление что бы при отказе автоматического исполнительного устройства оставалось ручное управление? В качестве среды думаю самое актуальное радио (не нужно долбить стены) или RS-485 (много устройств автоматизации работает на MODBUS). В плане дешового радио поднималась тема тут на форуме Оттуда взял вот этот передатчик возник вопрос для "Умного дома" как реализовать маршрутизацию пакета при малой дальности передачи в помещении: Если есть пять точек одна видит до двух соседей как от первого передать пакет пятому 1-2-3-4-5 1 видит 2 и 3 2 видит 1, 3 и 4 3 видит всех ... 5 видит 3 и 4 -
Добрый день. Согласен поучавствовать в проекте. С пиками не работал но есть знания Атмел. Подробности на моей страничке
-
Доброго дня. Вставлю и свои 5 коп. Вопросы к автору топика - назначение и область применение ОС? Существует микроконтроллер с малым объемом ОЗУ (ATTiny44) потому как во все более меньшие контроллеры ниче и так толковое не влезет не говоря уже о многопоточности. Имеется в виду как ОЗУ так и FLASH программ. Поэтому и Деспетчиризацию в таком контроллере можно использовать круговую. И отрабатывать события только необходимых аппаратных блоков. И в силу малого объема ОЗУ синхронизации потоков и межпотоковое взаимодействие не реализовывать. Ну а в контроллер по мощьнее (например: ATMega 128) нужно в зависимости от задачи применять необходимый набор опций. Это могут быть и приоритеты у потоков и различные механизмы межпотокового взаимодействия (мьютексы, семафоры и др...)
-
Эквалайзер на Mega128 (164)
Serega Doc ответил ANTSIR тема в MCS51, AVR, PIC, STM8, 8bit
А что вы имеете в виду под прямым и обратным преобразованием сигнала? -
Не откужусь :)