22.08.2022, 11:16
|
|
Прописка
Регистрация: 13.09.2011
Адрес: Уфа
Сообщений: 253
Сказал спасибо: 20
Сказали Спасибо 19 раз(а) в 14 сообщении(ях)
|
MPLAB 8. Работа с указателями.
Добрый день!
Суть такова: хотел число integer разбить на байты, чтобы в EEPROM сохранить. Не понимаю, почему у меня программа берет только 1 байт и сохраняет, а второй такое же число(содержимое), хотя в указателе *р хранится адрес второго байта..? Кусок кода:
Код:
|
volatile unsigned int temp;
volatile unsigned char *p=&temp;
volatile unsigned char u,v,x,y;
void math(void)
{
}
void initial(void)
{
OPTION_REG=0B00000001; // Установлен Прескаллер с коэффициентом 4, т.е. 256*4=1024 мкс ~ 1мс
TRISA=0B00011111;
TRISC=0B10000001; //
//PORTC=0B11111111;
TRISB=0B11111111; // Устанавливаем порт B как вход
TRISD=0B00000000; // Порт D для дисплея
TRISE=0B11111111;
//TMR0=0;
//T0IE=0; // запрещаем пока
//PORTD = 0;
//GIE=1;
}
void main(void) {
initial();
temp = 0x4025;
u=*p;
*p++;
v=*p;
} |
|
|
|
|
22.08.2022, 12:26
|
|
Супер-модератор
Регистрация: 13.03.2004
Адрес: Minsk
Сообщений: 2,392
Сказал спасибо: 1,976
Сказали Спасибо 1,332 раз(а) в 580 сообщении(ях)
|
Re: MPLAB 8. Работа с указателями.
По моему, правильнее было бы написать
Код:
|
u = temp & 0xFF;
v = temp ›› 8; |
Зачем шаманство с указателями?
__________________
[ жизнь приятна и красива, если выпить литр пива ]
|
|
|
Эти 3 пользователя(ей) сказали Спасибо nml за это сообщение:
|
|
|
22.08.2022, 12:30
|
|
Прописка
Регистрация: 13.09.2011
Адрес: Уфа
Сообщений: 253
Сказал спасибо: 20
Сказали Спасибо 19 раз(а) в 14 сообщении(ях)
|
Re: MPLAB 8. Работа с указателями.
хотел сделать еще с переменными float. там указатель по проще было б.
|
|
|
|
22.08.2022, 13:49
|
|
Модератор
Регистрация: 04.08.2010
Адрес: Москва СЗАО
Сообщений: 11,260
Сказал спасибо: 11,170
Сказали Спасибо 3,860 раз(а) в 2,930 сообщении(ях)
|
Re: MPLAB 8. Работа с указателями.
Таки правила преобразования
Берите указатель на массив char, загружайте в него указатель на integer, разбирайтесь с Big/Little endian и разбирайте integer на байты (не забывая о разрядности)
Ну и универсально рабочее - в регистр, вывод в char младшего байта и сдвиг на 8 вправо. Число сдвигов от разрядности (1 для 16 и 3 для 32)…
Для float просто сделайте modf, умножте результат на нужную степень 10 и сделайте два int для получения в двух integer целой и дробной частей. Можно даже помудрить с округлением результата…
Дальше как два integer выводите…
__________________
rtfm forever должно быть основой для каждого. Альтернатива грустна, поскольку метод слепого щенка успешно работает при весьма малом числе вариантов…
Последний раз редактировалось mike-y-k; 22.08.2022 в 14:05.
|
|
|
|
22.08.2022, 14:21
|
|
Супер-модератор
Регистрация: 13.03.2004
Адрес: Minsk
Сообщений: 2,392
Сказал спасибо: 1,976
Сказали Спасибо 1,332 раз(а) в 580 сообщении(ях)
|
Re: MPLAB 8. Работа с указателями.
Чем плох такой вариант?
Код:
|
union floatdata
{
float fff;
char bytes[4];
} |
__________________
[ жизнь приятна и красива, если выпить литр пива ]
|
|
|
|
22.08.2022, 14:29
|
|
Модератор
Регистрация: 04.08.2010
Адрес: Москва СЗАО
Сообщений: 11,260
Сказал спасибо: 11,170
Сказали Спасибо 3,860 раз(а) в 2,930 сообщении(ях)
|
Re: MPLAB 8. Работа с указателями.
nml, я конечно дико извиняюсь, но совсем не все смогут воспроизвести в удобочитаемой форме экспоненциальное представление плавающего числа…
У ТС в исходном коде была инициализация дисплея - типа намека на дальнейшую судьбу для тех char
Собственно и если те байты не планируется иначе использовать - сильно проще подготовить нужный массив для вывода обычным sprintf…
Если это вывод binary в порт - тогда все уже было выше…
Тогда можно написать asm {} с нужной цепочкой машинных команд и выводом сразу в порт, но тут надо сразу написать в комментариях замечание о возможной проблеме с переносимостью кода…
__________________
rtfm forever должно быть основой для каждого. Альтернатива грустна, поскольку метод слепого щенка успешно работает при весьма малом числе вариантов…
Последний раз редактировалось mike-y-k; 22.08.2022 в 14:34.
|
|
|
|
22.08.2022, 14:34
|
|
Супер-модератор
Регистрация: 13.03.2004
Адрес: Minsk
Сообщений: 2,392
Сказал спасибо: 1,976
Сказали Спасибо 1,332 раз(а) в 580 сообщении(ях)
|
Re: MPLAB 8. Работа с указателями.
Сообщение от mike-y-k
|
не все смогут воспроизвести в удобочитаемой форме экспоненциальное представление плавающего числа…
|
Ну как я понял, ТС хотел сохранять в EEPROM побайтно, а не преобразовывать для вывода
__________________
[ жизнь приятна и красива, если выпить литр пива ]
|
|
|
|
22.08.2022, 15:11
|
|
Модератор
Регистрация: 04.08.2010
Адрес: Москва СЗАО
Сообщений: 11,260
Сказал спасибо: 11,170
Сказали Спасибо 3,860 раз(а) в 2,930 сообщении(ях)
|
Re: MPLAB 8. Работа с указателями.
nml, ну тут как всегда - помогите, но все я вам не расскажу
И мы будем развлекаться в вариантах техник гадания
Для записи в порт сильно проще описать данные структурой, взять указатель и писать данные из памяти отдельной процедурой, например write_to_port (void *data, integer size_of_data) {}
Понять бы цель экспериментов автора…
__________________
rtfm forever должно быть основой для каждого. Альтернатива грустна, поскольку метод слепого щенка успешно работает при весьма малом числе вариантов…
Последний раз редактировалось mike-y-k; 22.08.2022 в 16:34.
|
|
|
|
22.08.2022, 15:46
|
|
Гражданин KAZUS.RU
Регистрация: 10.06.2010
Сообщений: 598
Сказал спасибо: 222
Сказали Спасибо 234 раз(а) в 154 сообщении(ях)
|
Re: MPLAB 8. Работа с указателями.
Код:
|
#define Lo(param) (*((char *)¶m))
#define Hi(param) (*((char *)¶m +1))
#define Hihger(param) (*((char *)¶m+2))
#define Hihgest(param) (*((char *)¶m+3)) |
или нет?
|
|
|
|
22.08.2022, 16:17
|
|
Заблокирован
Регистрация: 17.07.2010
Адрес: мурмурляндия
Сообщений: 10,715
Сказал спасибо: 189
Сказали Спасибо 3,199 раз(а) в 2,074 сообщении(ях)
|
Re: MPLAB 8. Работа с указателями.
а нельзя на низком уровне просто байты переписать куда надо? setmem copymem там всякие........
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 04:49.
|
|