Ну да, "Брезенхем для линии" и есть один из "хороших" дробных делителей. 155ИЕ8 попроще, но и похуже.Gudd-Head писал(а):Немного упустил нить вашего рассуждения, но это похоже на делитель частоты с дробным коэффициентом деления... тема моего диплома (правда, там всё было "в железе")
Вопросы по С/С++ (СИ)
- avreal
- Опытный кот
- Сообщения: 842
- Зарегистрирован: Чт дек 31, 2009 19:27:45
- Откуда: Бровари, Україна
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
- Gudd-Head
- Друг Кота
- Сообщения: 20092
- Зарегистрирован: Чт сен 18, 2008 12:27:21
- Откуда: Столица Мира Санкт-Петербург
Re: Вопросы по С/С++ (СИ)
avreal писал(а):Ну да, "Брезенхем для линии" и есть один из "хороших" дробных делителей.
Это похоже на работу дельта-сигма модулятора первого порядка
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
-
Лютик
- Нашел транзистор. Понюхал.
- Сообщения: 161
- Зарегистрирован: Вт мар 25, 2008 22:10:23
- Откуда: Минск
Re: Вопросы по С/С++ (СИ)
что то я совсем запутался. Может кто-нибудь скинуть код для формирования частоты в 500Гц при кварце 20МГц для часиков реального времени, сколько не делаю все остают или спешат, причем прилично таки 
- Леонид Иванович
- Друг Кота
- Сообщения: 4779
- Зарегистрирован: Сб апр 02, 2011 12:40:46
- Откуда: Минск
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
Gudd-Head писал(а):Это похоже на работу дельта-сигма модулятора первого порядка
Фактически, Брезенхем и есть дельта-сигма модулятор первого порядка. Реализация чуть другая, но выходной результат - тот же.
- Gudd-Head
- Друг Кота
- Сообщения: 20092
- Зарегистрирован: Чт сен 18, 2008 12:27:21
- Откуда: Столица Мира Санкт-Петербург
Re: Вопросы по С/С++ (СИ)
Лютик писал(а):формирования частоты в 500Гц при кварце 20МГц
Дык, это просто надо поделить на 40 000.
Лютик писал(а):для часиков реального времени, сколько ни делаю, все остают или спешат, причем прилично таки
Нет, чтобы специализированную микросхему прикошачить... Ещё и календарь был бы.
Ничегонеработает писал(а):Фактически, Брезенхем и есть дельта-сигма модулятор первого порядка. Реализация чуть другая, но выходной результат - тот же.
Здорово. Спасибо, буду знать.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
-
Лютик
- Нашел транзистор. Понюхал.
- Сообщения: 161
- Зарегистрирован: Вт мар 25, 2008 22:10:23
- Откуда: Минск
Re: Вопросы по С/С++ (СИ)
Лютик писал(а):для часиков реального времени, сколько ни делаю, все остают или спешат, причем прилично таки
Нет, чтобы специализированную микросхему прикошачить... Ещё и календарь был бы.
[/quote]
и пол интернета часов на пиках это просо так...
Уважаемые, скиньте пожалуйста код на Си реализации часов на Пике, спасибо
- urry
- Сверлит текстолит когтями
- Сообщения: 1262
- Зарегистрирован: Пн дек 08, 2008 10:58:48
- Откуда: Винница
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
Код: Выделить всё
Уважаемые, скиньте пожалуйста код на Си реализации часов на Пике, спасибо
Прикольно...
И какой смысл постить, когда тебя не читают..
-
Лютик
- Нашел транзистор. Понюхал.
- Сообщения: 161
- Зарегистрирован: Вт мар 25, 2008 22:10:23
- Откуда: Минск
Re: Вопросы по С/С++ (СИ)
urry писал(а):Код: Выделить всё
Уважаемые, скиньте пожалуйста код на Си реализации часов на Пике, спасибо
Прикольно...
И какой смысл постить, когда тебя не читают..
честно говря не очень прикольно, так как собрал суточное реле времени, рассчитал всю схему с нуля, написал прошивку(столкнулся и с переполнением стека, глюками компилятора и т.д. и т.п.(намучался)), в общем все сделал, а часы работают не точно и вот сижу с моря погоды жду...
- IfoR
- Поставщик валерьянки для Кота
- Сообщения: 2029
- Зарегистрирован: Сб ноя 15, 2008 10:09:56
- Откуда: г. Тула
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
Лютик, ну так вы могли бы читать посты дальше первой строчки?
Gudd-Head вам же уже ответил что нужно делать: поделить частоту на 40000. Единственное что осталось, так это правильно подсчитать время выполнения кода. У вас есть на борту 16-битный таймер-счётчик? Так если есть, установите начальное значение в счётчике равным 25536 и запустите его без деления частоты. Установите прерывание пои переполнению. В этом прерывании каждый раз устанавливаете начальное значение и это прерывание будет вызываться точно с частотой 500 Гц.
Это не единственный способ. Можно вообще обойтись без таймеров, но тут нужно расчитывать время выполнения.
Gudd-Head вам же уже ответил что нужно делать: поделить частоту на 40000. Единственное что осталось, так это правильно подсчитать время выполнения кода. У вас есть на борту 16-битный таймер-счётчик? Так если есть, установите начальное значение в счётчике равным 25536 и запустите его без деления частоты. Установите прерывание пои переполнению. В этом прерывании каждый раз устанавливаете начальное значение и это прерывание будет вызываться точно с частотой 500 Гц.
Это не единственный способ. Можно вообще обойтись без таймеров, но тут нужно расчитывать время выполнения.
-
Лютик
- Нашел транзистор. Понюхал.
- Сообщения: 161
- Зарегистрирован: Вт мар 25, 2008 22:10:23
- Откуда: Минск
Re: Вопросы по С/С++ (СИ)
IfoR писал(а):Лютик, ну так вы могли бы читать посты дальше первой строчки?
Gudd-Head вам же уже ответил что нужно делать: поделить частоту на 40000. Единственное что осталось, так это правильно подсчитать время выполнения кода. У вас есть на борту 16-битный таймер-счётчик? Так если есть, установите начальное значение в счётчике равным 25536 и запустите его без деления частоты. Установите прерывание пои переполнению. В этом прерывании каждый раз устанавливаете начальное значение и это прерывание будет вызываться точно с частотой 500 Гц.
Это не единственный способ. Можно вообще обойтись без таймеров, но тут нужно расчитывать время выполнения.
мне кажется загрузить надо 55536.
а как учесть количество машинных циклов на запись в таймер этих 55536?
- IfoR
- Поставщик валерьянки для Кота
- Сообщения: 2029
- Зарегистрирован: Сб ноя 15, 2008 10:09:56
- Откуда: г. Тула
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
Ну если 65536 - 40000 = 55536, то пожалуйста.
Ну либо есть вы используете делитель на 4.
Не совсем понял вопрос. Если нужно вычислить время выполнения команд на запись числа, то нужно посмотреть даташит либо что-то ещё. Там должна быть табличка опкодов с указанием времени выполнения каждого.
Какой контроллер вы используете? В ATmega, например, можно запустить таймер в режиме CTC (очистить счётчик при равенстве текущего значения с установленным). Там вообще всё просто: устанавливаем в OCR1A значение 40000-1 и ставим прерывание по срабатыванию сравнения. Всё, больше ничего делать на надо.
а как учесть количество машинных циклов на запись в таймер этих 55536?
Не совсем понял вопрос. Если нужно вычислить время выполнения команд на запись числа, то нужно посмотреть даташит либо что-то ещё. Там должна быть табличка опкодов с указанием времени выполнения каждого.
Какой контроллер вы используете? В ATmega, например, можно запустить таймер в режиме CTC (очистить счётчик при равенстве текущего значения с установленным). Там вообще всё просто: устанавливаем в OCR1A значение 40000-1 и ставим прерывание по срабатыванию сравнения. Всё, больше ничего делать на надо.
-
Лютик
- Нашел транзистор. Понюхал.
- Сообщения: 161
- Зарегистрирован: Вт мар 25, 2008 22:10:23
- Откуда: Минск
Re: Вопросы по С/С++ (СИ)
контроллер pic16f628a.
еще не могу понять такое явление, а именно использую код:
при измерении частоты частотомером в мультиметре частота не 1000 Гц, а прыгает в диапазоне 1039-1061, хотя по идее должна быть постоянной.
были подозрения на мультиметр, однако при синхронизации с ПК при помощи программы com_generator частота клолеблется максимум на 1Гц, то есть +-1, в чем может быть дело?
еще не могу понять такое явление, а именно использую код:
Код: Выделить всё
#include <pic.h>
void main ()
{
CMCON = 0x07;
OPTION = 0b00000110; // TMR0 on, 1:1 prescale
INTCON = 0b11000000; // GIE on, T0IE on (turn interrupt on)
TMR1H=0xF6;TMR1L=0x3C;
TMR1IE=1;
T1CON=0x01;
TRISB = 0b00000000;
RBPU=1;
TRISA=0b00000000;
PORTB = 0;
PORTA=0;
//----------
// main run loop here
while(1)
{
}
}
static void interrupt Int(void){
RB7=!RB7;
TMR1L=0x3C;TMR1H=0xF6;
TMR1IF = 0;
}
при измерении частоты частотомером в мультиметре частота не 1000 Гц, а прыгает в диапазоне 1039-1061, хотя по идее должна быть постоянной.
были подозрения на мультиметр, однако при синхронизации с ПК при помощи программы com_generator частота клолеблется максимум на 1Гц, то есть +-1, в чем может быть дело?
- urry
- Сверлит текстолит когтями
- Сообщения: 1262
- Зарегистрирован: Пн дек 08, 2008 10:58:48
- Откуда: Винница
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
Подозреваю,что у Вас включены 2 таймера, вектор прерывания - у них один и в обработке Вы никак это не фильтруете.
И вообще, это не так делается.
И вообще, это не так делается.
Код: Выделить всё
#define CLOCK_FREQ 20000000
#define FTMR1 1000// 1mc
#define FIN CLOCK_FREQ/4 // частота на таймер
#if FIN/FTMR1 > 65535
#error "слишком низкая частота ! измените пределитель !"
#endif
#define TMR1_ALL (int)(65536 - (FIN/FTMR1)) //значение таймера1
#define TMR1H_ (int)TMR1_ALL>>8 // старший байт
#define TMR1L_ TMR1_ALL&0x00FF // младший байт
interrupt void Intr(void)//
{
if (TMR1IF & TMR1IE)
{
TMR1H= TMR1H_;
TMR1L+= TMR1L_;
TMR1IF=0;
RB7=!RB7;
}
}
// в мейне
// ----- таймер 1 установки
T1CKPS0=0; // T1CON
T1CKPS1=0; // устанавливаем делители
T1OSCEN=0;//выключаем внутренний генератор
TMR1CS=0; //внутренняя тактовая частота на таймер
TMR1H= TMR1H_;
TMR1L= TMR1L_;
TMR1ON=1;
CCP1CON=0;//режим захвата выключен
TMR1IE=1;
GIE = 1;// разрешаем прерывания
-
Лютик
- Нашел транзистор. Понюхал.
- Сообщения: 161
- Зарегистрирован: Вт мар 25, 2008 22:10:23
- Откуда: Минск
Re: Вопросы по С/С++ (СИ)
urry писал(а):Подозреваю,что у Вас включены 2 таймера, вектор прерывания - у них один и в обработке Вы никак это не фильтруете.
И вообще, это не так делается.
я привел весь код программы и там задействован всего 1 таймер
проблема решилась тем, что на ноге висел светодиод, к ноге которого дотрагиваясь я измерял частоту, снял светодиод и частота стала стабильной
Re: Вопросы по С/С++ (СИ)
Как можно смоделировать звуки, чтобы потом воспроизводить их силами МК? В частотности, что нужно, чтобы получить на выходе букву В?
У радио нет будущего. Летательные аппараты тяжелее воздуха невозможны. Скоро выяснится, что рентгеновские лучи - мистификация.
[i]Лорд Кельвин, физик, 1899 г.[/i]
[i]Лорд Кельвин, физик, 1899 г.[/i]
-
inkHunter
- Грызет канифоль
- Сообщения: 287
- Зарегистрирован: Сб авг 21, 2010 20:44:27
- Откуда: Ростов
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
typedef struct _AT91S_PIO {
AT91_REG PIO_PER; // PIO Enable Register
AT91_REG PIO_PDR; // PIO Disable Register
AT91_REG PIO_PSR; // PIO Status Register
...............
} AT91S_PIO, *AT91PS_PIO;
AT91S_PIO - это тип.
*AT91PS_PIO - указатель.
а вот _AT91S_PIO это что ?
typedef все путает (((
без него проще
struct тип {
}имя переменной;
расскажите как с typedef . Спасибо
AT91_REG PIO_PER; // PIO Enable Register
AT91_REG PIO_PDR; // PIO Disable Register
AT91_REG PIO_PSR; // PIO Status Register
...............
} AT91S_PIO, *AT91PS_PIO;
AT91S_PIO - это тип.
*AT91PS_PIO - указатель.
а вот _AT91S_PIO это что ?
typedef все путает (((
без него проще
struct тип {
}имя переменной;
расскажите как с typedef . Спасибо
-
Мастер Ломастер
- Поставщик валерьянки для Кота
- Сообщения: 1995
- Зарегистрирован: Ср май 11, 2011 21:37:45
- Откуда: Цветочный город
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
это алиас структуры, можете наплевать на него, можно и без него обойтись.Victor Gordienko писал(а):а вот _AT91S_PIO это что ?
битва с дураками проиграна, победители торжествуют. слава победителям!
-
inkHunter
- Грызет канифоль
- Сообщения: 287
- Зарегистрирован: Сб авг 21, 2010 20:44:27
- Откуда: Ростов
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
Мастер Ломастер писал(а):это алиас структуры, можете наплевать на него, можно и без него обойтись.Victor Gordienko писал(а):а вот _AT91S_PIO это что ?
А зачем так сложно писать ? не проще
struct тип {
}имя переменной;
???
-
Мастер Ломастер
- Поставщик валерьянки для Кота
- Сообщения: 1995
- Зарегистрирован: Ср май 11, 2011 21:37:45
- Откуда: Цветочный город
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
можно и так, но с typedef нагляднееVictor Gordienko писал(а):А зачем так сложно писать ? не проще
struct тип {
}имя переменной;
???
битва с дураками проиграна, победители торжествуют. слава победителям!
- Antifritz
- Прорезались зубы
- Сообщения: 222
- Зарегистрирован: Чт июл 08, 2010 01:03:40
- Откуда: Украина, Киев
Re: Вопросы по С/С++ (СИ)
Hispanus писал(а):Как можно смоделировать звуки, чтобы потом воспроизводить их силами МК? В частотности, что нужно, чтобы получить на выходе букву В?
Простой МК может генерировать только однобитные звуки (просто пищать, как встроенный динамик ПК или как ринготоны на древних мобилках). Я когда-то делал функции, которые проигрывали определенные ноты с необходимой длительностью. Так можно проиграть простенькую мелодию. Для воспроизведения реальных звуков нужно подключать ЦАП и, возможно, внешнюю дополнительную память.
Буква В - это имеется ввиду нота "си"?
