Уважаемые посетители! Форум CQHAM.RU существует исключительно за счет показа рекламы. Мы будем благодарны, если Вы не будете блокировать рекламу на нашем Форуме. Просим внести cqham.ru в список исключений для Вашего блокировщика рекламы.
Страница 1 из 7 1234 ... ПоследняяПоследняя
Показано с 1 по 10 из 66

Тема: Си для AVR

  1. #1

    Си для AVR

    Вот пошел второй месяц как пытаюсь понять искусство писания на данном языке. Возник вопрос. Имею число типа Float хочу записать в EEProm. Как обратится к 1,2,3,4 байту числа Float???? Компилятор IAR Embedded Workbench.


  2. #2
    SK Аватар для ut1wpr
    Регистрация
    19.10.2003
    Адрес
    Украина, Львов
    Сообщений
    2,652
    Позывной
    ut1wpr

    Re: Си для AVR

    Цитата Сообщение от bob1
    Вот пошел второй месяц как пытаюсь понять искусство писания на данном языке. Возник вопрос. Имею число типа Float хочу записать в EEProm. Как обратится к 1,2,3,4 байту числа Float???? Компилятор IAR Embedded Workbench.
    Видимо, следует почитать про формат числа float в представлении библиотеки math.h для Вашего МК.
    С трудом представляю, а для чего это может понадобиться? Наверное, я что-то упустил в жизни.
    73!
    ---
    Vic/ut1wpr

  3. #3
    Заблокирован Аватар для unname
    Регистрация
    15.10.2006
    Адрес
    Shadrinsk
    Сообщений
    1,703
    главное не пользоваться АВРовским компилятором.
    Я его года 4 назад мучал, потом посомтрел ассемблер с него на выходе, за голову взялся...
    Если у него конструкции CASE и вложенные IF Выдают на выходе совершенно разный код...

  4. #4
    Аватар для Genadi Zawidowski
    Регистрация
    22.07.2004
    Адрес
    Санкт-Петербург
    Сообщений
    11,085
    Записей в дневнике
    20
    Позывной
    UA1ARN

    Re: Си для AVR

    Цитата Сообщение от bob1
    Вот пошел второй месяц как пытаюсь понять искусство писания на данном языке. Возник вопрос. Имею число типа Float хочу записать в EEProm. Как обратится к 1,2,3,4 байту числа Float???? Компилятор IAR Embedded Workbench.
    Код:
    typedef union
    {
      float f;
      unsigned char a [sizeof (float)];
    } bd_dloat;
    
    ....
    bd_float v;
    
    v.f = 355.0 / 113.0;
    int i;
    
    for (i = 0; i < sizeof v.f; ++ i)
      write_one_byte_to_eeprom(offset + i, v.a [i]);
    (не идеал, но как пример для этой архитектуры пойдёт)
    или с использованием многобайтных функций записи в eeprom:

    Код:
    float v;
    
    v = 355.0 / 113.0;
    
    eeprom_busy_wait();
    eeprom_write_block(data, (void *) offset_in_eeprom, sizeof v);
    ... Я там глубину сам промерял!

  5. #5
    Аватар для RU3XN
    Регистрация
    08.01.2006
    Адрес
    Калуга
    Сообщений
    71
    Позывной
    RU3XN
    Я, конечно, в С не шибко силен, но я думаю, что компилятор будет не очень доволен. Ведь в объединение записали float, а берем из него unsigned char.

    v.f = 355.0 / 113.0; это float, а здесь

    write_one_byte_to_ee prom(offset + i, v.a [i]); уже не float

  6. #6
    Аватар для RU3XN
    Регистрация
    08.01.2006
    Адрес
    Калуга
    Сообщений
    71
    Позывной
    RU3XN
    вообще-то не будет ругаться. Книжку почитал.
    За то, чтобы все!
    73! Игорь.

  7. #7
    Заблокирован Аватар для unname
    Регистрация
    15.10.2006
    Адрес
    Shadrinsk
    Сообщений
    1,703
    а если побитовым сдвигом разделить значение float на 4 char и спокойно их сохранить в памяти?

  8. #8
    Такие вещи делаю указателями.
    Александp, Belrig.by

  9. #9
    unname
    Ассемблер лучше не смотреть, что бы за голову не держаться
    Genadi Zawidowski
    Геннадий спасибо . Уже попробовал--работает.
    RU3XN
    Что за книжка?
    unname
    НА побитовый сдвиг числа float компилятор ругается.
    Alex007
    Пробовал так:
    float *A;
    uint8_t *B;
    B=A;
    В 3 строчке пишет ошибка.
    p.s.Проц ATxMega128A1. Там указатели занимают 3 байта.
    Успехов!!


  10. #10
    Аватар для Genadi Zawidowski
    Регистрация
    22.07.2004
    Адрес
    Санкт-Петербург
    Сообщений
    11,085
    Записей в дневнике
    20
    Позывной
    UA1ARN
    Ещё так.
    Код:
    float f;
    const uint8_t * p;
    int8_t i;
    
    p = (const uint8_t *) & f;
    for (i = 0; i < sizeif f; ++ i)
       write_byte_to_eeprom(offset + i, p [i]);
    или вот так

    Код:
    float f;
    int8_t i;
    
    for (i = 0; i < sizeif f; ++ i)
       write_byte_to_eeprom(offset + i, ((const uint8_t *) & f) [i]);

    А что, функций блочной записи в eeprom нет?
    ... Я там глубину сам промерял!

Страница 1 из 7 1234 ... ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •