Страница 32 из 386
Re: Вопросы по С/С++ (СИ)
Добавлено: Пн июл 25, 2011 13:13:36
avreal
Gudd-Head писал(а):Немного упустил нить вашего рассуждения, но это похоже на делитель частоты с дробным коэффициентом деления... тема моего диплома (правда, там всё было "в железе")

Ну да, "Брезенхем для линии" и есть один из "хороших" дробных делителей. 155ИЕ8 попроще, но и похуже.
Re: Вопросы по С/С++ (СИ)
Добавлено: Пн июл 25, 2011 13:34:59
Gudd-Head
avreal писал(а):Ну да, "Брезенхем для линии" и есть один из "хороших" дробных делителей.
Это похоже на работу дельта-сигма модулятора первого порядка

Модулятор второго порядка оперировал бы уже с четырьмя коэффициентами деления: 8, 9, 10, 11.
Re: Вопросы по С/С++ (СИ)
Добавлено: Пн июл 25, 2011 14:14:24
Лютик
что то я совсем запутался. Может кто-нибудь скинуть код для формирования частоты в 500Гц при кварце 20МГц для часиков реального времени, сколько не делаю все остают или спешат, причем прилично таки

Re: Вопросы по С/С++ (СИ)
Добавлено: Пн июл 25, 2011 14:18:26
Леонид Иванович
Gudd-Head писал(а):Это похоже на работу дельта-сигма модулятора первого порядка
Фактически, Брезенхем и есть дельта-сигма модулятор первого порядка. Реализация чуть другая, но выходной результат - тот же.
Re: Вопросы по С/С++ (СИ)
Добавлено: Пн июл 25, 2011 14:22:45
Gudd-Head
Лютик писал(а):формирования частоты в 500Гц при кварце 20МГц
Дык, это просто надо поделить на 40 000.
Лютик писал(а):для часиков реального времени, сколько ни делаю, все остают или спешат, причем прилично таки
Нет, чтобы специализированную микросхему прикошачить... Ещё и календарь был бы.
Ничегонеработает писал(а):Фактически, Брезенхем и есть дельта-сигма модулятор первого порядка. Реализация чуть другая, но выходной результат - тот же.
Здорово. Спасибо, буду знать.
Re: Вопросы по С/С++ (СИ)
Добавлено: Пн июл 25, 2011 15:58:50
Лютик
Лютик писал(а):для часиков реального времени, сколько ни делаю, все остают или спешат, причем прилично таки
Нет, чтобы специализированную микросхему прикошачить... Ещё и календарь был бы.
[/quote]
и пол интернета часов на пиках это просо так...
Уважаемые, скиньте пожалуйста код на Си реализации часов на Пике, спасибо
Re: Вопросы по С/С++ (СИ)
Добавлено: Пн июл 25, 2011 17:05:04
urry
Код: Выделить всё
Уважаемые, скиньте пожалуйста код на Си реализации часов на Пике, спасибо
Прикольно...
И какой смысл постить, когда тебя не читают..

Re: Вопросы по С/С++ (СИ)
Добавлено: Пн июл 25, 2011 17:23:53
Лютик
urry писал(а):Код: Выделить всё
Уважаемые, скиньте пожалуйста код на Си реализации часов на Пике, спасибо
Прикольно...
И какой смысл постить, когда тебя не читают..

честно говря не очень прикольно, так как собрал суточное реле времени, рассчитал всю схему с нуля, написал прошивку(столкнулся и с переполнением стека, глюками компилятора и т.д. и т.п.(намучался)), в общем все сделал, а часы работают не точно и вот сижу с моря погоды жду...

Re: Вопросы по С/С++ (СИ)
Добавлено: Пн июл 25, 2011 17:49:45
IfoR
Лютик, ну так вы могли бы читать посты дальше первой строчки?
Gudd-Head вам же уже ответил что нужно делать: поделить частоту на 40000. Единственное что осталось, так это правильно подсчитать время выполнения кода. У вас есть на борту 16-битный таймер-счётчик? Так если есть, установите начальное значение в счётчике равным 25536 и запустите его без деления частоты. Установите прерывание пои переполнению. В этом прерывании каждый раз устанавливаете начальное значение и это прерывание будет вызываться точно с частотой 500 Гц.
Это не единственный способ. Можно вообще обойтись без таймеров, но тут нужно расчитывать время выполнения.
Re: Вопросы по С/С++ (СИ)
Добавлено: Пн июл 25, 2011 22:25:05
Лютик
IfoR писал(а):Лютик, ну так вы могли бы читать посты дальше первой строчки?
Gudd-Head вам же уже ответил что нужно делать: поделить частоту на 40000. Единственное что осталось, так это правильно подсчитать время выполнения кода. У вас есть на борту 16-битный таймер-счётчик? Так если есть, установите начальное значение в счётчике равным 25536 и запустите его без деления частоты. Установите прерывание пои переполнению. В этом прерывании каждый раз устанавливаете начальное значение и это прерывание будет вызываться точно с частотой 500 Гц.
Это не единственный способ. Можно вообще обойтись без таймеров, но тут нужно расчитывать время выполнения.
мне кажется загрузить надо 55536.
а как учесть количество машинных циклов на запись в таймер этих 55536?
Re: Вопросы по С/С++ (СИ)
Добавлено: Пн июл 25, 2011 22:37:02
IfoR
Ну если 65536 - 40000 = 55536, то пожалуйста.

Ну либо есть вы используете делитель на 4.
а как учесть количество машинных циклов на запись в таймер этих 55536?
Не совсем понял вопрос. Если нужно вычислить время выполнения команд на запись числа, то нужно посмотреть даташит либо что-то ещё. Там должна быть табличка опкодов с указанием времени выполнения каждого.
Какой контроллер вы используете? В ATmega, например, можно запустить таймер в режиме CTC (очистить счётчик при равенстве текущего значения с установленным). Там вообще всё просто: устанавливаем в OCR1A значение 40000-1 и ставим прерывание по срабатыванию сравнения. Всё, больше ничего делать на надо.
Re: Вопросы по С/С++ (СИ)
Добавлено: Пн июл 25, 2011 23:14:14
Лютик
контроллер pic16f628a.
еще не могу понять такое явление, а именно использую код:
Код: Выделить всё
#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, в чем может быть дело?
Re: Вопросы по С/С++ (СИ)
Добавлено: Пн июл 25, 2011 23:40:47
urry
Подозреваю,что у Вас включены 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;// разрешаем прерывания
Re: Вопросы по С/С++ (СИ)
Добавлено: Пн июл 25, 2011 23:50:40
Лютик
urry писал(а):Подозреваю,что у Вас включены 2 таймера, вектор прерывания - у них один и в обработке Вы никак это не фильтруете.
И вообще, это не так делается.
я привел весь код программы и там задействован всего 1 таймер
проблема решилась тем, что на ноге висел светодиод, к ноге которого дотрагиваясь я измерял частоту, снял светодиод и частота стала стабильной
Re: Вопросы по С/С++ (СИ)
Добавлено: Чт авг 04, 2011 16:03:06
Hispanus
Как можно смоделировать звуки, чтобы потом воспроизводить их силами МК? В частотности, что нужно, чтобы получить на выходе букву В?
Re: Вопросы по С/С++ (СИ)
Добавлено: Чт авг 04, 2011 16:33:06
inkHunter
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 . Спасибо
Re: Вопросы по С/С++ (СИ)
Добавлено: Чт авг 04, 2011 19:05:52
Мастер Ломастер
Victor Gordienko писал(а):а вот _AT91S_PIO это что ?
это алиас структуры, можете наплевать на него, можно и без него обойтись.
Re: Вопросы по С/С++ (СИ)
Добавлено: Чт авг 04, 2011 19:17:14
inkHunter
Мастер Ломастер писал(а):Victor Gordienko писал(а):а вот _AT91S_PIO это что ?
это алиас структуры, можете наплевать на него, можно и без него обойтись.
А зачем так сложно писать ? не проще
struct тип {
}имя переменной;
???
Re: Вопросы по С/С++ (СИ)
Добавлено: Чт авг 04, 2011 22:22:58
Мастер Ломастер
Victor Gordienko писал(а):А зачем так сложно писать ? не проще
struct тип {
}имя переменной;
???
можно и так, но с typedef нагляднее
Re: Вопросы по С/С++ (СИ)
Добавлено: Вс авг 07, 2011 23:04:03
Antifritz
Hispanus писал(а):Как можно смоделировать звуки, чтобы потом воспроизводить их силами МК? В частотности, что нужно, чтобы получить на выходе букву В?
Простой МК может генерировать только однобитные звуки (просто пищать, как встроенный динамик ПК или как ринготоны на древних мобилках). Я когда-то делал функции, которые проигрывали определенные ноты с необходимой длительностью. Так можно проиграть простенькую мелодию. Для воспроизведения реальных звуков нужно подключать ЦАП и, возможно, внешнюю дополнительную память.
Буква В - это имеется ввиду нота "си"?