Реклама на сайте DatasheetsDatasheets

KAZUS.RUN - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Книги и журналы
FAQ по электронике

  Datasheets
Поиск SMD
Онлайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Схемы и проекты
Принципиальные схемы
  Программы
Каталог сайтов
Калькуляторы
  Форумы по электронике
Помощь проекту


 
Опции темы

MPLAB 8. Работа с указателями.

Непрочитано 23.08.2022, 15:17  
NewWriter
Почётный гражданин KAZUS.RUN
 
Аватар для NewWriter
 
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,481
Сказал спасибо: 396
Сказали Спасибо 2,222 раз(а) в 1,317 сообщении(ях)
NewWriter на пути к лучшему
По умолчанию Re: MPLAB 8. Работа с указателями.

Всей темы не читал (может уже написали про это), но
unsigned char *p=&temp; - указатель на однобайтную переменную, а тут
temp = 0x4025; переменная двухбайтная.
Поэтому должно выдаваться предупреждение о несоответствии размеров, ну и в указатель уйдет только первый байт
Реклама:
__________________
Убейте шизофреника Вовку Стогова!
NewWriter вне форума  
Непрочитано 23.08.2022, 17:13  
DmitriyVDN
Гражданин KAZUS.RUN
 
Регистрация: 10.06.2010
Сообщений: 598
Сказал спасибо: 224
Сказали Спасибо 235 раз(а) в 154 сообщении(ях)
DmitriyVDN на пути к лучшему
По умолчанию Re: MPLAB 8. Работа с указателями.

Пример преобразования переменной типа float в байты:
Код:
float dt = 2.58901;  // переменная типа float, которую надо преобразовать в байты
byte* ptrdt;  // указатель на тип byte
ptrdt =  (byte*)(& dt);  // получаем адрес переменной dt
Код:
byte byteEeprom1 = * ptrdt;    // считываем байты
byte byteEeprom2 = * (ptrdt+1);
byte byteEeprom3 = * (ptrdt+2);
byte byteEeprom4 = * (ptrdt+3);
Осталось записать байты в EEPROM. Конечно, это можно сделать без промежуточных переменных.

Код:
// записываем  байты в EEPROM
EEPROM.write(0, * ptrdt);
EEPROM.write(1, *(ptrdt+1));
EEPROM.write(2, *(ptrdt+2));
EEPROM.write(3, *(ptrdt+3));
Для чтения данных типа float из EEPROM - считываем байты и записываем их последовательно в область памяти по указателю ptrdt:

Код:
// чтение байтов из EEPROM и запись в область памяти для dt
* ptrdt = EEPROM.read(0);
* (ptrdt+1) = EEPROM.read(1);
* (ptrdt+2) = EEPROM.read(2);
* (ptrdt+3) = EEPROM.read(3);
DmitriyVDN вне форума  
Непрочитано 23.08.2022, 18:16  
j-Roger
Гражданин KAZUS.RUN
 
Регистрация: 17.06.2008
Адрес: Украина
Сообщений: 838
Сказал спасибо: 379
Сказали Спасибо 942 раз(а) в 451 сообщении(ях)
j-Roger на пути к лучшему
По умолчанию Re: MPLAB 8. Работа с указателями.

MPLAB 8.xx использует компилятор HI-TECH.
Вот в качестве примера чтение и сохранение настроек.
Некоторые ключевые моменты:
- блок настроек оформлен в виде структуры;
- расположение настроек в EEPROM отдаем на откуп компилятору;
- в данном примере блок настроек инициализируется конкретными значениями (и попадает в EEPROM при прошивке МК);
- в начале программы читаем блок настроек из EEPROM в RAM простым копированием из структуры в структуру;
- манипулируем настройками в RAM путем обращения к полям структуры;
- когда требуется, записываем блок настроек целиком в EEPROM.

P. S.
Не претендую на истину в последней инстанции ))

PHP код:
#include ‹htc.h›

