Телесистемы
 Разработка, производство и продажа радиоэлектронной аппаратуры
На главную   | Карта сайта | Пишите нам | В избранное
Требуется программист в Зеленограде
- обработка данных с датчиков; ColdFire; 40 тыс.
e-mail:jobsmp@pochta.ru

Телесистемы | Электроника | Конференция «Микроконтроллеры и их применение»

Предположение оказалось правильным. Всем спасибо за полезное и результативное обсуждение ! :)

Отправлено Тумблер (194.190.167.185,194.190.160.202) 08 августа 2018, г. 16:27
В ответ на: Правильное предположение, первоначально должен быть задан требуемый выходной уровень... отправлено Exp_t 08 августа 2018, г. 07:48

Задача сформулирована точно.
Другим способом задачу решить нельзя.
Необходимо генерация 2-х задержек исключительно аппаратно, с внешним
запуском и внешней тактовой серией.
Программно можно только менять уставки задержек.
Синхронно с внешним запуском.
---
Цифровой компаратор оказался несовершенным - убогим каким-то.
Форсированное сравнение не записывает результат сравнения в в выходной триггер - оно может только установить его в заданное значение, если значение регистра счётчика достигло или превысило значение регистра сравнения. Это надо специально постараться. Ибо что может быть
проще записи бита в триггер ? :0
При этом в аппаратной логике процессора имеется баг - в режиме "тоггле" почему-то подача сигнал на выход происходит более сложно, в том числе и не правильным образом.
Исходник получился таким:

// Инициализация:
....
// инициализаци таймера 1
TCNT1 = 0;
#ifdef T1MODE_TOGGLE
TCCR1A = 0x50;// спрограммируем моду "toggle"
#endif

#ifdef T1MODE_AUTO // вариант сброса счётом, без использования FOC
TCCR1A = 0xF0;
#endif

#ifdef T1MODE_FOC // вариант сброса c использованием FOC
TCCR1A = 0xF0;
#endif

TCCR1B = 0x07;// Внешняя серия

#ifdef T1MODE_TOGGLE
OCR1A = 2-1; // "-1" поскольку к выходу подключен синхронизатор с
OCR1B = 3-1; // c серией 1 мгц. Он даёт задержку на 1 такт
#endif

#ifdef T1MODE_AUTO
OCR1A = 3-1;
OCR1B = 4-1;
#endif

#ifdef T1MODE_FOC
OCR1A = 4-1;
OCR1B = 5-1;
#endif

// разрешаем прерывание таймеру 1
ITT1_EN

#ifdef T1MODE_AUTO
o1st=0;
#endif

// разрешим все прерывания
EI
....

//----------------------------------------------------------------
// прерывания от таймера 1
//
interrupt [TIMER1_OVF1_vect] void t1_tim (void)
{
#ifdef T1MODE_TOGGLE
T1CLK_RES

TCNT1 = 0xFFFF; // для "правильного" сравнения

//#define OCR1ARES if(PIND & (PD5)) {TCCR1A |= FOC1A;}
//#define OCR1BRES if(PINE & (PE2)) {TCCR1A |= FOC1B;}

OCR1ARES
OCR1BRES

TCNT1 = 0;
// SCOP1
// SCOP0
#endif

#ifdef T1MODE_AUTO // сброс счётом небольшого количества внешних тиков
switch(o1st)
{
case 0:
TCCR1B = 0;
TCCR1A = 0xA0;
OCR1A = 0xFFFE;
OCR1B = 0xFFFE;
TCNT1 = 0xFFFD;
TCCR1B = 0x07;
o1st=1;
break;
case 1:
T1CLK_RES
TCNT1 = 0;
OCR1A = 3-1;
OCR1B = 4-1;
TCCR1A = 0xF0;
o1st=0;
break;
default: o1st=0;break;
}
// SCOP1
// SCOP0
#endif


#ifdef T1MODE_FOC // программный сброс сигналом FOC

T1CLK_RES // запрет счётной серии
TCNT1 = 0xFFFF; // сравним с максимумом
TCCR1A = 0xA0; // выдать 0 (фактически это вызовет сброс)

TCCR1A |= FOC1A | FOC1B; // произвести сравнение (сброс)

TCNT1 = 0; // подготовимся к следующему циклу работы
TCCR1A = 0xF0;
#endif

}
//----------------------------------------------------------------


Если вы - "Тумблер", то можете присоединить файл к сообщению.

Имя*:    Пароль*: 
Максимальный размер файла: 65536 байт.
Разрешённые форматы: png gif pdf jpg jpeg zip rar

(* - обязательные поля)


Составить ответ | Вернуться на конференцию

Ответы


Отправка ответа
Имя*: 
Пароль: 
E-mail: 
Тема*:

Сообщение:

Ссылка на URL: 
URL изображения: 

если вы незарегистрированный на форуме пользователь, то
для успешного добавления сообщения заполните поле, как указано ниже:
введите число 85:

Перейти к списку ответов | Конференция | Раздел "Электроника" | Главная страница | Карта сайта

Rambler's Top100 Рейтинг@Mail.ru
 
Web telesys.ru