Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > инверсия двоичного кода


Автор: СерегаГоляков 2.12.2010, 15:40
Здравствуйте, следующая проблема:

есть кусок проги:

Код

unsignet char ASCII[42]={0x80, и т.д.};// здесь типа алфавит записан рус 
unsignet char in;//полученное значение с порта А микроконтроллера

    while(1){
        in=PINA;
        in=in^0xFF;
        for(i=0;i<42;i++)
            if(in==ASCII[i]){
                switch(i){
                    case 0x80:


желаю, чтоб выполнялось условие
Код
 if(in==ASCII[i]){


Однако на порт А (PINA), как и мне и надо приходит значение 01111111, кот не явл равным 10000000, поэтому желаемое условие не выполняется. Значит надо инверсию сделать.

Дело в том, что пишу в AVR studio, вроде пробовал так:
in=in^0xff, все равно не попадает в нужный case.
и так пробовал: 
in=~PINA;
и так не попадает.

Вопрос: как еще можно 01111111 заменить на 10000000.


Автор: sQu1rr 2.12.2010, 15:50
Цитата(СерегаГоляков @  2.12.2010,  15:40 Найти цитируемый пост)
in=~PINA;

Странно что не работает...

Добавлено через 10 минут
Хотя кто знает что это за PINA
Лучше
Код

if(~in==ASCII[i]){

Автор: bsa 2.12.2010, 16:14
СерегаГоляков, тебе случаем не один бит надо проверять? Если так, то делать это надо через битовую операцию И, а не через switch/case.

Автор: UniBomb 2.12.2010, 16:44
Цитата(СерегаГоляков @  2.12.2010,  15:40 Найти цитируемый пост)
и так не попадает.

А ты посмотри, какое значение при дебаге показывает твоя АВРстудия.

Автор: СерегаГоляков 2.12.2010, 16:52
В том то и дело, что в АВР студии, в дебаге я могу видеть какие порты какое значение имеют на данный момент, а как посмотреть мои переменные, не заложенные на заводе, я не знаю smile

если я понял bsa, 

то даже это:
Код

if((in & ASCII[i])==0){


вместо этого:
Код

if(in==ASCII[i]){


не помогает. Хотя я не знаю что именно такое битовая операция.

Автор: UniBomb 2.12.2010, 17:26
СерегаГоляков, в режиме отладки доступна панелька watch. Туда вписываешь имя переменной и при пошаговой отладке в этой панельке сможешь видеть её (переменной) содержимое.

Если панельки не видно, то надо нажать кнопку user posted image, либо alt+1

Автор: casey 2.12.2010, 17:31
Судя по коду, ты и не должен туда попадать, смотри предпоследнюю строку

Код

unsignet char ASCII[42]={0x80, и т.д.};// здесь типа алфавит записан рус 
unsignet char in;//полученное значение с порта А микроконтроллера

    while(1){
        in=PINA;
        in=in^0xFF;
        for(i=0;i<42;i++)
            if(in==ASCII[i]){
                switch(i){                         //переменная i равна 0 и 0x80 не будет равна никогда, 41 максимум
                    case 0x80:

Автор: bsa 2.12.2010, 18:03
Цитата(СерегаГоляков @  2.12.2010,  17:52 Найти цитируемый пост)
Хотя я не знаю что именно такое битовая операция.

Кто тебя тогда к контроллерам подпустил?
есть число (байт в двоичной системе): 01010101
Берем от него 5-й бит: 01010101 & 00100000 => 00000000
Берем от него 4-й бит: 01010101 & 00010000 => 00010000
Выделяем младший полубайт: 01010101 & 00001111 => 00000101
Включаем 5-й бит: 01010101 | 00100000 => 01110101
Включаем 1-й и 7-й биты: 01010101 | 10000010 => 11010111

Автор: СерегаГоляков 8.12.2010, 13:43
лан все сделал, мона удалять)

над было оставить:
Код


in=PINA;
in=in^0xFF;
switch(in){                         
         case 0x80:



можно удалять тему!!!

Автор: bsa 8.12.2010, 15:21

M
bsa
СерегаГоляков, если ответ на вопрос получен, то пометь тему решенной

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)