CodeVision AVR в вопросах и ответах
- SIM31
- Это не хвост, это антенна
- Сообщения: 1363
- Зарегистрирован: Чт апр 04, 2013 22:22:57
- Откуда: Белгород, РФ
Re: CodeVision AVR в вопросах и ответах
А что там может не получится, период 6 секунд, соответственно индикатор покажет 60/6=10 оборотов в минуту.
- Ivanoff-iv
- Друг Кота
- Сообщения: 7077
- Зарегистрирован: Пт ноя 11, 2016 05:48:09
- Откуда: Сердце Пармы
Re: CodeVision AVR в вопросах и ответах
130/10=13 не такой уж и большой размах - ставь небошьшую частоту таймера и всё будет ок. (а какая точность, до единиц или до 0,1 об/мин).
Добавлено after 3 minutes 24 seconds:
есть у меня код для тахометра от 120 до 7200 об/мин с фильтрами, но довольно быстрый, (останется коэффициенты подправить) вечером поищу.
Добавлено after 3 minutes 24 seconds:
есть у меня код для тахометра от 120 до 7200 об/мин с фильтрами, но довольно быстрый, (останется коэффициенты подправить) вечером поищу.
Для тех, кто не учил магию мир полон физики 
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
-
uk8amk
- Поставщик валерьянки для Кота
- Сообщения: 2222
- Зарегистрирован: Вт ноя 27, 2007 11:32:06
- Откуда: Tashkent
Re: CodeVision AVR в вопросах и ответах
Можно пойти даже дальше и виртуально расширить разрядность таймера. Считать число переполнений счётчика и прибавлять остаток из счётного регистра.
Примерно так
very_long_interval = ovf_cnt*65536 + TCNT1;
Примерно так
very_long_interval = ovf_cnt*65536 + TCNT1;
- Ivanoff-iv
- Друг Кота
- Сообщения: 7077
- Зарегистрирован: Пт ноя 11, 2016 05:48:09
- Откуда: Сердце Пармы
Re: CodeVision AVR в вопросах и ответах
Ну вот, что обещал, код мой написан в кодевижне, но выдран из проекта (могут быть небольшие нестыковки)
настройка тахометра и обработчик прерывания
эта часть запускается не реже чем максимальная частота импульсов:
эта часть запускается когда нужны показания
количество замеров для усреднения ограничивается ContRegen и TimUsr (смотря что наступит раньше)
Добавлено after 2 minutes 50 seconds:
частотомер работает на входе захвата таймера Т1
Спойлер
частотомер работает на Т1 в нормальном режиме + прерывание по совпадению, время переполнения не меньше макс времени между импульсаминастройка тахометра и обработчик прерывания
Код: Выделить всё
//тахометр
#define ContRegen 32 //max количество импульсов
#define TimUsr 0x10000 //max время усреднения 0x10000=0,5c (для данной частоты таймера)
#define T1St TCCR1B=0x83
#define T1Sp TCCR1B=0x80
volatile unsigned long int Speed;
volatile unsigned int LastMeas[ContRegen]; //показание счетчика в начале замера (ну и в конце прошлого замера)
volatile unsigned char ContVriten; //количество достоверных замеров
// Timer1 output compare A interrupt service routine
// полсекунды небыло импульса - остановим таймер
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
ContVriten=0;
Speed=0;
T1Sp;
}
эта часть запускается не реже чем максимальная частота импульсов:
Код: Выделить всё
static unsigned char MeasN; //номер замера
if (TIFR&(1<<5)) //ТАХОМЕТР! (поступил импульс)
{
if ((ICR1-OCR1A)>1000)
{
MeasN=(++MeasN)%ContRegen;
LastMeas[MeasN]=ICR1-OCR1A-1;
OCR1A=ICR1-1;
ContVriten+=(ContVriten<=ContRegen)? 1:0;
}
else {T1St;};
TIFR&=(1<<5);
};эта часть запускается когда нужны показания
Код: Выделить всё
{
Speed=0;
i=0;
while (i+2<ContVriten) //2-количество пропускаемых импульсов в начале измерения
{
unsigned int t=LastMeas[((ContRegen+MeasN-i)%ContRegen)];
if (Speed+t>TimUsr) break;
Speed+=t;
i++;
};
if (i) Speed=((unsigned long int)i*125000*60)/Speed;//125000 - частота Т1 в герцах
}; количество замеров для усреднения ограничивается ContRegen и TimUsr (смотря что наступит раньше)
Добавлено after 2 minutes 50 seconds:
частотомер работает на входе захвата таймера Т1
Для тех, кто не учил магию мир полон физики 
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Re: CodeVision AVR в вопросах и ответах
Пока проблема вот в чем. Делаю так.
2313 работает на 8 МГц от встроенного генератора.
На Таймере0 крутится динамическая индикация и опрос одной кнопки.
Таймер1 настраиваем на 7,813 кГц, прерывание по переполнению (8,38 сек).
В процедуре обработки внешнего прерывания (срабатывания щелевой оптопары)
unsigned long int freq=TCNT1; // сохраняем в переменную текущее значение счетчика Таймера1
TCNT1=0; // обнуляем счетчик
//вычисляем значение периода Т, сек. freq = 15748 для 30 об/мин к примеру.
Т = (7813 / freq); // Т = 7813 / 15748 получаем дробное число 0,496 сек. (Тут Я и застрял!, Все что меньше нуля и после запятой отваливается)
// находим N, об/мин.
N = (1/Т)*60;
Показывать достаточно целое количество оборотов.
2313 работает на 8 МГц от встроенного генератора.
На Таймере0 крутится динамическая индикация и опрос одной кнопки.
Таймер1 настраиваем на 7,813 кГц, прерывание по переполнению (8,38 сек).
В процедуре обработки внешнего прерывания (срабатывания щелевой оптопары)
unsigned long int freq=TCNT1; // сохраняем в переменную текущее значение счетчика Таймера1
TCNT1=0; // обнуляем счетчик
//вычисляем значение периода Т, сек. freq = 15748 для 30 об/мин к примеру.
Т = (7813 / freq); // Т = 7813 / 15748 получаем дробное число 0,496 сек. (Тут Я и застрял!, Все что меньше нуля и после запятой отваливается)
// находим N, об/мин.
N = (1/Т)*60;
Показывать достаточно целое количество оборотов.
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Дак Вам жеRoTToR писал(а):Тут Я и застрял!, Все что меньше нуля и после запятой отваливается
RoTToR писал(а):Показывать достаточно целое количество оборотов.
Пусть отваливаются дроби

