ARV писал(а): если хотите - обратитесь ко мне на форум - там отвечу, как положено...
Можно ссылчку вашего форума
ARV писал(а):если вы "пульнете" так:то у вас и так между двумя этими "пулями" будет минимум 2 такта паузы - не забывайте, что оператор Си - это далеко не всегда единственный оператор ассемблераКод: Выделить всё
PORTB |= (1<<PB2);
PORTB &= ~(1<<PB2);ну а если это слишком маленькая задержка, то подключите в инклюдах util/delay.h и напишите так:
Код: Выделить всё
PORTB |= (1<<PB2);
_delay_us(5); // 5 мкс паузы
PORTB &= ~(1<<PB2);
Код: Выделить всё
void _delay_us(double __us)
{
uint8_t __ticks;
double __tmp = ((F_CPU) / 3e6) * __us;
if (__tmp <1> 255)
{
_delay_ms(__us / 1000.0);
return;
}
else
__ticks = (uint8_t)__tmp;
_delay_loop_1(__ticks);
}
DeltaQ писал(а):З.Ы. маленький вопрос по си...
Тип переменная 1 бит как можно иницализировать?
bool BitF=0; (так можно? ибо в том компиляторе это была переменная типа bit)
и еще как правильно написать присвоение 1 бита? ибо компилятор ругается на запись PD4 = 0; я так понимаю он думает что я пытаюсь
записать ему байт?
Код: Выделить всё
void print_float_to_buf(char *buf, char numDigits, float x)
{
char i, digit;
float z,y,place = 1.0;
// определяем знак
if(x<0)
buf[0]='-';
else
buf[0]='+';
// преобразуем в абсолютное значение
// x = (x<0)?(x):(-x); // это тоже кстати в winavr отказалось работать
x = fabs(x);
// поиск первого знака
for(i=1; i<16; i++)
{
if((x/place) < 10.0)
break;
else
place *= 10.0;
}
// печать
for(i=1,digit=0; i<numDigits; i++)
{
y = x/place; // узнаем следующую цифру
digit = (char)(y);
buf[i] = digit+0x30;
if(place == 1.0)
{
i++;
buf[i]='.';
}
z = (float)(digit);
x -= z*place; // отнимаем соответствующий десяток
place /= 10.0;
}
}
Код: Выделить всё
#---------- Library Options ----------
# Minimalistic printf version
PRINTF_LIB_MIN = -Wl,-u,vfprintf -lprintf_min
# Floating point printf version (requires MATH_LIB = -lm below)
PRINTF_LIB_FLOAT = -Wl,-u,vfprintf -lprintf_flt
# If this is left blank, then it will use the Standard printf version.
#PRINTF_LIB =
#PRINTF_LIB = $(PRINTF_LIB_MIN)
PRINTF_LIB = $(PRINTF_LIB_FLOAT)
# Minimalistic scanf version
SCANF_LIB_MIN = -Wl,-u,vfscanf -lscanf_min
# Floating point + %[ scanf version (requires MATH_LIB = -lm below)
SCANF_LIB_FLOAT = -Wl,-u,vfscanf -lscanf_flt
# If this is left blank, then it will use the Standard scanf version.
SCANF_LIB =
#SCANF_LIB = $(SCANF_LIB_MIN)
#SCANF_LIB = $(SCANF_LIB_FLOAT)
MATH_LIB = -lm
Код: Выделить всё
float pi=3.1416;
printf("pi=%f",pi);
Код: Выделить всё
double pi=3.1416;
char buffer[10];
dtostrf(pi,4,4,buffer);
lcd_puts(buffer);
существуют типы (которые больше 1 байта)
short, long, int и т.п.
как обратиться к отдельным байтам в таких типах
Код: Выделить всё
uint32_t long0 = 0x44332211;
uint8_t byte1 = (long0 & 0xFF); // 0x11
uint8_t byte2 = ((long0 >> 8) & 0xFF); //0x22
uint8_t byte3 = ((long0 >> 16) & 0xFF); //0x33
uint8_t byte4 = ((long0 >> 24) & 0xFF); //0x44Код: Выделить всё
long0 = (long0 & 0xFFFFFF00) | byte1);
long0 = (long0 & 0xFFFF00FF) | (byte2 << 8));
long0 = (long0 & 0xFF00FFFF) | (byte3 << 16));
long0 = (long0 & 0x00FFFFFF) | (byte4 << 24));Код: Выделить всё
long0 = (byte4 << 24) | (byte3 << 16) | (byte2 << 8) | byte1;dt_andrew писал(а):существуют типы (которые больше 1 байта)
short, long, int и т.п.
как обратиться к отдельным байтам в таких типах
Код: Выделить всё
typedef union{
unsigned long L;
unsigned int words[2];
unsigned char bytes[4];
} extra_long;
// наша переменная типа long
extra_long var;
// обращение ко все переменной (инкремент)
var.L++;
// обращение к старшему слову переменной (инкремент)
var.words[1]++;
// обращение к старшему байту переменной (инкремент)
var.bytes[3]++;
Код: Выделить всё
var=*( (char*)&byte +n); //n - сдвижка относительно начального адреса
Код: Выделить всё
var =(char) (byte>>n);