ощущение такое, что вы должны из своего кармана заплатить по доллару за каждый байт программыIgor_67 писал(а):так тоже пробовал, код меньше всего на 0.3 кб, по сравнению с баскомом ваще не рулит. В кодвижне 30, в баскоме 23 - учитывая прерывание и обработку кнопок и ещё запись в еепром!!!
CodeVision AVR в вопросах и ответах
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18592
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Реклама
- ssvd
- Нашел транзистор. Понюхал.
- Сообщения: 167
- Зарегистрирован: Ср ноя 04, 2009 18:00:56
- Откуда: Алтайский край
- Контактная информация:
помогите с таймером разобраться плиз!
есть Atmega8 настроена на внутренний генератор 8mhz
надо запускать прерывание по переполнению нулевого таймера.
Запускать надо к примеру каждый 1kHz
Делаю следующим образом:
//разрешить все прерывания
TIMSK=0x01;
//предделитель
TCC1B=0x02;
//с чем сравнивается
OCR1AH = 0xа4
OCR1AL = 0x01
TCNT1H = 0xfe;
TCNT1L = 0x0с;
вроде бы все?
если считаю avrcalc, получаются данные значения, правильно?
есть Atmega8 настроена на внутренний генератор 8mhz
надо запускать прерывание по переполнению нулевого таймера.
Запускать надо к примеру каждый 1kHz
Делаю следующим образом:
//разрешить все прерывания
TIMSK=0x01;
//предделитель
TCC1B=0x02;
//с чем сравнивается
OCR1AH = 0xа4
OCR1AL = 0x01
TCNT1H = 0xfe;
TCNT1L = 0x0с;
вроде бы все?
если считаю avrcalc, получаются данные значения, правильно?
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18592
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
во-первых, вы говорите о нулевом таймере, а пишите в регистры первого - где-то вкралась очепятка
во-вторых, если вдруг надеетесь на мою помощь (про других не скажу), то я понимаю запись с именами битов, а не хекс-цифры. например, так:
TCCR1B = 1<<CS11;
во-вторых, если вдруг надеетесь на мою помощь (про других не скажу), то я понимаю запись с именами битов, а не хекс-цифры. например, так:
TCCR1B = 1<<CS11;
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- ssvd
- Нашел транзистор. Понюхал.
- Сообщения: 167
- Зарегистрирован: Ср ноя 04, 2009 18:00:56
- Откуда: Алтайский край
- Контактная информация:
ну а на кого же мне еще рассчитывать ))))ARV писал(а):во-первых, вы говорите о нулевом таймере, а пишите в регистры первого - где-то вкралась очепятка
во-вторых, если вдруг надеетесь на мою помощь (про других не скажу), то я понимаю запись с именами битов, а не хекс-цифры. например, так:
TCCR1B = 1<<CS11;
обшибся, про первый таймер говорю!
чем хекс плохи? или привычка?
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18592
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
хексы плохи тем, что не дают ни малейшего представления о том, какие биты вы именно устанавливаете. рыться в даташите или заучивать наизусть, какой именно бит какую роль играет - я не намерен 
между прочим, если вы так же привыкните всегда использовать символьные имена битов в своих программах, а не числа - вы почувствуете, что это намного удобнее.
между прочим, если вы так же привыкните всегда использовать символьные имена битов в своих программах, а не числа - вы почувствуете, что это намного удобнее.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Реклама
- ssvd
- Нашел транзистор. Понюхал.
- Сообщения: 167
- Зарегистрирован: Ср ноя 04, 2009 18:00:56
- Откуда: Алтайский край
- Контактная информация:
буду пробовать, сегодня переделаю и скину...ARV писал(а):хексы плохи тем, что не дают ни малейшего представления о том, какие биты вы именно устанавливаете. рыться в даташите или заучивать наизусть, какой именно бит какую роль играет - я не намерен
между прочим, если вы так же привыкните всегда использовать символьные имена битов в своих программах, а не числа - вы почувствуете, что это намного удобнее.
- avreal
- Опытный кот
- Сообщения: 842
- Зарегистрирован: Чт дек 31, 2009 19:27:45
- Откуда: Бровари, Україна
- Контактная информация:
В правильном C-компиляторе должно работать следующееMan писал(а):Есть например переменная float c хранящимся в ней числом 58.748 как разбить его на 2 int , тоесть в одну переменную целую часть 58 , вовторую остаток 748 ,еше надобы отделный бит где будет хранится флаг положительного /отрицательного числа ? Пишу в cvavr.
Код: Выделить всё
float fl = 58.748;
int integer_part = fl; // это преобразование по стандарту идёт с отбрасыванием дробной части
int fractional_part = (fl - integer_part) * 1000;Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
- avreal
- Опытный кот
- Сообщения: 842
- Зарегистрирован: Чт дек 31, 2009 19:27:45
- Откуда: Бровари, Україна
- Контактная информация:
А почему нет?Man писал(а):Спасибо avreal , работает . Но как быть с отрицательными значениями в float с ним непроходим такой способ ?
Советую поставить какой-нибудь "PC-шный" С-компилятор и на нём проврять всякое разное
Можно очень быстро отмоделировать не зависящие от аппаратуры микроконтроллера куски кода.
Код: Выделить всё
// flo.c
#include <stdio>
#include <stdlib>
int main(int ac, char **av)
{
while(--ac) {
char *p = * ++av;
float f = atof( p );
int i = f;
int q = (f-i)*1000;
printf( "%-10s -> f=%f, i=%3d, q=%3d\n", p, f, i, q);
}
return 0;
}Код: Выделить всё
>gcc -Os -s flo.c -o flo.exe
>flo 5.37 9.99 -1.11 -2.99
5.37 -> f=5.370000, i= 5, q=369
9.99 -> f=9.990000, i= 9, q=989
-1.11 -> f=-1.110000, i= -1, q=-110
-2.99 -> f=-2.990000, i= -2, q=-990
>Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
- avreal
- Опытный кот
- Сообщения: 842
- Зарегистрирован: Чт дек 31, 2009 19:27:45
- Откуда: Бровари, Україна
- Контактная информация:
Кстати, другой алгоритм работает в итоге так же:
Разница с первым в количестве и "качестве" операций.
Первый - два преобразования от плавающего к целому, одно преобразование от целого к плавающему, одно плавающее вычитание и одно плавающее умножение.
Второй - одно плавающее умножение, одно преобразование от плавающего к целому, и по одному целочисленному делению, умножению и вычитанию.
Что будет быстрее работать и что займёт меньше кода - зависит от того, как выписана библиотека конкретного компилятора и что уже использовано в программе.
Например, если в программе целочисленное деление больше нигде не использовалось, только тут, а плавающее умножение и так есть - то второй вариант подошьёт из библиотеки "лишнее" целочиленное деление и программа станет больше.
Код: Выделить всё
#include <stdio>
#include <stdlib>
int main(int ac, char **av)
{
while(--ac) {
char *p = * ++av;
float f = atof( p );
int q = f * 1000;
int i = q / 1000;
q -= i * 1000;
printf( "%-10s -> f=%f, i=%3d, q=%3d\n", p, f, i, q);
}
return 0;
}Первый - два преобразования от плавающего к целому, одно преобразование от целого к плавающему, одно плавающее вычитание и одно плавающее умножение.
Второй - одно плавающее умножение, одно преобразование от плавающего к целому, и по одному целочисленному делению, умножению и вычитанию.
Что будет быстрее работать и что займёт меньше кода - зависит от того, как выписана библиотека конкретного компилятора и что уже использовано в программе.
Например, если в программе целочисленное деление больше нигде не использовалось, только тут, а плавающее умножение и так есть - то второй вариант подошьёт из библиотеки "лишнее" целочиленное деление и программа станет больше.
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
- avreal
- Опытный кот
- Сообщения: 842
- Зарегистрирован: Чт дек 31, 2009 19:27:45
- Откуда: Бровари, Україна
- Контактная информация:
P.S. Я так понимаю, это для вывода куда-то на индикацию без использования преобразований плавающих форматов?
Если так, то надо не глядя на знак числа добавить в концену или, что то же самое,
Если так, то надо не глядя на знак числа добавить в конце
Код: Выделить всё
q = abs(q);Код: Выделить всё
if(q<0) q = -q;Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Avreal Правельно вы понимаете выводить надо на светодиодный индикатор . А именно попал датчик ds18b20 комне , со стандартными либами cvavr (#include <ds18b20> , #include <stdlib>) все завелось с полпинка , попробал вывести на жк(hd44780) затруднений невызвало , там ненадо было разберать флоат , через void ftoa(float n, unsigned char decimals, char *str) прогнал и в дисплей вывел . Вот со светодиодным индикатором такое непрокатило ему подавай целочислиные значения , ну и канешно отдельно минус вывести надо если он там есть. Ну или попробать в float XX.ZZZ сдвинуть запитаю XXZ.ZZ и вывести целое число ,а на индикаторе уже в нужном месте поставить точку, но вот как это сделать незнаю пока (неприходилось раньше с числами с плавающей точкой работать).
- avreal
- Опытный кот
- Сообщения: 842
- Зарегистрирован: Чт дек 31, 2009 19:27:45
- Откуда: Бровари, Україна
- Контактная информация:
Для сегментного проще всего
int i = f * 1000;
вывести i и добавить вручную точку в нужный разряд (хотя могут быть нюансы с гашением лидирующих нулей).
Но для этого нужно знать как устроен вывод на семисегментник, если это закопано внутри cvavr и не описано, то остаётся сделать вывод на 7-сегментник самостоятельно.
int i = f * 1000;
вывести i и добавить вручную точку в нужный разряд (хотя могут быть нюансы с гашением лидирующих нулей).
Но для этого нужно знать как устроен вывод на семисегментник, если это закопано внутри cvavr и не описано, то остаётся сделать вывод на 7-сегментник самостоятельно.
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Да все уже разобрался может и неочень красиво написано но работает.Так как индикатор 4 разряда то первый разряд умя служит для показания +- , пока температура не выше 99.9 показывается десятая часть когда выше даного значения убирается точка и показывается до максимального 125.
Завтро семисегментник раздабуду проверю в железе, пока токо протеус...
Код: Выделить всё
#asm("sei")
h=1;
devices=w1_search(0xf0,rom_code);
ds18b20_init(&rom_code[i++][0],20,30,DS18B20_12BIT_RES);
i=0;
delay_ms(500);
while (1)
{
f=ds18b20_temperature(&rom_code[i][0]);
if(f<0) {f=-f;c=1;} else{c=0;}
if(f<99.9)
{
a=f;
b=(f-a)*1000;
b=b/100;
a=a*10;
a=a+b;
k=1;
}
else
{
k=0;
a=f;
}
indication=a;
recoding();
delay_ms(100);
};- Вложения
-
- .rar
- (19.86 КБ) 257 скачиваний
Вопрос, как можно в CVAVR узнать адрес конца кода. Хочу при прошивке к уже скомпиленной программе добавлять данные. Соответственно к этим данным надо как-то обращаться. После компиляции в ассемблерном листинге CVAVR устанавливает метку:
Но как в Си-шной программе получить адрес __END_OF_CODE?
Код: Выделить всё
;END OF CODE MARKER
__END_OF_CODE: - ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18592
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
наверное, определить указатель extern char *__END_OF_CODE;BeerLover писал(а):Вопрос, как можно в CVAVR узнать адрес конца кода. Хочу при прошивке к уже скомпиленной программе добавлять данные. Соответственно к этим данным надо как-то обращаться. После компиляции в ассемблерном листинге CVAVR устанавливает метку:Но как в Си-шной программе получить адрес __END_OF_CODE?Код: Выделить всё
;END OF CODE MARKER __END_OF_CODE:
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
За идею спасибо, но оказалось не совсем так. Вот так получилось:ARV писал(а):определить указатель extern char *__END_OF_CODE;
Код: Выделить всё
extern flash char _END_OF_CODE;
char flash *EndOfCode;
EndOfCode = &_END_OF_CODE;- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18592
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
имхо, тогда уж корректнее и проще так:BeerLover писал(а):За идею спасибо, но оказалось не совсем так. Вот так получилось:ARV писал(а):определить указатель extern char *__END_OF_CODE;Код: Выделить всё
extern flash char _END_OF_CODE; char flash *EndOfCode; EndOfCode = &_END_OF_CODE;
Код: Выделить всё
extern flash char *__END_OF_CODE;если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!


