|
Простой делитель на простом МК ATMEL?, нужно состряпать делитель макс 10Гц на 10, 4 канала. |
|
|
|
Apr 11 2008, 22:30
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(The Fresh @ Apr 11 2008, 17:19)  Скачал AVR32Studio и AVRStudio 4.13, AVR32Studio под другой кристал - под AVR32. Так что останавливайтесь на AVRStudio 4.13. Вам еще потребуется WinAVR. Скачайте и установите самый свежий WinAVR. После установки WinAVR, запустите AVRStudio. В первом отрывшемся диалоговом окне выбрать New Project -> AVR GCC, и следовать инструкциям (имя каталога проекта, .c файла, чип, отладчик и т.п.) начать можно так: Код #include <avr/io.h> #include <avr/interrupt.h>
void main(void) { ... }
|
|
|
|
|
Apr 13 2008, 11:06
|
Частый гость
 
Группа: Свой
Сообщений: 195
Регистрация: 13-05-07
Из: Норильск
Пользователь №: 27 691

|
Подойдет, например ATtiny26 - 2 порта по 8 I/O, внутренний RC генератор. Но есть одно но: при программировании придется выставить fuse RSTDSBL - так как Reset является альтернативной функцией одного из IO пинов. После этого контроллер можно будет перепрограммировать только с помощью параллельного программатора. Такие пироги Вот исходники на астме и проект для Proteus`а. В протеусе нет контроллера tiny26, пришлось использовать 90S8535. Соответственно, в asm-файле придется перекомментировать 4 первые строки.
frq_div.rar ( 20 килобайт )
Кол-во скачиваний: 115По поводу синхронизации... Можно предложить 2 варианта: 1) Зафиксировать сразу все входные сигналы во временном регистре. Потом их обработать с записью результата во временный регистр. Потом одновременно передать все на выход. - Но это, правда, не совсем та синхронизация ) 2) По возможности выровнять по времени ветки исполнения алгоритма добавлением NOP-ов. В принципе, ничего сложного.
Сообщение отредактировал tazik - Apr 13 2008, 11:14
|
|
|
|
|
Apr 13 2008, 13:46
|
Группа: Новичок
Сообщений: 2
Регистрация: 30-09-07
Пользователь №: 30 945

|
Можно и так, но лучше output1++; перенести из main в обработчик прерываний от таймера. Тогда не надо будет подсчитывать время опытным путем.
|
|
|
|
|
Apr 14 2008, 19:06
|

Частый гость
 
Группа: Новичок
Сообщений: 146
Регистрация: 3-12-06
Пользователь №: 23 071

|
Цитата Не совсем понятно: зачем формируется единица с задержкой Nмсек? Это для того, чтобы прибор перед которым, будет ставиться делитель, смог стопроцентно захватить импульс.
|
|
|
|
|
Apr 15 2008, 00:59
|

Профессионал
    
Группа: Участник
Сообщений: 1 548
Регистрация: 20-12-07
Из: г.Новосибирск
Пользователь №: 33 486

|
Цитата(The Fresh @ Apr 15 2008, 02:06)  Это для того, чтобы прибор перед которым, будет ставиться делитель, смог стопроцентно захватить импульс. Не вижу в ваших сишных виршах делителя на 10. Если на вых. нужен меандр нужно фиксировать 5-й входной импульс, если не меандр , то любой другой(девятый). Т.е. с приходом 9-ого вх. имп. изменяете состояние вых., с приходом 10-ого - на противоположное. Посмотрите диаграммы работы любого счетчика.
--------------------
И на камнях растут деревья!
|
|
|
|
|
Apr 16 2008, 04:49
|
Частый гость
 
Группа: Свой
Сообщений: 195
Регистрация: 13-05-07
Из: Норильск
Пользователь №: 27 691

|
Цитата Нужен простой декадный делитель на 4 канала, входная частота максимум 5 Гц, так как на выходе нужен импульс пошире, чем ширина входного импульса, то формировать его надо с приходом 10-го импульса и держать скажем 1 сек. Это маленько выбивается из понятий обычных счетчиков, но таковы условия задачи. В смысле так что-ли?
Исходники на асме
frq_div2.rar ( 21.36 килобайт )
Кол-во скачиваний: 101
|
|
|
|
|
Apr 17 2008, 11:27
|

Частый гость
 
Группа: Новичок
Сообщений: 146
Регистрация: 3-12-06
Пользователь №: 23 071

|
Я наверное изначально неправильно вопрос поставил, считать надо не количество изменений на входе а именно количество импульсов, т.е. физического как он есть и соответственно событие либо по переднему либо по заднему фронту. Если выбрать по переднему фронту то код надо менять так. Далее импульс на выходе будем формировать скажем после прихода 6, а скидывать с 10 т.е. ширина импульса на выходе будет всегда в диапазоне времени от 1-го до 10-го импульса вне зависимости от частоты и если вдруг питание пропадет то округление будет типа математичского (практически если брать 5 а не 6). Если неправ поправьте. Код void main(void) { // Инициализация x1= IN1; c1=0; OUT1= 0; x2= IN2; c2=0; OUT2= 0; x3= IN3; c3=0; OUT3= 0; x4= IN4; c4=0; OUT4= 0;
//................... // Делитель на 10 if(x1 != IN1)&(IN1==1) { x1= IN1; ++c1; if(c1 == 6) { OUT1=1; } if(c1 == 10) { c1= 0; OUT1=0; } } if(x2 != IN2)&(IN2==1) { x2= IN2; ++c2; if(c2 == 6) { OUT2=1; } if(c2 == 10) { c2= 0; OUT2=0; } }
if(x3 != IN3)&(IN3==1) { x3= IN3; ++c3; if(c3 == 6) { OUT3=1; } if(c3 == 10) { c3= 0; OUT3=0; } } if(x4 != IN4)&(IN4==1) { x4= IN4; ++c4; if(c4 == 6) { OUT4=1; } if(c4 == 10) { c4= 0; OUT4=0; } }
//................
}
Сообщение отредактировал The Fresh - Apr 17 2008, 11:30
|
|
|
|
|
Apr 18 2008, 12:01
|

Профессионал
    
Группа: Участник
Сообщений: 1 548
Регистрация: 20-12-07
Из: г.Новосибирск
Пользователь №: 33 486

|
Цитата(domowoj @ Apr 15 2008, 07:59)  Если на вых. нужен меандр нужно фиксировать 5-й входной импульс, с приходом 10-ого - на противоположное. Вам это и предлагали. Цитата(Палыч @ Apr 15 2008, 20:34)  Если выходной сигнал менять на противоположный после каждых десяти изменений сигнала на входе - получите меандр. Или это.
--------------------
И на камнях растут деревья!
|
|
|
|
|
Apr 18 2008, 15:12
|

Частый гость
 
Группа: Новичок
Сообщений: 146
Регистрация: 3-12-06
Пользователь №: 23 071

|
До конца не разобрал код. Меня смутило то что в счетчике учитывается изменение сигнала т.е. счетчик покажет 10 уже после 5 импульсов, вот это и смутило. Теперь после Ваших недоумений, еще раз пересмотрел код и понял что вот это OUTi= ~OUTi; будет менять выход на 10 импульсе в обратное состояние. Разница в моем и вашем коде в том, что у Вас он сделан рациональнее, а я не усмотрел алгоритма. Вот и все. Код void main(void) { // Инициализация xi= INi; ci=0; OUTi= 0; //................... for(;;) { // Делитель на 10 if(xi != INi) { xi= INi; if((++ci) == 10) { ci= 0; OUTi= ~OUTi; } } //................ } }
|
|
|
|
|
Apr 18 2008, 16:07
|
Группа: Новичок
Сообщений: 6
Регистрация: 9-01-07
Пользователь №: 24 231

|
А я делал делитель на 10000 на асме... точнее, делилась частота подключенного кварца. Ну а потом без труда определил номиналы этих кварцев.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|