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

adnega

Свой
  • Постов

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

  • Посещение

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

    3

Сообщения, опубликованные adnega


  1. Вы уже достали своими детскими вопросами.

    Вот алгоритм определения разности в минутах ВНУТРИ ОДНОГО ГОДА.

    Дата А: 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

     

     

  2. Не факт. Я даже в программе на С стараюсь избегать деления на что-либо отличное от степени двойки.

    А как же вывод десятичных чисел на дисплей? Деление на константу 10.

    В свое время делал на АСМе получается (частное и остаток) компактно и быстро, но с использованием команды умножения.

    Функцию деления произвольно числа на произвольное число делал для кр1878ве1, МК51, AVR.

    Заниматься вычитаниями можно, но зачем, когда можно взять и один раз написать нужную функцию?

  3. Подскажите где почитать про расчет растояния по координатам, нужно упрощенная формула, для растояний до 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 довольно быстро.

     

  4. Можно и строку в кавычках в дефайн передать, только кавычки нужно экранировать. не знаю как в makefile с кавычками, но просто в командной строке Windows они экранируются символом \

    Спасибо! Так работает и в makefile.

  5. Если сильных возражений не будет, то хотелось бы в этой теме пролить свет и на такой момент:

    Задача передать в параметрах компиляции строку. Не получается(

    Число передать можно. Например,

      SW_VER_BUILD    = 1005
      COMPILE_OPTS      = $(CPU_OPTS) -fpack-struct -Wpadded -g -O$(OPT) -DSW_VER_BUILD=$(SW_VER_BUILD)

    А вот строку - никак (и я скорее всего понимаю почему не получается).

    Но может есть варианты?

  6. Спасибо за код. Можно попросить прокомментировать строки функции, которая преобразует дату в число дней...

    Дело было давно, сейчас тонкостей не помню.

    Возможно "формула Зеллера" из этой оперы.

    В самом конце формулы будет вычитание большого числа - это сдвиг начало эпохи.

     

    В коде похоже ошибка, надо бы проверить.

    Перевод туда и обратно проверял числительно для всех дат от 2000 до 2099 года.

    Можете показать проблемное место?

  7. И еще, вы говорите SSOE=1 и управляй пином NSS через GPIO.. но ведь пин PB12 (NSS) настроен как Alternate Function... ?

    Никто не мешает изменить его на OUT_PP.

    Вообще разные бывают случаи и управлять NSS "автоматом" можно только в простейших из них.

    Например, при инициализации SD карт по SPI вначале нужно передать 0xFF 74 раза при NSS=1.

  8. ...переводите обе даты в нименьшие единицы измерения (секунды) и вычитаете одно число из другого.

    Например, так:

    
    Начало эпохи 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);
    }
    

  9. У меня хорошо работает такая инициализация:

    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;
    }

     

    Правда, битики я объявляю номером, а не маской...

  10. Его я включаю перед тем как начать работать с СПИ. Вот так:

    //=============================================================================
    // 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).

  11. перед чтением регистра UDR неплохо бы для начала убедиться что там есть данные проверив бит RXC в статусном регистре UCSRA.

    Это во-первых!

     

    Во-вторых, может быть нарушение кадра, ошибка четности, переполнение приемного буфера и т.п.

    Выставил не ту скорость: данные приходят, флаги приема устанавливаются, но и флаги ошибок тоже лучше проверять.

     

    Если ТС "нужен учитель" для получения знаний, то к советам стоит прислушаться.

    Если нужно обсудить почему с гипертерминалом работает, а с чем-то другим не работает, то это немного другой подход.

  12. Здравствуйте. Давно тут не появлялся ) вот проблемка вышла может поможет кто.. кто то убедил меня тут учить С++ я на нем и стал писать, вроде бы получается что-то. Так вот, имется HC-05 и ATmega8. Идея проста, как и у всех новичков включить реле по блютузу ) но пока вместо реле у меня светодиод. прошиваю МК подключаю блютуз настраиваю, посылаю команду, он приимает ее включается и сразу выключается. а почему не пойму. подскажите в чем проблема, заранее спасибо.

    Рекомендуется сначала опрашивать флаги периферийных устройств (например, приход символа по UART), а только потом оперировать с данными этого периферийного устройства, с последующей операцией очистки флага. Особенно новичкам (которые должны находится в процессе изучения).

  13. А самое начало это после

    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
    
    //*********************************************
    //    КОНЕЦ ФАЙЛА
    //*********************************************

  14. Значит у Вас разъем со встроенной начинкой типа трансформатора-фильтра-...

    У ТС по-видимому тоже. От разъема дороги идут к PHY без трансформаторов.

    Нужна дока на примеренный разъем. Если он в добавок без трансформатора, то вообще не факт, что такое использование допустимо.

  15. Я бы вообще сказал, что USB VCP не предназначен для реального использования. Достаточно открыть со стороны ПК этот виртуальный порт, а потом нажать сброс на плате и до следующего сброса устройство будет недоступно.

    Но если вовремя этот порт закрыть, то можно добиться "более-менеешней" работы.

  16. Решил обратить внимание на 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кБ это довольно много))

×
×
  • Создать...