Можно ссылчку вашего форумаARV писал(а): если хотите - обратитесь ко мне на форум - там отвечу, как положено...
WinAvr в вопросах и ответах
- Реклама
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18647
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
как говаривал tych "под кнопкой WWW"
нажмите и перейдете ко мне на сайт - а уж там не заблудитесь
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Ого.. ничего себе там у них на отсчет микросекунд...ARV писал(а):если вы "пульнете" так:то у вас и так между двумя этими "пулями" будет минимум 2 такта паузы - не забывайте, что оператор Си - это далеко не всегда единственный оператор ассемблераКод: Выделить всё
PORTB |= (1<<PB2); PORTB &= ~(1<<PB2);ну а если это слишком маленькая задержка, то подключите в инклюдах util/delay.h и напишите так:
Код: Выделить всё
PORTB |= (1<<PB2); _delay_us(5); // 5 мкс паузы PORTB &= ~(1<<PB2);
Разве она сможет 1 микросекунду остчитать? это как минимум 14.5 такта при частоте кварца 14.7456МГц
Код: Выделить всё
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);
}
З.Ы. маленький вопрос по си...
Тип переменная 1 бит как можно иницализировать?
bool BitF=0; (так можно? ибо в том компиляторе это была переменная типа bit)
и еще как правильно написать присвоение 1 бита? ибо компилятор ругается на запись PD4 = 0; я так понимаю он думает что я пытаюсь
записать ему байт?
Желательно биты в регистарх устанавливать вот такDeltaQ писал(а): З.Ы. маленький вопрос по си...
Тип переменная 1 бит как можно иницализировать?
bool BitF=0; (так можно? ибо в том компиляторе это была переменная типа bit)
и еще как правильно написать присвоение 1 бита? ибо компилятор ругается на запись PD4 = 0; я так понимаю он думает что я пытаюсь
записать ему байт?
UCSR1B = (1<<RXEN1) | (1<<TXEN1);
так ясно что ты установил бит RXEN1 регистра UCSR1B
- Реклама
по поводу dtostrf
прошу помощи всезнающие коты )))
не хочет у меня работать функция dtostrf хоть тресни от злости ... (((
а не хочет она именно в winavr'e работать, парит жутко...
даже свою подобную функцию написал, НО даже она, именно в winavr'e не работает!!!
Проверял обе в стареньком QC компиляторе, в котором они работают. Для проверки поставил CodeVision, и в нем работают причем, и моя, и dtostrf функции работают!!!
моя функция выглядит так
причом завел две лишних переменные для прямого преобразования типов, все считает до точки, а дальше нули (((
может это не только в моем winavr'e ???
з.ы. как ни странно dtostre прекрасно работает...
но она мне не нравиться
з.з.ы. пользуюсь winavr-20080610
не хочет у меня работать функция dtostrf хоть тресни от злости ... (((
а не хочет она именно в winavr'e работать, парит жутко...
даже свою подобную функцию написал, НО даже она, именно в winavr'e не работает!!!
Проверял обе в стареньком QC компиляторе, в котором они работают. Для проверки поставил CodeVision, и в нем работают причем, и моя, и dtostrf функции работают!!!
моя функция выглядит так
Код: Выделить всё
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;
}
}
может это не только в моем winavr'e ???
з.ы. как ни странно dtostre прекрасно работает...
но она мне не нравиться
з.з.ы. пользуюсь winavr-20080610
по поводу dtostrf
Доброго времени!!!
По поводу dtostrf - пользовал ее в AtmanAVR 5.8.6 все отлично работало
По поводу dtostrf - пользовал ее в AtmanAVR 5.8.6 все отлично работало
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18647
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Эта функция (dtostrf) не входит в библиотеку libc.a, и поэтому должна ис-пользоваться лишь совместно с подключением к линкеру математической библиотеки libm.a директивой компилятора –lm.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Да, спасибо ARV.
Я поковырялся в WinAvr'e и видел про эту директиву...
Вообще чтобы работала функция dtostrf и вообще printf надо немного пошаманить над makefail'ом.
Вот что пишется в стандартном makefail'е:
Соответственно если я хочу, чтобы у меня работал код типа такого
или такого
То мне надо раскомментировать строку:
PRINTF_LIB = $(PRINTF_LIB_FLOAT)
при этом в исходный HEX сразу добавляется примерно 6k кода, что не может не раздрожать )))
winavr достаточно сообразительный, и он сам добавляет это, если ты начинаешь использовать printf...
Но к сожалению в моем ( а может и не только в моем ) WinAvr'e работает только dtosre и printf("pi=%e",pi);
то есть он мне выводит в экспоненциальном виде "[-]d.ddde±dd" , а мне нужно чтоб он выводил в таком "[-]ddd.ddd"
а все для экономии места на lcd дисплее и лучшей восприимчивости написанного на нем
Вот я и интересуюсь только ли у меня не работает это??? если да то я буду искать ошибки у себя... если нет, то это уже другой разговор
Я поковырялся в WinAvr'e и видел про эту директиву...
Вообще чтобы работала функция dtostrf и вообще printf надо немного пошаманить над makefail'ом.
Вот что пишется в стандартном makefail'е:
Код: Выделить всё
#---------------- 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);
PRINTF_LIB = $(PRINTF_LIB_FLOAT)
при этом в исходный HEX сразу добавляется примерно 6k кода, что не может не раздрожать )))
winavr достаточно сообразительный, и он сам добавляет это, если ты начинаешь использовать printf...
Но к сожалению в моем ( а может и не только в моем ) WinAvr'e работает только dtosre и printf("pi=%e",pi);
то есть он мне выводит в экспоненциальном виде "[-]d.ddde±dd" , а мне нужно чтоб он выводил в таком "[-]ddd.ddd"
а все для экономии места на lcd дисплее и лучшей восприимчивости написанного на нем
Вот я и интересуюсь только ли у меня не работает это??? если да то я буду искать ошибки у себя... если нет, то это уже другой разговор
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18647
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
у меня вроде printf("%7.5f", pi) работает нормально, если подключена "полная" версия библиотеки...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Spider
- Опытный кот
- Сообщения: 732
- Зарегистрирован: Чт дек 29, 2005 07:29:25
- Откуда: Омск
- Контактная информация:
Если это вопрос то:существуют типы (которые больше 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;- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18647
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
лично я предпочитаю для этой цели использовать union и, при необходимости, переопределение типов.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]++;
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
единственное, я бы наверно посоветовал бы еще делать явное преобразование типов...
а не доверять все это компилятору...
разные компиляторы могут выполнять преобразование типов и битовые операции с разными приоритетами, что может привести к ошибкам...
просто совет, всегда следить за типами, и явно их преобразовывать
а не доверять все это компилятору...
разные компиляторы могут выполнять преобразование типов и битовые операции с разными приоритетами, что может привести к ошибкам...
просто совет, всегда следить за типами, и явно их преобразовывать
-
BerZerK-ku
- Мучитель микросхем
- Сообщения: 492
- Зарегистрирован: Вт июл 22, 2008 08:10:54
А можно просто обратиться к нужному адресу в памяти:
В отличии от
это позволит работать со всеми типами данных, но правда при этом проигрывает в быстродействии.
Код: Выделить всё
var=*( (char*)&byte +n); //n - сдвижка относительно начального адреса
Код: Выделить всё
var =(char) (byte>>n);можно еще воспользоваться битовыми полями...
вот тут про это немного написано:
http://www.opennet.ru/docs/RUS/bogatyrev/gl_5_1.html
но машинный код тоже медленнее и длиннее зато компактнее сами данные, например для передачи, или хранения...
вот тут про это немного написано:
http://www.opennet.ru/docs/RUS/bogatyrev/gl_5_1.html
но машинный код тоже медленнее и длиннее зато компактнее сами данные, например для передачи, или хранения...


