![](https://electronix.ru/forum/uploads/set_resources_23/84c1e40ea0e759e3f1505eb1788ddf3c_pattern.png)
![](https://electronix.ru/forum/uploads/set_resources_23/84c1e40ea0e759e3f1505eb1788ddf3c_default_photo.png)
adnega
-
Постов
3 594 -
Зарегистрирован
-
Посещение
-
Победитель дней
3
Сообщения, опубликованные adnega
-
-
Вы уже достали своими детскими вопросами.
Вот алгоритм определения разности в минутах ВНУТРИ ОДНОГО ГОДА.
Дата А: 12.34 21/01/2013
Дата Б: 17.35 05/05/2013
...
Ответ в секундах: 150061*60=9 003 660 (девять миллионов три тысячи шестьсот шестьдесят секунд)
А вот для произвольной даты внутри столетия (2000 - 2099 года)
Для первой даты: поскольку месяц меньше 3, то у года вычитаем единицу, а месяц увеличиваем на 12.
((2013 - 1) * 1461) / 4 + ((1 + 12) * 306 + 7) / 10 + 21 - 730533 =
734883 + 398 + 21 - 730533 = 4769
В секундах: ((4769 * 24 + 12) * 60 + 34) * 60 + 0 = 412 086 840
Для второй даты:
(2013 * 1461) / 4 + (5 * 306 + 7) / 10 + 5 - 730533 =
735248 + 153 + 5 - 730533 = 4873
В секундах: ((4873 * 24 + 17) * 60 + 35) * 60 + 0 = 421 090 500
Разница: 9 003 660
-
Не факт. Я даже в программе на С стараюсь избегать деления на что-либо отличное от степени двойки.
А как же вывод десятичных чисел на дисплей? Деление на константу 10.
В свое время делал на АСМе получается (частное и остаток) компактно и быстро, но с использованием команды умножения.
Функцию деления произвольно числа на произвольное число делал для кр1878ве1, МК51, AVR.
Заниматься вычитаниями можно, но зачем, когда можно взять и один раз написать нужную функцию?
-
Сложно будет человеку на Ассемблере писать функции деления не на константу.
Если человек использует ассемблер, то эта функция у него уже есть.
-
Подскажите где почитать про расчет растояния по координатам, нужно упрощенная формула, для растояний до 500 метров, точность не шибкая, и пару метров устрит. Но чтоб просто и быстро. Нужно знать приблизился ли обьект с жпс на какоето растояния до статической координаты. Координат будет штук 500, а может и больше.
Я вот так считаю:
#include <math.h> double sdlat, sdlon, dist; volatile double lat, clat, lon, clon; clat = 57.60904722 * M_PI / 180.0; clon = 39.82411944 * M_PI / 180.0; lat = 57.6083 * M_PI / 180.0; lon = 39.82488333 * M_PI / 180.0; sdlat = sin((lat - clat) / 2.0); sdlon = sin((lon - clon) / 2.0); dist = 2.0 * asin(sqrt(sdlat * sdlat + cos(clat) * cos(lat) * sdlon * sdlon)) * 6367444.6571225;
На Cortex-M4F довольно быстро.
-
Можно и строку в кавычках в дефайн передать, только кавычки нужно экранировать. не знаю как в makefile с кавычками, но просто в командной строке Windows они экранируются символом \
Спасибо! Так работает и в makefile.
-
Если сильных возражений не будет, то хотелось бы в этой теме пролить свет и на такой момент:
Задача передать в параметрах компиляции строку. Не получается(
Число передать можно. Например,
SW_VER_BUILD = 1005 COMPILE_OPTS = $(CPU_OPTS) -fpack-struct -Wpadded -g -O$(OPT) -DSW_VER_BUILD=$(SW_VER_BUILD)
А вот строку - никак (и я скорее всего понимаю почему не получается).
Но может есть варианты?
-
Спасибо за код. Можно попросить прокомментировать строки функции, которая преобразует дату в число дней...
Дело было давно, сейчас тонкостей не помню.
Возможно "формула Зеллера" из этой оперы.
В самом конце формулы будет вычитание большого числа - это сдвиг начало эпохи.
В коде похоже ошибка, надо бы проверить.Перевод туда и обратно проверял числительно для всех дат от 2000 до 2099 года.
Можете показать проблемное место?
-
Может быть я не правильно данные готовлю :) ? В качестве данных использую WAV 16 бит, 16 кГц, моно. DAC настраиваю с Left-adjust выравниванием...
Попробуйте типа такого
DAC->DHR12L1 = ((WORD)(wav_data[i] + 0x8000));
-
И еще, вы говорите SSOE=1 и управляй пином NSS через GPIO.. но ведь пин PB12 (NSS) настроен как Alternate Function... ?
Никто не мешает изменить его на OUT_PP.
Вообще разные бывают случаи и управлять NSS "автоматом" можно только в простейших из них.
Например, при инициализации SD карт по SPI вначале нужно передать 0xFF 74 раза при NSS=1.
-
затем что с ним не работает как надо!
А вариант: SSM=1, SSI=1, SSOE=1, NSS управляется через GPIO чем-то не устраивает?
-
Простенькй проект прикрепил (работающий: SSM=1,SSI=1,SSOE=0) если хотите можете проверить.
А зачем SSOE=0?
-
...переводите обе даты в нименьшие единицы измерения (секунды) и вычитаете одно число из другого.
Например, так:
Начало эпохи 01.01.2000 00:00:00 Работает корректно до 2100 года. //----------------------------------------------------------------------------- //! \fn extern DWORD date_to_int(DWORD y, DWORD m, DWORD d) //! \brief Преобразует дату в число. //! \param y Год. //! \param m Месяц. //! \param d День месяца. //! \return Номер дня по порядку от начала эпохи. //! \sa int_to_date(). //----------------------------------------------------------------------------- extern DWORD date_to_int(DWORD y, DWORD m, DWORD d); //----------------------------------------------------------------------------- //! \fn extern void int_to_date (const DWORD jd, DWORD *y, DWORD *m, DWORD *d) //! \brief Преобразует число в дату. //! \param jd Номер дня по порядку от начала эпохи. //! \param y Указатель на переменную для года. //! \param m Указатель на переменную для месяца. //! \param d Указатель на переменную для дня месяца. //! \sa date_to_int(). //----------------------------------------------------------------------------- extern void int_to_date (const DWORD jd, DWORD *y, DWORD *m, DWORD *d); //----------------------------------------------------------------------------- // int date_to_int(int y, int m, int d) //----------------------------------------------------------------------------- DWORD date_to_int(DWORD y, DWORD m, DWORD d) { if(m < 3) { m += 12; y -= 1; } return ((y * 1461) >> 2) + ((m * 306 + 7) / 10) + d - 730533; } //----------------------------------------------------------------------------- // void int_to_date(DWORD jd, int *y, int *m, int *d) //----------------------------------------------------------------------------- void int_to_date(DWORD jd, DWORD *y, DWORD *m, DWORD *d) { int aa, bb, cc, dd, ee, mm, xx; aa = jd + 2483589; bb = (aa * 4 + 3) / 146097; cc = aa - ((146097 * bb) >> 2); dd = (4 * cc + 3) / 1461; ee = cc - ((1461 * dd) >> 2); mm = ((5 * ee + 2) * 13707) >> 21; *d = ee - ((16043274 * mm + 209716) >> 19) + 1; *m = mm + 3 - 12 * ((mm * 27) >> 8); *y = 100 * bb + dd - 4800 + ((mm * 27) >> 8); }
-
Опубликовано · Изменено пользователем IgorKossak
[codebox] для длинного кода, [code] - для короткого!!! · ПожаловатьсяУ меня хорошо работает такая инициализация:
void __inline init_SPI2(void) { SPI2->CR1 = (0 << SPI_CR1_SPE) | (0 << SPI_CR1_DFF) | (1 << SPI_CR1_SSM) | (1 << SPI_CR1_SSI) | (1 << SPI_CR1_MSTR) | (0 << SPI_CR1_BR); SPI2->CR2 = (0 << SPI_CR2_RXNEIE) | (0 << SPI_CR2_TXDMAEN) | (1 << SPI_CR2_SSOE); SPI2->CR1 = (1 << SPI_CR1_SPE) | (0 << SPI_CR1_DFF) | (1 << SPI_CR1_SSM) | (1 << SPI_CR1_SSI) | (1 << SPI_CR1_MSTR) | (0 << SPI_CR1_BR); }
И такая отправка/прием
BYTE sd_send_byte(const BYTE data) { BYTE spib; while((SPI2->SR & (1 << SPI_SR_TXE)) == 0); SPI2->DR = data; while((SPI2->SR & (1 << SPI_SR_RXNE)) == 0); spib = SPI2->DR; return spib; }
Правда, битики я объявляю номером, а не маской...
-
Его я включаю перед тем как начать работать с СПИ. Вот так:
//============================================================================= // SPI2 Related configuration //============================================================================= // enable SPI2 clock ((RCC_TypeDef *) (RCC_BASE))->APB1ENR |= RCC_APB1ENR_SPI2EN; // configure SPI2 ((SPI_TypeDef *) (SPI2_BASE)) -> CR1 |= (SPI_CR1_SPE | SPI_CR1_CPOL | SPI_CR1_CPHA | SPI_CR1_MSTR | SPI_CR1_BR_1 | SPI_CR1_SSM | SPI_CR1_SSI);
Где-то есть упоминание (для F4), что между установкой битика включения тактирования блока и работы с блоком должно пройти какое-то время. У меня так FSMC не заработал)
Попробую найти это в доках...
UPD: STM32F405/407xx and STM32F415/417xx device limitations
2.1.12 Delay after an RCC peripheral clock enabling
Description
A delay between an RCC peripheral clock enable and the effective peripheral enabling
should be taken into account in order to manage the peripheral read/write to registers.
This delay depends on the peripheral’s mapping:
● If the peripheral is mapped on AHB: the delay should be equal to 2 AHB cycles.
● If the peripheral is mapped on APB: the delay should be equal to 1 + (AHB/APB
prescaler) cycles.
Workarounds
1. Use the DSB instruction to stall the Cortex-M CPU pipeline until the instruction is
completed.
2. Insert ”n” NOPs between the RCC enable bit write and the peripheral register writes
(n = 2 for AHB peripherals, n = 1 + AHB/APB prescaler in case of APB peripherals).
-
в чем может быть причина?
Может, в настройках оптимизации. Попробуйте отключить оптимизацию.
-
перед чтением регистра UDR неплохо бы для начала убедиться что там есть данные проверив бит RXC в статусном регистре UCSRA.
Это во-первых!
Во-вторых, может быть нарушение кадра, ошибка четности, переполнение приемного буфера и т.п.
Выставил не ту скорость: данные приходят, флаги приема устанавливаются, но и флаги ошибок тоже лучше проверять.
Если ТС "нужен учитель" для получения знаний, то к советам стоит прислушаться.
Если нужно обсудить почему с гипертерминалом работает, а с чем-то другим не работает, то это немного другой подход.
-
Здравствуйте. Давно тут не появлялся ) вот проблемка вышла может поможет кто.. кто то убедил меня тут учить С++ я на нем и стал писать, вроде бы получается что-то. Так вот, имется HC-05 и ATmega8. Идея проста, как и у всех новичков включить реле по блютузу ) но пока вместо реле у меня светодиод. прошиваю МК подключаю блютуз настраиваю, посылаю команду, он приимает ее включается и сразу выключается. а почему не пойму. подскажите в чем проблема, заранее спасибо.
Рекомендуется сначала опрашивать флаги периферийных устройств (например, приход символа по UART), а только потом оперировать с данными этого периферийного устройства, с последующей операцией очистки флага. Особенно новичкам (которые должны находится в процессе изучения).
-
А самое начало это после
Reset:
или после
.cseg .org 0
?
Вот примерчик:
//--------------------------------------------- // Настройка (HIGH = 0xF9, LOW = 0x7A): // Fclk = 9.6 MHz // BOD = 4.3 V //--------------------------------------------- .include "tn13def.inc" //********************************************* // Константы //********************************************* .equ TO_PULSE = 50 ; Стартовый импульс, мс .equ pulse = PB2 ; Выход OUT_PULSE //********************************************* // Регистры //********************************************* .def temp = r16 //********************************************* // Сегмент кода //********************************************* .org 0 rjmp RESET RESET: // Настройка стека ldi temp, LOW(RAMEND) out SPL, temp // Настройка ввода-вывода ldi temp, (1<<pulse) out DDRB, temp // Настройка аналгового кмпаратора ldi temp, (0<<ACD)|(0<<ACBG) out ACSR, temp // Стартовый импульс sbi PORTB, pulse ldi temp, TO_PULSE rcall delay_ms MAINLOOP: // Подать ток sbi PORTB, pulse rcall delay // Ждать сработки компаратора wait_ac: sbic ACSR, ACO rjmp wait_ac // Отключить ток cbi PORTB, pulse rcall delay rcall delay rcall delay rjmp MAINLOOP //********************************************* // БИБЛИОТЕКИ и ФУНКЦИИ //********************************************* //--------------------------------------------- // Задержка ms //--------------------------------------------- // Формирует задержку в temp мс. //--------------------------------------------- delay_ms: push temp delay_ms_1: push temp ldi temp,148 delay_ms_2: push temp ldi temp,20 delay_ms_3: dec temp brne delay_ms_3 pop temp dec temp brne delay_ms_2 pop temp dec temp brne delay_ms_1 pop temp ret //--------------------------------------------- // Задержка тактирования //--------------------------------------------- delay: ldi temp,9 delay_1: dec temp brne delay_1 ret //********************************************* // КОНЕЦ ФАЙЛА //*********************************************
-
Значит у Вас разъем со встроенной начинкой типа трансформатора-фильтра-...
У ТС по-видимому тоже. От разъема дороги идут к PHY без трансформаторов.
Нужна дока на примеренный разъем. Если он в добавок без трансформатора, то вообще не факт, что такое использование допустимо.
-
Вы уверены в правильности подключения линий RX и TX к разъему (цоколевка верная)?
У меня, например, пары подходят по краям (1-2, 7-8 пины).
-
Продскажите пожалуйста где у меня ошибка. Я написал программу для ATtiny13A.
А инициализация стека?
ldi temp, LOW(RAMEND) out SPL, temp
Добавить в самом начале.
-
Я бы вообще сказал, что USB VCP не предназначен для реального использования. Достаточно открыть со стороны ПК этот виртуальный порт, а потом нажать сброс на плате и до следующего сброса устройство будет недоступно.
Но если вовремя этот порт закрыть, то можно добиться "более-менеешней" работы.
-
Можно посмотреть на чипы Energy Micro. У них аппаратная поддержка емкостных кнопок есть(интерфейс - LESENSE называется)
Или модуль TSC в STM32F3xx.
-
Решил обратить внимание на STM32F100. И, не пойму, что ни так делаю. Генерируемый код растет на глазах, на АТмеге – думал, зачем столько памяти, а здесь инициализация портов, библиотечная, съела почти 5кб из 16кб. Добавил sprintf(buf, "%.2f", rez) - эта отела еще 4кб памяти! На АВРках весь код столько занимал. Сейчас Program Size: Code=13628 RO-data=496 RW-data=140 ZI-data=1908. А, еще даже, половины нет, того что хотелось бы.
Инициализация библиотечная
GPIO_Init(GPIOB, &GPIO_InitStruct);
Речевой информатор на этом же камне: проигрывание wav-файлов с uSD-карт. Поддержка SD, SDHC, FAT16, FAT32, MBR/PBR, фрагментация файлов. Управление с UART-консоли. Написано на C, компилятор GCC, занимает 9712 байт FLASH при -Os оптимизации.
Правда, библиотеки не используются. Так что 16кБ это довольно много))
Определение промежутка времени
в MSP430
Опубликовано · Пожаловаться
Возможно, но для 2000 - 2099 годов работает для любой даты. Проверял перебором.