- SIM31
- Это не хвост, это антенна
- Сообщения: 1363
- Зарегистрирован: Чт апр 04, 2013 22:22:57
- Откуда: Белгород, РФ
Re: CodeVision AVR в вопросах и ответах
[uquote="RoTToR",url="/forum/viewtopic.php?p=3154209#p3154209"]Т = (7813 / freq); // Т = 7813 / 15748 получаем дробное число 0,496 сек. (Тут Я и застрял!, Все что меньше нуля и после запятой отваливается)
// находим N, об/мин.
N = (1/Т)*60;
Показывать достаточно целое количество оборотов.[/uquote]
N=(freq*60/7813)=120,9 об/мин
// находим N, об/мин.
N = (1/Т)*60;
Показывать достаточно целое количество оборотов.[/uquote]
N=(freq*60/7813)=120,9 об/мин
- Ivanoff-iv
- Друг Кота
- Сообщения: 7077
- Зарегистрирован: Пт ноя 11, 2016 05:48:09
- Откуда: Сердце Пармы
Re: CodeVision AVR в вопросах и ответах
конечно, сначала умножать, а потом делить, чтобы в дроби не уйти и не быть там съеденным
можно даже скобками выделирь очерёдность.
Для тех, кто не учил магию мир полон физики 
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Re: CodeVision AVR в вопросах и ответах
Подскажите, а в CVAVR возможна работа с данными EEPROM напрямую?
Т.е. я могу, скажем, проинициализировать две переменные как-то так:
eeprom unsigned char epp1=10;
eeprom unsigned char epp2=20;
а потом в коде оперировать ими без переприсваивания другим переменным?
Например :
if (epp1<epp2) операция1,операция2....;
if (epp1>0) операция1,операция2....;
Спасибо!
Т.е. я могу, скажем, проинициализировать две переменные как-то так:
eeprom unsigned char epp1=10;
eeprom unsigned char epp2=20;
а потом в коде оперировать ими без переприсваивания другим переменным?
Например :
if (epp1<epp2) операция1,операция2....;
if (epp1>0) операция1,операция2....;
Спасибо!
- Ivanoff-iv
- Друг Кота
- Сообщения: 7077
- Зарегистрирован: Пт ноя 11, 2016 05:48:09
- Откуда: Сердце Пармы
Re: CodeVision AVR в вопросах и ответах
да
Добавлено after 52 seconds:
только запись в них долгая, а так всё норм
Добавлено after 52 seconds:
только запись в них долгая, а так всё норм
Для тех, кто не учил магию мир полон физики 
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Re: CodeVision AVR в вопросах и ответах
Всем спасибо! Все заработало. Стыдно за свою глупость.....
Re: CodeVision AVR в вопросах и ответах
Здравствуйте! А вот кто подскажет,зачем например считают до скольки например досчитает регистр TCNT, если это может быть назначенная какая-нибудь переменная? В чем тут смысл подсчета именно таймера,а не переменной?Кто разъяснит?
Добавлено after 2 minutes 52 seconds:
Собственно спросил ,ттак как нужно для работы вот этого пульта https://ru.aliexpress.com/item/Hot-Sell ... 0.0.naVpHu
заодно,кто подскажет какой в нем протокол и на какой несущей частоте?
Добавлено after 2 minutes 52 seconds:
Собственно спросил ,ттак как нужно для работы вот этого пульта https://ru.aliexpress.com/item/Hot-Sell ... 0.0.naVpHu
заодно,кто подскажет какой в нем протокол и на какой несущей частоте?
- Ivanoff-iv
- Друг Кота
- Сообщения: 7077
- Зарегистрирован: Пт ноя 11, 2016 05:48:09
- Откуда: Сердце Пармы
Re: CodeVision AVR в вопросах и ответах
просто пока считает таймер - процессор может что нибудь другое делать.
Для тех, кто не учил магию мир полон физики 
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Re: CodeVision AVR в вопросах и ответах
То есть исключительно для экономии процессорного времени? Но если программа не так велика то разницы в работе скорее всего никакой не будет?
- Ivanoff-iv
- Друг Кота
- Сообщения: 7077
- Зарегистрирован: Пт ноя 11, 2016 05:48:09
- Откуда: Сердце Пармы
Re: CodeVision AVR в вопросах и ответах
таймер настраивать проще на нужную частоту, вход захвата имеет аппаратный антидребезг, да и аппетит приходит во время еды: сейчас проц свободен, а потом придумаешь чем занять...
Для тех, кто не учил магию мир полон физики 
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Re: CodeVision AVR в вопросах и ответах
А как прокомментируете вот такой способ получения преырывистого звонка для обычного буззера со встроенным генератором?
void ring_a (void)
{
if(alb>=0&&alb<=4)in=0;
if(alb>=5&&alb<=9)in=1; //прерывистый звонок
if(alb>=10)alb=0;
if(ik>=0&&ik<=49)ip=0;
if(ik>=50&&ik<=99)ip=1;
if(ik>=100)ik=0;
alarm_a=(ip&in);
}
void ring_a (void)
{
if(alb>=0&&alb<=4)in=0;
if(alb>=5&&alb<=9)in=1; //прерывистый звонок
if(alb>=10)alb=0;
if(ik>=0&&ik<=49)ip=0;
if(ik>=50&&ik<=99)ip=1;
if(ik>=100)ik=0;
alarm_a=(ip&in);
}
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Таймер считает на аппаратном уровне. Ни одним программным способом Вы не сможете посчитать, например, такты микроконтроллера.
PS: причём тут "способ получения прерывистого звонка", расписанный выше, совершенно не понятно...
PS: причём тут "способ получения прерывистого звонка", расписанный выше, совершенно не понятно...
- SIM31
- Это не хвост, это антенна
- Сообщения: 1363
- Зарегистрирован: Чт апр 04, 2013 22:22:57
- Откуда: Белгород, РФ
Re: CodeVision AVR в вопросах и ответах
[uquote="ra9ust",url="/forum/viewtopic.php?p=3155022#p3155022"]То есть исключительно для экономии процессорного времени? Но если программа не так велика то разницы в работе скорее всего никакой не будет?[/uquote]
На высокой частоте программный счет вообще невозможен.
На высокой частоте программный счет вообще невозможен.
- WiseLord
- Друг Кота
- Сообщения: 4905
- Зарегистрирован: Чт апр 11, 2013 11:19:59
- Откуда: Минск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
ra9ust писал(а):А как прокомментируете вот такой способ получения преырывистого звонка для обычного буззера со встроенным генератором?
Муть какая-то. Диапазоны 0..4 и 5..9 вложены в 0..49 и 50..99. Лучше в двоичной системе это делать:
Код: Выделить всё
uint8_t ring;
цикл (аппаратное прерывание или обычный while - неважно) {
if (++ring & (0b00001001)
// поднимаем ножку
else
// опускаем ножку
}Естественно, биты можно сдвигать левее, чтобы получить нужную частоту включения (0b00000001) на фоне флага разрешено/запрещено (0b00001000).
Как это работает - понять очень просто. Переменная ring крутится с переполнением от 0 до 255, бипер включается при соответствующих установленных битах ring:
Спойлер
Код: Выделить всё
...
00100
00101
00110
00111
01000
01001 - писк
01010
01011 - писк
01100
01101 - писк
01110
01111 - писк
10000
10001
10010
10011
10100
10101
10110
10111
11000
11001 - писк
11010
11011 - писк
11100
11101 - писк
11110
11111 - писк
...Re: CodeVision AVR в вопросах и ответах
[uquote="WiseLord",url="/forum/viewtopic.php?p=3155206#p3155206"]
Муть какая-то. Диапазоны 0..4 и 5..9 вложены в 0..49 и 50..99. Лучше в двоичной системе это делать:
Естественно, биты можно сдвигать левее, чтобы получить нужную частоту включения (0b00000001) на фоне флага разрешено/запрещено (0b00001000).
Как это работает - понять очень просто. Переменная ring крутится с переполнением от 0 до 255, бипер включается при соответствующих установленных битах ring:
[/uquote]
Муть, но работает, ведь всё понятно там. А вот двоичный способ пожалуй возьму на заметку, спасибо!
ra9ust писал(а):А как прокомментируете вот такой способ получения преырывистого звонка для обычного буззера со встроенным генератором?
Муть какая-то. Диапазоны 0..4 и 5..9 вложены в 0..49 и 50..99. Лучше в двоичной системе это делать:
Код: Выделить всё
uint8_t ring;
цикл (аппаратное прерывание или обычный while - неважно) {
if (++ring & (0b00001001)
// поднимаем ножку
else
// опускаем ножку
}Естественно, биты можно сдвигать левее, чтобы получить нужную частоту включения (0b00000001) на фоне флага разрешено/запрещено (0b00001000).
Как это работает - понять очень просто. Переменная ring крутится с переполнением от 0 до 255, бипер включается при соответствующих установленных битах ring:
Спойлер
Код: Выделить всё
...
00100
00101
00110
00111
01000
01001 - писк
01010
01011 - писк
01100
01101 - писк
01110
01111 - писк
10000
10001
10010
10011
10100
10101
10110
10111
11000
11001 - писк
11010
11011 - писк
11100
11101 - писк
11110
11111 - писк
...Муть, но работает, ведь всё понятно там. А вот двоичный способ пожалуй возьму на заметку, спасибо!