Ср авг 01, 2012 14:21:10
PORTD = 0b11000011;
tmp=0;
while(1){
tmp++;
if (tmp>3)tmp=0;
PORTD = PORTD & (0b11000011 | (1<<(2+tmp)) );
}
Ср авг 01, 2012 14:40:04
int main()
{
unsigned char tmp=0;
DDRD = 0b00111100;
while(1)
{
tmp++;
if (tmp>3)tmp=0;
PORTD = 0b00111100 ^ (1<<(2+tmp));
_delay_ms(1000);
}
}
Ср авг 01, 2012 14:46:37
PORTD = 0b00111100 ^ (1<<(2+tmp));
Ср авг 01, 2012 14:49:51
Ср авг 01, 2012 14:56:38
Попробуйте что-то вроде:Johnson писал(а):Либо, подскажите другой способ, пожалуйста.
...
unsigned char mask;
...
for (;;)
for (mask = 0b00000100; mask <= 0b00100000; mask <<= 1)
{
PORTD |= mask; // включить
pause(); // сделать паузу, чтобы зафиксировать текущую позицию
PORTD &= ~mask; // погасить
}
Ср авг 01, 2012 15:07:32
PORTD = 0b00111100 ^ (1<<(2+tmp));
PORTD &= ~mask;
Ср авг 01, 2012 15:17:15
PORTD = (PORTD & 0b11000011) | (1<<2+tmp2);
Ср авг 01, 2012 15:26:37
Тогда такой небольшой джентльменский набор:Johnson писал(а):Мне нужно управлять ногами 2-5 в зависимости от значения переменной (сдвигать бит на значение переменной, но относительно второго бита порта, но не больше 5-го бита включительно).
static uint8_t mask(uint8_t n)
{
return ((1 << (n+2)) & 0b00111100);
}
void bit_set(uint8_t n)
{
PORTD |= mask(n);
}
void bit_clear(uint8_t n)
{
PORTD &= ~mask(n);
}
Ср авг 01, 2012 15:33:03
Ср авг 01, 2012 15:40:47
Ср авг 01, 2012 16:35:13
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
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.
Чт авг 02, 2012 04:11:50
Чт авг 02, 2012 07:15:14
clawham писал(а):А почему это костыль обращение к битам??????
а что же такое тогда асмовая комманда
Johnson писал(а):Во-первых, проблема уже решена логикой, а не костылями.
Чт авг 02, 2012 15:21:14
Чт авг 02, 2012 15:38:51
Нестандартная, но широко распространенная функция:Johnson писал(а):Скажите, пожалуйста, как можно число (int) преобразовать в строку?
void* itoa(int input, char *buffer, int radix)
Чт авг 02, 2012 15:51:21
Чт авг 02, 2012 15:55:51
Чт авг 02, 2012 16:36:39
Чт авг 02, 2012 16:38:12
#define BASE 10
unsigned char buf[3];
unsigned char digit;
itoa ( digit, buf, BASE );
Чт авг 02, 2012 20:32:37
Классическая реализация от Кернигана/Ритчи дописывает в конец строки еще и '\0'. Вполне вероятно, что остальные делают то же самое (хотя для нестандартной функции наверняка ничего утверждать нельзя). Поэтому для 2-разрядного числа лучше все же заложить буфер длиной не меньше 3 байт, чтобы не наступить на одни из наиболее популярных "сишных" граблей.BCluster писал(а):Скажем если 2 разряда то
- Код:
...
unsigned char buf[2];
...
itoa ( digit, buf, BASE );