реклама на сайте
подробности

 
 
> Последовательность действий - побитовая инверсия и сдвиг, (~PIND) >> 4 == ~(PIND >> 4) ???
Dx!
сообщение Sep 28 2010, 16:15
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 108
Регистрация: 6-02-09
Из: Новочеркасск
Пользователь №: 44 469



Компилятор WinAVR-20090313

Неужели ((~PIND) >> 4) и (~(PIND >> 4)) должны давать одинаковый результат?

PIND у меня равен 0b1110????

~(PIND >> 4) получается 0b11110001 как и должно быть.

(~PIND) >> 4 получается тоже 0b11110001, хотя мне кажется должно быть 0b00000001

Я ошибаюсь?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Petka
сообщение Sep 28 2010, 19:04
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 453
Регистрация: 23-08-05
Пользователь №: 7 886



Цитата(Dx! @ Sep 28 2010, 20:15) *
Компилятор WinAVR-20090313

Неужели ((~PIND) >> 4) и (~(PIND >> 4)) должны давать одинаковый результат?

PIND у меня равен 0b1110????

~(PIND >> 4) получается 0b11110001 как и должно быть.

(~PIND) >> 4 получается тоже 0b11110001, хотя мне кажется должно быть 0b00000001

Я ошибаюсь?

Разбираем по шагам:
PIND = 0b1110**** (PIND это 8 битное число)
результат инвертирования (почему смотри ниже) будет иметь тип int (в avr-gcc тип int это знаковое 16 битное число). поэтому 8 битное беззнаковое число будет расширено до знакового 16 битного
~PIND == ~(0b00000000 1110****) == 0b11111111 0001***
(~PIND) >> 4 с правой стороны этого выражения числовая константа (без явного указания типа), а по стандарту си она должна интерпретироваться как тип int. При операции сдвига меньший операнд по стандарту си должен быть расширен до бОльшего (именно по этой причине компилятор делал инвертирование в 16 битах). т.е. имеем: (~PIND) >> 4 == 0b11111111 0001**** >> 4 == 0b11111111 11110001
итого, если результат приводится к 8ми битному типу то должно получиться 0b11110001.
Если это не так, то надо более точно разбираться.
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Sep 28 2010, 19:15
Сообщение #3


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Цитата(Petka @ Sep 28 2010, 22:04) *
Если это не так, то надо более точно разбираться.

Вот я и пытаюсь добиться определения PIND в WinAVR ибо "Он не мой - это регистр ввода с порта." это не определение на языке C. Отсюда и плясать надо.
Go to the top of the page
 
+Quote Post
Petka
сообщение Sep 28 2010, 19:18
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 453
Регистрация: 23-08-05
Пользователь №: 7 886



Цитата(IgorKossak @ Sep 28 2010, 23:15) *
Вот я и пытаюсь добиться определения PIND в WinAVR ибо "Он не мой - это регистр ввода с порта." это не определение на языке C. Отсюда и плясать надо.

Код
#define PIND    _SFR_IO8(0x09)
Go to the top of the page
 
+Quote Post
Petka
сообщение Sep 28 2010, 19:24
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 453
Регистрация: 23-08-05
Пользователь №: 7 886



Цитата(Petka @ Sep 28 2010, 23:18) *
Код
#define PIND    _SFR_IO8(0x09)

Если совсем правильно, то
Код
(*(volatile uint8_t *)(mem_addr))

где mem_addr это адрес порта D
таким образом PIND это uint8_t т.е. ровно 8 битное беззнаковое число.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Dx!   Последовательность действий - побитовая инверсия и сдвиг   Sep 28 2010, 16:15
- - IgorKossak   Как определён Ваш PIND?   Sep 28 2010, 16:20
|- - Dx!   Цитата(IgorKossak @ Sep 28 2010, 20:20) К...   Sep 28 2010, 18:10
|- - rezident   Цитата(Dx! @ Sep 29 2010, 00:10) И чт...   Sep 28 2010, 18:54
- - 777777   Цитата(Dx! @ Sep 28 2010, 20:15) PIND...   Sep 28 2010, 16:53
- - IgorKossak   Под ???? подразумевались недостающие четыре бита?   Sep 28 2010, 17:35
- - rezident   Нормальные компиляторы на такой оператор выдают пр...   Sep 28 2010, 17:35
- - Dx!   Да, всё так, большое спасибо. Теперь всё встало на...   Sep 28 2010, 19:21
- - Dx!   Просто мы же в разделе AVR, мне казалось что особо...   Sep 28 2010, 19:32
|- - Petka   Цитата(Dx! @ Sep 28 2010, 23:32) Прос...   Sep 28 2010, 19:33
- - IgorKossak   Не прошло и полгода! И хоть после драки кулака...   Sep 28 2010, 19:42
- - Dx!   Неужели в IAR или кейле этот (или любой другой ста...   Sep 28 2010, 20:01
- - _Pasha   Люди! Радуйтесь, что сдвиг вправо знакового чи...   Sep 28 2010, 20:14
|- - Сергей Борщ   Цитата(_Pasha @ Sep 28 2010, 23:14) Люди...   Sep 28 2010, 22:31
|- - Petka   Цитата(Сергей Борщ @ Sep 29 2010, 02:31) ...   Sep 29 2010, 04:50
- - Dx!   Как заключение - остановился на варианте somevar ...   Sep 30 2010, 09:05
|- - rezident   Цитата(Dx! @ Sep 30 2010, 15:05) Как ...   Sep 30 2010, 10:47
|- - 777777   Цитата(rezident @ Sep 30 2010, 14:47) Вы ...   Sep 30 2010, 10:53
|- - rezident   Цитата(777777 @ Sep 30 2010, 16:53) Какая...   Sep 30 2010, 11:25
|- - 777777   Цитата(rezident @ Sep 30 2010, 15:25) Не ...   Sep 30 2010, 12:00
|- - Petka   Цитата(777777 @ Sep 30 2010, 16:00) Да, к...   Sep 30 2010, 12:24
|- - rezident   Цитата(Petka @ Sep 30 2010, 18:24) Не быв...   Sep 30 2010, 13:13
|- - 777777   Цитата(Petka @ Sep 30 2010, 16:24) Не быв...   Sep 30 2010, 15:51
|- - Petka   Цитата(777777 @ Sep 30 2010, 19:51) Но в ...   Sep 30 2010, 16:00
||- - 777777   Цитата(Petka @ Sep 30 2010, 20:00) int мо...   Sep 30 2010, 16:58
||- - Petka   Цитата(777777 @ Sep 30 2010, 20:58) И что...   Sep 30 2010, 18:30
|- - Сергей Борщ   Цитата(777777 @ Sep 30 2010, 18:51) Все в...   Sep 30 2010, 20:19
|- - 777777   Цитата(Сергей Борщ @ Oct 1 2010, 00:19) (...   Oct 1 2010, 05:01
|- - xelax   Цитата(777777 @ Oct 1 2010, 09:01) Какая ...   Oct 1 2010, 06:03
|- - _Pasha   Цитата(777777 @ Oct 1 2010, 08:01) Просто...   Oct 1 2010, 06:28
- - Dx!   КодPORTB = (PIND^0xFF) >> 4; 80...   Sep 30 2010, 11:02
- - IgorKossak   Всё это очень интересно, но обсуждалось уже многок...   Oct 1 2010, 07:05


Closed TopicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 21:40
Рейтинг@Mail.ru


Страница сгенерированна за 0.01442 секунд с 7
ELECTRONIX ©2004-2016