В теории это должно вызвать "бегущий огонь" диодов, подключенных к portd.2-portd.5, не трогая остальные выводы... На практике творится что попало.
Либо, подскажите другой способ, пожалуйста. Только просьба, тупой перебор битов порта не предлагать. Нужно именно по формуле, смещая огонек в зависимости от значения tmp...
PS: Компилятор CVAVR PPS: Не знаю, важно ли это, но PORTD = PORTD & (0b11000011 | (1<<(2+tmp)) ); вызывается из прерывания таймера.
... unsigned char mask; ... for (;;) for (mask = 0b00000100; mask <= 0b00100000; mask <<= 1) { PORTD |= mask; // включить pause(); // сделать паузу, чтобы зафиксировать текущую позицию PORTD &= ~mask; // погасить }
Функцию pause() реализуйте по собственному вкусу. Само собой, задержка не должна находиться в обработчике прерывания таймера.
_________________ Любой дурак может писать код. Настоящий профессионал - это тот, кто способен постоянно создавать продукт высокого качества, укладываясь при этом в бюджет. J. Ganssle
Заголовок сообщения: Re: (?) Небольшой вопрос по С
Добавлено: Ср авг 01, 2012 15:07:32
Встал на лапы
Зарегистрирован: Чт мар 05, 2009 08:15:25 Сообщений: 93
Рейтинг сообщения:0
Цитата:
PORTD = 0b00111100 ^ (1<<(2+tmp));
Не пойдет по одному из требований - необходимо, чтоб ноги 0,1,6,7 не изменили текущего состояния.
Цитата:
PORTD &= ~mask;
А вот над этим уже можно подумать, спасибо!
PS: мне не нужен конкретно бегущий огонь, паузы и всё такое. Просто в своем примере я упростил код для понимания. Мне нужно управлять ногами 2-5 в зависимости от значения переменной (сдвигать бит на значение переменной, но относительно второго бита порта, но не больше 5-го бита включительно). В схеме даже диодов нет...
Заголовок сообщения: Re: (?) Небольшой вопрос по С
Добавлено: Ср авг 01, 2012 15:17:15
Встал на лапы
Зарегистрирован: Чт мар 05, 2009 08:15:25 Сообщений: 93
Рейтинг сообщения:0
Всё, разобрался... Вопрос отменяется, спасибо большое всем, кто откликнулся!
Код:
PORTD = (PORTD & 0b11000011) | (1<<2+tmp2);
Затупил в логике, нудо было сначала обнулить нужные биты, а потом уже ИЛИ по маске производить. А я производил И по маске, ничтоже сумнящийся, что в порте будут лог1 на нужных битах
PS: Можно даже подправить так на всякий случай, чтоб эта единица за пределы не вышла по ошибке...: PORTD = (PORTD & 0b11000011) | ((1<<2+tmp2) & 0b00111100);
Мне нужно управлять ногами 2-5 в зависимости от значения переменной (сдвигать бит на значение переменной, но относительно второго бита порта, но не больше 5-го бита включительно).
Тип uint8_t определить самостоятельно, если не поддерживается вашим компилятором.
_________________ Любой дурак может писать код. Настоящий профессионал - это тот, кто способен постоянно создавать продукт высокого качества, укладываясь при этом в бюджет. J. Ganssle
В кодвижне есть фича можно непосредственно к битам порта обращаться: PORTD.1 PORTD.2 и т.д. Устанавливать и снимать бит просто PORTD.1 = 1; PORTD.1 = 0; Учтите что это костыли, в стандарте такого нет, а в кодвижне есть ) Успехов
SBI P,b Set Bit in I/O Register I/O(P,b) ← 1 None 2 CBI P,b Clear Bit in I/O Register I/O(P,b) ← 0
а интерпретатор или эту команду ставит или просто логик если нет аткого в ядре..но помоему даж в тине 13 есть
Код:
All ATmega8 I/Os and peripherals are placed in the I/O space. The I/O locations are accessed by the IN and OUT instructions, transferring data between the 32 general purpose working registers and the I/O space. I/O Registers within the address range 0x00 - 0x1F are directly bitaccessible using the SBI and CBI instructions. In these registers, the value of single bits can be checked by using the SBIS and SBIC instructions.
_________________ Что нас не убило сделало нас осторожней Не доверяйте русским лужам - это может быть вход в метро.
Заголовок сообщения: Re: (?) Небольшой вопрос по С
Добавлено: Чт авг 02, 2012 15:21:14
Встал на лапы
Зарегистрирован: Чт мар 05, 2009 08:15:25 Сообщений: 93
Рейтинг сообщения:0
Решил не создавать новую тему...
Скажите, пожалуйста, как можно число (int) преобразовать в строку?
И ещё... Может быть, у кого-нибудь есть готовый код, который позволит число из переменной вывести большими цифрами на LCD дисплее в нужном месте? Дисплей WG12232, 122*32, по горизонтали разделен на 4 страницы (строки). Нужен вывод цифры (а точнее двухзначного числа) на высоту всего дисплея.
Скажите, пожалуйста, как можно число (int) преобразовать в строку?
Нестандартная, но широко распространенная функция:
Код:
void* itoa(int input, char *buffer, int radix)
_________________ Любой дурак может писать код. Настоящий профессионал - это тот, кто способен постоянно создавать продукт высокого качества, укладываясь при этом в бюджет. J. Ganssle
Вот здесь достаточно подробно, и вроде на первый взгляд ошибок не заметил.
_________________ Любой дурак может писать код. Настоящий профессионал - это тот, кто способен постоянно создавать продукт высокого качества, укладываясь при этом в бюджет. J. Ganssle
3 аргумент это вроде как база системы счисления... И если я правильно помню он не во всех реализациях есть вообще. буфер можете сразу по разрядности числа сделать. Скажем если 2 разряда то
Код:
#define BASE 10 unsigned char buf[3]; unsigned char digit; itoa ( digit, buf, BASE );
Последний раз редактировалось BCluster Пт авг 03, 2012 08:50:59, всего редактировалось 1 раз.
Классическая реализация от Кернигана/Ритчи дописывает в конец строки еще и '\0'. Вполне вероятно, что остальные делают то же самое (хотя для нестандартной функции наверняка ничего утверждать нельзя). Поэтому для 2-разрядного числа лучше все же заложить буфер длиной не меньше 3 байт, чтобы не наступить на одни из наиболее популярных "сишных" граблей.
_________________ Любой дурак может писать код. Настоящий профессионал - это тот, кто способен постоянно создавать продукт высокого качества, укладываясь при этом в бюджет. J. Ganssle
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 14
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения