Вопросы по С/С++ (СИ)

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Аватара пользователя
avreal
Опытный кот
Сообщения: 842
Зарегистрирован: Чт дек 31, 2009 19:27:45
Откуда: Бровари, Україна
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение avreal »

Gudd-Head писал(а):Немного упустил нить вашего рассуждения, но это похоже на делитель частоты с дробным коэффициентом деления... тема моего диплома (правда, там всё было "в железе") :)
Ну да, "Брезенхем для линии" и есть один из "хороших" дробных делителей. 155ИЕ8 попроще, но и похуже.
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Re: Вопросы по С/С++ (СИ)

Сообщение Gudd-Head »

avreal писал(а):Ну да, "Брезенхем для линии" и есть один из "хороших" дробных делителей.

Это похоже на работу дельта-сигма модулятора первого порядка :) Модулятор второго порядка оперировал бы уже с четырьмя коэффициентами деления: 8, 9, 10, 11.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Лютик
Нашел транзистор. Понюхал.
Сообщения: 161
Зарегистрирован: Вт мар 25, 2008 22:10:23
Откуда: Минск

Re: Вопросы по С/С++ (СИ)

Сообщение Лютик »

что то я совсем запутался. Может кто-нибудь скинуть код для формирования частоты в 500Гц при кварце 20МГц для часиков реального времени, сколько не делаю все остают или спешат, причем прилично таки :cry:
Аватара пользователя
Леонид Иванович
Друг Кота
Сообщения: 4779
Зарегистрирован: Сб апр 02, 2011 12:40:46
Откуда: Минск
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Леонид Иванович »

Gudd-Head писал(а):Это похоже на работу дельта-сигма модулятора первого порядка


Фактически, Брезенхем и есть дельта-сигма модулятор первого порядка. Реализация чуть другая, но выходной результат - тот же.
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Re: Вопросы по С/С++ (СИ)

Сообщение Gudd-Head »

Лютик писал(а):формирования частоты в 500Гц при кварце 20МГц

Дык, это просто надо поделить на 40 000.
Лютик писал(а):для часиков реального времени, сколько ни делаю, все остают или спешат, причем прилично таки

Нет, чтобы специализированную микросхему прикошачить... Ещё и календарь был бы.
Ничегонеработает писал(а):Фактически, Брезенхем и есть дельта-сигма модулятор первого порядка. Реализация чуть другая, но выходной результат - тот же.

Здорово. Спасибо, буду знать.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Лютик
Нашел транзистор. Понюхал.
Сообщения: 161
Зарегистрирован: Вт мар 25, 2008 22:10:23
Откуда: Минск

Re: Вопросы по С/С++ (СИ)

Сообщение Лютик »

Лютик писал(а):для часиков реального времени, сколько ни делаю, все остают или спешат, причем прилично таки

Нет, чтобы специализированную микросхему прикошачить... Ещё и календарь был бы.
[/quote]
и пол интернета часов на пиках это просо так...
Уважаемые, скиньте пожалуйста код на Си реализации часов на Пике, спасибо
Аватара пользователя
urry
Сверлит текстолит когтями
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение urry »

Код: Выделить всё

Уважаемые, скиньте пожалуйста код на Си реализации часов на Пике, спасибо

Прикольно...
И какой смысл постить, когда тебя не читают.. :)
Лютик
Нашел транзистор. Понюхал.
Сообщения: 161
Зарегистрирован: Вт мар 25, 2008 22:10:23
Откуда: Минск

Re: Вопросы по С/С++ (СИ)

Сообщение Лютик »

urry писал(а):

Код: Выделить всё

Уважаемые, скиньте пожалуйста код на Си реализации часов на Пике, спасибо

Прикольно...
И какой смысл постить, когда тебя не читают.. :)

честно говря не очень прикольно, так как собрал суточное реле времени, рассчитал всю схему с нуля, написал прошивку(столкнулся и с переполнением стека, глюками компилятора и т.д. и т.п.(намучался)), в общем все сделал, а часы работают не точно и вот сижу с моря погоды жду... :(
Аватара пользователя
IfoR
Поставщик валерьянки для Кота
Сообщения: 2029
Зарегистрирован: Сб ноя 15, 2008 10:09:56
Откуда: г. Тула
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение IfoR »

Лютик, ну так вы могли бы читать посты дальше первой строчки?
Gudd-Head вам же уже ответил что нужно делать: поделить частоту на 40000. Единственное что осталось, так это правильно подсчитать время выполнения кода. У вас есть на борту 16-битный таймер-счётчик? Так если есть, установите начальное значение в счётчике равным 25536 и запустите его без деления частоты. Установите прерывание пои переполнению. В этом прерывании каждый раз устанавливаете начальное значение и это прерывание будет вызываться точно с частотой 500 Гц.
Это не единственный способ. Можно вообще обойтись без таймеров, но тут нужно расчитывать время выполнения.
Изображение
/dev/urandom - гигабайты информации.

OS: openSUSE 13.2 (x86_64)
Лютик
Нашел транзистор. Понюхал.
Сообщения: 161
Зарегистрирован: Вт мар 25, 2008 22:10:23
Откуда: Минск

Re: Вопросы по С/С++ (СИ)

Сообщение Лютик »

IfoR писал(а):Лютик, ну так вы могли бы читать посты дальше первой строчки?
Gudd-Head вам же уже ответил что нужно делать: поделить частоту на 40000. Единственное что осталось, так это правильно подсчитать время выполнения кода. У вас есть на борту 16-битный таймер-счётчик? Так если есть, установите начальное значение в счётчике равным 25536 и запустите его без деления частоты. Установите прерывание пои переполнению. В этом прерывании каждый раз устанавливаете начальное значение и это прерывание будет вызываться точно с частотой 500 Гц.
Это не единственный способ. Можно вообще обойтись без таймеров, но тут нужно расчитывать время выполнения.

мне кажется загрузить надо 55536.
а как учесть количество машинных циклов на запись в таймер этих 55536?
Аватара пользователя
IfoR
Поставщик валерьянки для Кота
Сообщения: 2029
Зарегистрирован: Сб ноя 15, 2008 10:09:56
Откуда: г. Тула
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение IfoR »

Ну если 65536 - 40000 = 55536, то пожалуйста. :) Ну либо есть вы используете делитель на 4.
а как учесть количество машинных циклов на запись в таймер этих 55536?

Не совсем понял вопрос. Если нужно вычислить время выполнения команд на запись числа, то нужно посмотреть даташит либо что-то ещё. Там должна быть табличка опкодов с указанием времени выполнения каждого.
Какой контроллер вы используете? В ATmega, например, можно запустить таймер в режиме CTC (очистить счётчик при равенстве текущего значения с установленным). Там вообще всё просто: устанавливаем в OCR1A значение 40000-1 и ставим прерывание по срабатыванию сравнения. Всё, больше ничего делать на надо.
Изображение
/dev/urandom - гигабайты информации.

OS: openSUSE 13.2 (x86_64)
Лютик
Нашел транзистор. Понюхал.
Сообщения: 161
Зарегистрирован: Вт мар 25, 2008 22:10:23
Откуда: Минск

Re: Вопросы по С/С++ (СИ)

Сообщение Лютик »

контроллер 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, в чем может быть дело?
Аватара пользователя
urry
Сверлит текстолит когтями
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение 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;// разрешаем прерывания

Лютик
Нашел транзистор. Понюхал.
Сообщения: 161
Зарегистрирован: Вт мар 25, 2008 22:10:23
Откуда: Минск

Re: Вопросы по С/С++ (СИ)

Сообщение Лютик »

urry писал(а):Подозреваю,что у Вас включены 2 таймера, вектор прерывания - у них один и в обработке Вы никак это не фильтруете.
И вообще, это не так делается.

я привел весь код программы и там задействован всего 1 таймер
проблема решилась тем, что на ноге висел светодиод, к ноге которого дотрагиваясь я измерял частоту, снял светодиод и частота стала стабильной
Аватара пользователя
Hispanus
Грызет канифоль
Сообщения: 262
Зарегистрирован: Сб мар 26, 2011 14:17:14
Откуда: Оренбург

Re: Вопросы по С/С++ (СИ)

Сообщение Hispanus »

Как можно смоделировать звуки, чтобы потом воспроизводить их силами МК? В частотности, что нужно, чтобы получить на выходе букву В?
У радио нет будущего. Летательные аппараты тяжелее воздуха невозможны. Скоро выяснится, что рентгеновские лучи - мистификация.

[i]Лорд Кельвин, физик, 1899 г.[/i]
inkHunter
Грызет канифоль
Сообщения: 287
Зарегистрирован: Сб авг 21, 2010 20:44:27
Откуда: Ростов
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение 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 . Спасибо
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Мастер Ломастер »

Victor Gordienko писал(а):а вот _AT91S_PIO это что ?
это алиас структуры, можете наплевать на него, можно и без него обойтись.
битва с дураками проиграна, победители торжествуют. слава победителям!
inkHunter
Грызет канифоль
Сообщения: 287
Зарегистрирован: Сб авг 21, 2010 20:44:27
Откуда: Ростов
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение inkHunter »

Мастер Ломастер писал(а):
Victor Gordienko писал(а):а вот _AT91S_PIO это что ?
это алиас структуры, можете наплевать на него, можно и без него обойтись.


А зачем так сложно писать ? не проще
struct тип {

}имя переменной;

???
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Мастер Ломастер »

Victor Gordienko писал(а):А зачем так сложно писать ? не проще
struct тип {
}имя переменной;
???
можно и так, но с typedef нагляднее
битва с дураками проиграна, победители торжествуют. слава победителям!
Аватара пользователя
Antifritz
Прорезались зубы
Сообщения: 222
Зарегистрирован: Чт июл 08, 2010 01:03:40
Откуда: Украина, Киев

Re: Вопросы по С/С++ (СИ)

Сообщение Antifritz »

Hispanus писал(а):Как можно смоделировать звуки, чтобы потом воспроизводить их силами МК? В частотности, что нужно, чтобы получить на выходе букву В?


Простой МК может генерировать только однобитные звуки (просто пищать, как встроенный динамик ПК или как ринготоны на древних мобилках). Я когда-то делал функции, которые проигрывали определенные ноты с необходимой длительностью. Так можно проиграть простенькую мелодию. Для воспроизведения реальных звуков нужно подключать ЦАП и, возможно, внешнюю дополнительную память.
Буква В - это имеется ввиду нота "си"?
Ответить

Вернуться в «Разные вопросы по МК»