// Задать конфигурацию
__CONFIG(0x23E4);

// Здесь будем использовать типы из stdint.h (которого нет в includ-ах)
typedef unsigned long uint32_t;
typedef unsigned int uint16_t;
typedef signed int int16_t;
typedef unsigned char uint8_t;
typedef signed char int8_t;

// Блок настроек
typedef struct {
    float VarFloat; // float
    uint32_t Var32; // 32-bit
    uint16_t Var16; // 16-bit
    uint8_t Var8;   // 8-bit
} Settings_t;

// Рабочая (изменяемая) копия блока настроек в RAM
Settings_t Settings;
// Сохраняемый в EEPROM блок настроек (начальные значения)
Settings_t eeprom EE_Settings = {
    3.1415926,  // float
    0xDEADBEAF, // 32-bit
    0xAA55,     // 16-bit
    0x11        // 8-bit
};

// Прототип рукописной функции побайтной записи блока настроек в EEPROM 
void Save_Settings(void);

//==================================================  =
void main(void) 
{
    // читаем блок настроек из EEPROM в память
    Settings = EE_Settings;

    // меняется что-то в блоке настроек
    Settings.Var8 = 0x55;

    // сохраняем блок настроек в EEPROM
    Save_Settings();

    while(1);
}

//==================================================  =
void Save_Settings()
{
    // переменная цикла
    uint8_t i;
    // указатель на блок настроек в RAM
    uint8_t *src = (uint8_t*)&Settings;
    // указатель на блок настроек в EEPROM
    uint8_t eeprom *dst = (uint8_t eeprom*)&EE_Settings;

    // Пишем побайтно блок настроек из RAM в EEPROM
    for (i = 0; i ‹ sizeof(Settings_t); i++) {
        // библиотечная функция HI_TECH
        eeprom_write((uint8_t)dst, *src);
        src++; dst++;
    }
} 
j-Roger вне форума  
Эти 2 пользователя(ей) сказали Спасибо j-Roger за это сообщение:
DmitriyVDN (23.08.2022), mike-y-k (23.08.2022)
Непрочитано 01.01.2024, 20:04  
jeorsea
Прохожий
 
Регистрация: 26.12.2023
Сообщений: 1
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
jeorsea на пути к лучшему
По умолчанию Re: MPLAB 8. Работа с указателями.

Какие соображения следует учитывать при работе с указателями в MPLAB 8, особенно при работе с переменными разных размеров?

В контексте MPLAB 8 и EEPROM, как вы подходите к преобразованию переменной с плавающей запятой в байты и последующему сохранению в EEPROM?
jeorsea вне форума  
Непрочитано 01.01.2024, 21:15  
j-Roger
Гражданин KAZUS.RUN
 
Регистрация: 17.06.2008
Адрес: Украина
Сообщений: 838
Сказал спасибо: 379
Сказали Спасибо 942 раз(а) в 451 сообщении(ях)
j-Roger на пути к лучшему
По умолчанию Re: MPLAB 8. Работа с указателями.

Сообщение от Посмотреть сообщение
MPLAB 8.xx использует компилятор HI-TECH.

Думается, не лишним будет разместить здесь руководство по этому компилятору: HTC_PIC_manual.pdf
j-Roger вне форума  
 
Опции темы

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Программирование программатором STERH 007 PIC микроконтроллеров ispitatel1 Песочница (вопросы новичков) 4 17.04.2017 17:18
Ищу гуру STM32 (работа за деньги!) xakez ARM 1 07.07.2016 13:44
Работа с указателями Fair88Play Микроконтроллеры, АЦП, память и т.д 11 18.06.2012 13:18
Работа в MPLAB IDE V7.42 Prototup Микроконтроллеры, АЦП, память и т.д 14 29.05.2008 16:39
РАБОТА с MPLAB downkazus Proteus, KiCAD и другие ECAD 10 28.01.2007 13:15


Часовой пояс GMT +4, время: 06:31.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.