реклама на сайте
подробности

 
 
> Много вопросов накопилось... Сильно не глумитесь, ATMega16 & etc
Screw
сообщение Nov 29 2006, 22:35
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 149
Регистрация: 29-11-06
Из: Барнаул
Пользователь №: 22 916



Здравствуйте, господа хорошие.
Перечитал я весь форум и охватило меня дикое желание узнать что-то новое в сфере AVR у профи, а не у таких же "знатоков" как я unsure.gif

Итак, от слов к делу:

1) Прерывания.... Знаю, тема больная, перечитал все, что тут есть..... Но.... либо опыта маловато, либо голова моя садовая - не принимает информацию wink.gif
Объясните на пальцах, что произойдет, если... (везде имеется ввиду Mega16)
Произошло прерывание Int1, в нем стоит задержка (ну или какая-то работа выполняется), во время которой происходит событие на порту INT0 (больший приоритет по документации). Далее во время этой же задержки срабатывает прерывание по таймеру-счетчику.

Распишите, если не трудно, в каком порядке это все будет отработано....

Возможно как-либо изменить приоритет прерываний ? Какие существуют решения?

2) Каким образом можно посчитать количество времени, затраченного на выполнение определенного куска кода (подпрограммы обработки прерывания допустим) в CVAVR?

3) У Атмела существует такой AppNote - Zero-Detector. Суть (если кто не видел) - соединяем ч/з 1Мом фазу и int0, а так же ноль и землю питания контроллера. Далее через прерывание идет обработка...
Дак вот - собрал сначало я со стабилитроном (на всякий пожарный) на 2,5 В. Все бы ничего - но контроллер в прерывание не уходил. На осциллографе все красиво, но видимо Меге мои красоты до..... Стабилитрон убрал - работает. Объясните, почему так оно происходит? При длительной работе без стабилитрона выход контроллера из строя как скоро произойдет?
За одно про int0 и тп.... в настройке этого прерывания можно выставлять передний и задний фронты сигналов (выставлял есс-но не я, а CVAVR). У меня есть подозрение, что что-то я делаю не так, ибо на осциллограмме смотрю фазу - ушла вниз, а прерывание на передний фронт сработало. (фазу и ноль не перепутал.... единственное - может меандр уплывает, но двухлучевика нет).

4) Граждане, привидите пример опроса клавиатуры 4x4 матрица... Самый простой, чтобы в глобальную переменную (назовем её key) выводилось значение нажатой клавиши.
Делал сам по 2-м алгоритмам.... сначало бегающим нулем с pullup, затем код клавиши вычислял через значения pinX.... Но то ли лыжи не едут.....


Надеюсь на Вашу помощь. Извините за сумбурность, писалось это все в 1-27 ночи wacko.gif

Сообщение отредактировал Screw - Nov 29 2006, 22:38
Go to the top of the page
 
+Quote Post
4 страниц V   1 2 3 > »   
Start new topic
Ответов (1 - 49)
SasaVitebsk
сообщение Nov 29 2006, 22:49
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Цитата(Screw @ Nov 29 2006, 22:35) *
Здравствуйте, господа хорошие.
Перечитал я весь форум и охватило меня дикое желание узнать что-то новое в сфере AVR у профи, а не у таких же "знатоков" как я unsure.gif

Итак, от слов к делу:

1) Прерывания.... Знаю, тема больная, перечитал все, что тут есть..... Но.... либо опыта маловато, либо голова моя садовая - не принимает информацию wink.gif
Объясните на пальцах, что произойдет, если... (везде имеется ввиду Mega16)
Произошло прерывание Int1, в нем стоит задержка (ну или какая-то работа выполняется), во время которой происходит событие на порту INT0 (больший приоритет по документации). Далее во время этой же задержки срабатывает прерывание по таймеру-счетчику.

Распишите, если не трудно, в каком порядке это все будет отработано....

Возможно как-либо изменить приоритет прерываний ? Какие существуют решения?


По поводу п.1 я написал статью находится по адресу http://nix-06.nm.ru/ Как раз Ваш случай. smile.gif Рассмотрел варианты программ. Привёл примеры. Есть осциллограммы. Написал также библиотеку для LCD на базе HD44780. Пишу для клавиатуры 4х4. Напишу выложу. Здесь и там.
Go to the top of the page
 
+Quote Post
aesok
сообщение Nov 29 2006, 23:30
Сообщение #3


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



Цитата
3) У Атмела существует такой AppNote - Zero-Detector. Суть (если кто не видел) - соединяем ч/з 1Мом .....
При длительной работе без стабилитрона выход контроллера из строя как скоро произойдет?


Вот Application Note от микрочипа где описана теория (почему вход контроллера останеться целым) и практика (как расчитать резистор):

http://ww1.microchip.com/downloads/en/AppNotes/00521c.pdf

Анатолий.

ADD:
Из AVR182: Zero Cross Detector стр. 7:
...
The series resistor can also be modified somewhat to make the detection closer but
note that the maximum current through the AVR’s clamping diode should not be higher
than 1 mA.

Тоесть максимальный входной ток через защитные диоды 1 ma.

Про входную емкость нашёл только в табличке про TWI интерфейс, но скорее всего она одинаковая для всех пинов (Ci = 10pF). Даташит на ATmega16 стр. 297.

Сообщение отредактировал aesok - Nov 30 2006, 00:14
Go to the top of the page
 
+Quote Post
demaven
сообщение Nov 30 2006, 07:06
Сообщение #4


Частый гость
**

Группа: Свой
Сообщений: 108
Регистрация: 10-05-05
Из: Киргизия Бишкек
Пользователь №: 4 886



И самое главное - обработчик прерываний не должен быть длинным по времени, желательно его сделать как можно короче, а окончательную обработку прерывания передать в основную программу. Тогда есть шанс не потерять следующее прерывание при обработке пришедшего.
Go to the top of the page
 
+Quote Post
Screw
сообщение Nov 30 2006, 07:08
Сообщение #5


Частый гость
**

Группа: Свой
Сообщений: 149
Регистрация: 29-11-06
Из: Барнаул
Пользователь №: 22 916



Цитата(SasaVitebsk @ Nov 29 2006, 22:49) *
По поводу п.1 я написал статью находится по адресу http://nix-06.nm.ru/ Как раз Ваш случай. smile.gif Рассмотрел варианты программ. Привёл примеры. Есть осциллограммы. Написал также библиотеку для LCD на базе HD44780. Пишу для клавиатуры 4х4. Напишу выложу. Здесь и там.



Из Вашей статьи следует, что возможно сделать только одно прерывание с максимальным приоритетом... Т.е. получится, такая же цепочка из допустимых прерываний, но уже возможен вызов из самих прерываний. Т.о. необходимо разрешить прерывания во всех обработчиках, кроме самого приоритетного - я правильно Вас понял?

Опять же появился еще один непонятный момент.... Если при обработке какого-то прерывания (допустим any change INT1) разрешить глобальные прерывания и до окончания обработки наступит опять Interrupt INT1 - как быть??? Это не конкретно моя задача, у меня все несколько проще, но тем не менее - хотелось бы знать.

Все еще непонятно, будет ли после обработки более высокооуровнего прерывания обработано более низкое по приоритетам...

В любом случае - спасибо за ответ и помощь.

Сообщение отредактировал Screw - Nov 30 2006, 07:12
Go to the top of the page
 
+Quote Post
otrog
сообщение Nov 30 2006, 08:50
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 232
Регистрация: 22-02-06
Из: Воронеж
Пользователь №: 14 589



По поводу второго вопроса: Определить время выполнения куска кода можно в симуляторе, например в AVR Studio.
По стабилитрону: 2,5В явно мало для уровня логической единицы, при питании контроллера от 5В. Поставьте стабилитрон на 5,1В или 4,7В и все заработает. А ИМХО полагаться только на встроенные защитные диоды как-то неправильно.


--------------------
Истина рождается в спорах; но когда страсти кипят, истина испаряется.
Go to the top of the page
 
+Quote Post
Wild007
сообщение Nov 30 2006, 09:59
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 226
Регистрация: 25-03-05
Из: Беларусь
Пользователь №: 3 672



По первому пункту:
При входе в пп обработки прерывания снимается флаг I регистра SREG (глобальное разрешение прерываний) и, естественно, если во время обработки прерывания произойдет любое другое прерывание его обработка начнется только после команды RETI в соответстви с его приорететом. В прерывании конечно можно программно разрешить обработку других прерываний (SEI), но вы запутаетесь в разрешениях и нарушится баланс стека, что не есть хорошо. Корректней в пп обработке прерывания надо просто устанавливать какой-то флаг прошедшего преравания и обрабатывать его в главном цикле. Тогда не запутаетесь со стеком и приоретет обработки прерываний вас не будет волновать. Приоритет прерываний установлен жестко логикой работы мс и изменить его програмно не возможно.

По второму пункту:
Я пишу програмы на ASM в AVR Studio и она позволяет измерить время выполнения любого куска програмы и не было случая что бы время выполнения реальной програмы на реальном железе отличалось от измеренного в STUDIO.


--------------------
Ничто так не ограничивает полет мысли программиста, как компилятор
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Nov 30 2006, 10:07
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(Screw @ Nov 29 2006, 22:35) *
Надеюсь на Вашу помощь.

По прерываниям именно так - Вы можете разрешить вложенные прерывания во всех, кроме самого приоритетного. Сформировать приоритеты по другому в наиболее дешевых и популярных микроконтроллерах невозможно.

Опасность вложенных прерывания именно в том, что если во время выполнения одного придет запрос опять, стек переполнится и все рухнет. Если прерывание другое, то просто глубина стека нужна побольше, а если прерывание такое-же, то никакого стека не хватит.
Но!
Вы ведь при проектировании системы учли быстродействие контроллера, чтобы прерывания давали основной программе работать? wink.gif Доверьтесь собственному выбору smile.gif Оцените предварительно длительности выполнения прерываний, не пишите там сложных вычислений, индексаций массивов, задержек и проч. Контролируйте длительности прерываний в реальном приборе осциллографом, дергая вывод при входе и выходе из прерывания.

И будет Вам щастье! santa2.gif


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Nov 30 2006, 16:38
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Цитата(Wild007 @ Nov 30 2006, 09:59) *
По первому пункту:
При входе в пп обработки прерывания снимается флаг I регистра SREG (глобальное разрешение прерываний) и, естественно, если во время обработки прерывания произойдет любое другое прерывание его обработка начнется только после команды RETI в соответстви с его приорететом. В прерывании конечно можно программно разрешить обработку других прерываний (SEI), но вы запутаетесь в разрешениях и нарушится баланс стека, что не есть хорошо. Корректней в пп обработке прерывания надо просто устанавливать какой-то флаг прошедшего преравания и обрабатывать его в главном цикле. Тогда не запутаетесь со стеком и приоретет обработки прерываний вас не будет волновать. Приоритет прерываний установлен жестко логикой работы мс и изменить его програмно не возможно.


Вы своим ответом вводите в заблуждение. "Но вы запутаетесь в разрешениях и нарушится баланс стека" - это непереводимая игра слов. Если всё рассчитано правильно, то ничего страшного произойти не может. Вы не запутаетесь потому что Вы не обрабатываете прерывания, а МК не запутается потому что он МК. Его запутать сложно. Если у Вас придёт разрешённое прерывание ещё раз, то это нехорошо smile.gif но это недопустимо при любой обработке. Теоритически, наверное, обработать можно если учитывать такую вероятность. Но если такое происходит регулярно, то такая прога не будет работать как при разрешённых, так и при запрещённых прерываниях. То есть здесь надо следовать Dog Pawlowa и чётко расчитывать производительность контроллера.

Цитата(Screw @ Nov 30 2006, 09:59) *
Из Вашей статьи следует, что возможно сделать только одно прерывание с максимальным приоритетом... Т.е. получится, такая же цепочка из допустимых прерываний, но уже возможен вызов из самих прерываний. Т.о. необходимо разрешить прерывания во всех обработчиках, кроме самого приоритетного - я правильно Вас понял?

Для двух уровней - да. Для трёх - перечитайте - там нет примера, но разжёвано. Как понимать фразу "Т.е. получится, такая же цепочка из допустимых прерываний"? И что Вас пугает? Кстати двух уровней достаточно для 99% случаев. Это же не IBM.

Цитата(Screw @ Nov 30 2006, 09:59) *
Все еще непонятно, будет ли после обработки более высокооуровнего прерывания обработано более низкое по приоритетам...


Естественно. Оно (или они) будет обработано сразу же после завершения обработки высокоуровневого прерывания, в порядке аппаратных приоритетов. М/у этими прерываниями будет выполнятся по одной операции головы. Глубина стека при этом должна быть увеличена и предусматривать возможность вложенных прерываний.
Рассмотрим например вариант когда у Вас три прерывания. Int1, UART, OCR0. Int1 - высокоприоритетное, остальные равные. Тогда в OCR0 и UART необходимо разрешить прерывание. Во всех трёх не должны быть использованы общие переменные или за этим необходимо следить, не должно быть использованы общие ресурсы. Например приходит прерывание от UART (не завершилось) потом Int1 (прервана UART) и во время Int1 - OCR. После завершения Int1 будет выполнена одна команда UART и вызвано OCR, по завершению - завершится UART. Поскольку возможен вариант вложенных вызовов OCR-UART-Int1, то стек должен быть увеличен на сумму стеков этих прерываний. Время реакции самого высокоприоритетного прерывания составит в худшем случае - 4+1+4 если команда sei идёт первой командой низкоприоритетного прерывания (так бывает не всегда). Это для ассемблера. Для Си надо смотреть реальный код.
Go to the top of the page
 
+Quote Post
Screw
сообщение Nov 30 2006, 17:34
Сообщение #10


Частый гость
**

Группа: Свой
Сообщений: 149
Регистрация: 29-11-06
Из: Барнаул
Пользователь №: 22 916



Цитата(demaven @ Nov 30 2006, 07:06) *
И самое главное - обработчик прерываний не должен быть длинным по времени, желательно его сделать как можно короче, а окончательную обработку прерывания передать в основную программу. Тогда есть шанс не потерять следующее прерывание при обработке пришедшего.


Т.е. из обработчика прерывания вызвать подпрограмму обработки? А МК не будет думать, что этот код относится к обработчику (ну и загнул wink.gif ?
т.е. к примеру если я сделаю так:

<Timer1 Overflow>
{
obrabotka();
};

void main(void)
{
основная программа
};

void obrabotka(void)
{
Обработка прерывания
};


Будет правильно? Или в начало подпрограммы obrabotka надо вставить "SEI"?
Цитата(otrog @ Nov 30 2006, 08:50) *
По поводу второго вопроса: Определить время выполнения куска кода можно в симуляторе, например в AVR Studio.
По стабилитрону: 2,5В явно мало для уровня логической единицы, при питании контроллера от 5В. Поставьте стабилитрон на 5,1В или 4,7В и все заработает. А ИМХО полагаться только на встроенные защитные диоды как-то неправильно.

Стабилитроны были 3,9 В куплены.... но реальность оказалась суровой 2,5 В wink.gif По идее при 5-ти вольтовом питании 1,7 В - минимальный порог, а 2,5 В - гарантированный порог... Но это так, болтология, надо будет все же поставить защитный стабилитрон.
Go to the top of the page
 
+Quote Post
Screw
сообщение Nov 30 2006, 17:49
Сообщение #11


Частый гость
**

Группа: Свой
Сообщений: 149
Регистрация: 29-11-06
Из: Барнаул
Пользователь №: 22 916



Вообще что-то сильно я вглубь полез.... Есть у меня такое качество.
По сути проект будет делать следующее:
1) есть 2 равноприоритетных прерывания высшего уровня INT0 и INT1. Перехлест их невозможен, происходят они с частотой 50 Гц каждое (нули синусоиды ловлю).
Так же в этом прерывании происходит открытие тиристоров в зависимости от алгоритма и данных с клавиатуры.
2) Есть прерывание от таймера счетчика для опроса клавиатуры. (А надо ли прерывание.... Но как подругому сделать клавиатуру доступной все время - пока непонятно)
3) В основной программе обработка данных с клавиатуры, вывод на LCD.

Вот такой вот проектик. Если у кого есть какие мысли - поделитесь, буду благодарен.

P.S. Да простят меня модераторы, но просто нехотелось создавать кучу тем.... лучше уж в одной о всех моих проблемах.

Сообщение отредактировал Screw - Nov 30 2006, 17:49
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Nov 30 2006, 22:15
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Цитата(Screw @ Nov 30 2006, 17:49) *
Вообще что-то сильно я вглубь полез.... Есть у меня такое качество.
По сути проект будет делать следующее:
1) есть 2 равноприоритетных прерывания высшего уровня INT0 и INT1. Перехлест их невозможен, происходят они с частотой 50 Гц каждое (нули синусоиды ловлю).
Так же в этом прерывании происходит открытие тиристоров в зависимости от алгоритма и данных с клавиатуры.
2) Есть прерывание от таймера счетчика для опроса клавиатуры. (А надо ли прерывание.... Но как подругому сделать клавиатуру доступной все время - пока непонятно)
3) В основной программе обработка данных с клавиатуры, вывод на LCD.

Вот такой вот проектик. Если у кого есть какие мысли - поделитесь, буду благодарен.

P.S. Да простят меня модераторы, но просто нехотелось создавать кучу тем.... лучше уж в одной о всех моих проблемах.


Прерывание от таймера действительно придётся делать, для обработки клавиатуры, а можно и в другое вложить. Прерывание от 50Гц к томуже высокоприоритетное - это мало вероятно. 50Гц - это весьма низкая величина для МК. 20мс при 8 МГц - 160000 циклов. И потеря 200-500 (примерно среднее время обработки прерывания - это ничтожный процент. К тому же если Ваши синусоиды сфазированы, то 2 прерывания одновременно произойти не могут, но в любом случае выбор за Вами.

demaven Вы поняли неверно. Он писал совершенно верно. Прерывание должно быть максимально коротким и должно обрабатывать только суть процесса. Обычно ввод/вывод и предварительная обработка. Всё что не привязано к событию должно обрабатываться в голове. Например - по прерыванию ввёл данные с АЦП и засунул в ОЗУ и выставил флаг, что данные пришли. А в голове по флагу обработал их.

Всего не опишешь, - это в процессе обучения поймёшь. И универсальных приёмов не бывает. Отличаются также подходы для Си и для Асма.
Go to the top of the page
 
+Quote Post
Dopler
сообщение Nov 30 2006, 23:44
Сообщение #13


Местный
***

Группа: Свой
Сообщений: 437
Регистрация: 23-04-05
Из: Таганрог
Пользователь №: 4 425



Если у вас два прерывания, одно по возрастающему фронту, другое по спадающему (50 гц), то можно настроить порт на любое изменение на ноге и получить прерывание 100 гц, а в обработчике читать значение ножки и определять полярность.

Интересно, поставите вы стабилитрон на +5В, а что будете делать с отрицательным напряжением (с диодом, который открывается на землю)? Ответ один - стабилитрон там даром не нужен, если правильно выбран гасящий резистор (ток через защитные диоды не превышает 1 мА). Если уж так хочется перестраховаться поставьте два внешних диода.

Кстати, стабилитрон у вас выдает 2,5В, так как ток через него течет совсем слабый (если ставили резистор 1МОм, то меньше 1мА), так что это вполне закономерно (открываем ВАХ стабилитрона и смотрим).
Go to the top of the page
 
+Quote Post
defunct
сообщение Dec 1 2006, 01:35
Сообщение #14


кекс
******

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



Цитата(SasaVitebsk @ Nov 30 2006, 16:38) *
фразу "Т.е. получится, такая же цепочка из допустимых прерываний"? И что Вас пугает? Кстати двух уровней достаточно для 99% случаев. Это же не IBM.

С тем же успехом можно заявить - одного уровня достаточно для 99% случаев. Вот и появляется вопрос:

зачем ломать, естественным образом полученный, простой механизм синхронизации?
Ведь, добавляя второй уровень, добвляется также и ряд проблем связанных с синхронизацией данных.

этот вопрос, чуть выше Вы назвали:
Цитата
это непереводимая игра слов.
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Dec 1 2006, 11:51
Сообщение #15


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Цитата(Screw @ Nov 30 2006, 16:49) *
P.S. Да простят меня модераторы, но просто нехотелось создавать кучу тем.... лучше уж в одной о всех моих проблемах.

Если бы я все свои посты совал в одну тему, то кто захотел бы читать около сотни страниц?
Да и как назвать такую тему? "Проблемы от IgorKossak"? wink.gif
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Dec 1 2006, 12:37
Сообщение #16


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Цитата(defunct @ Dec 1 2006, 01:35) *
Цитата(SasaVitebsk @ Nov 30 2006, 16:38) *

фразу "Т.е. получится, такая же цепочка из допустимых прерываний"? И что Вас пугает? Кстати двух уровней достаточно для 99% случаев. Это же не IBM.

С тем же успехом можно заявить - одного уровня достаточно для 99% случаев. Вот и появляется вопрос:

зачем ломать, естественным образом полученный, простой механизм синхронизации?
Ведь, добавляя второй уровень, добвляется также и ряд проблем связанных с синхронизацией данных.

этот вопрос, чуть выше Вы назвали:
Цитата
это непереводимая игра слов.



Возможно, отвечая другому, я подумал бы что у Вас мало опыта. Но анализируя другие Ваши топики, понимаю что это не так. Из этого я делаю такой вывод - или область Ваших работ абсолютно не перекрывается с моей (иными словами Вам действительно не требуется то, что мне необходимо ежедневно) либо Вы выработали какой-то свой стиль и подход мне неведомый.

1) Непереводимая игра слов я ответил потому, что она там была. Поясните мне что значит фраза "запутаться" или "нарушить баланс стэка" и какие у Вас проблемы "связанные с синхронизацией данных"?
Ещё раз Вам повторяю. Я с этим работаю постоянно. Никаких проблем нет. По крайней мере у меня.
2) На счёт "второго уровня", давайте банально обратимся к оборудованию. Если бы это было не нужно, то этого нигде или почти негде небылобы. Но это есть аппаратно в x51 (2 уровня) в ARM (8) в других просто не интересовался.

Приведу простой и по моему доступный пример, - приведите своё решение. У меня идёт сигнал со станции 32 кГц(31.25мкс) (АТС С32) где "0" импульс длительностью 2мкс, "1" - длительностью 4мкс. Ч/з 2мкс от среза мне необходимо выдать ответный импульс длительностью 2мкс. Есть прерывание от таймера и USART. Частота 7.3728.

Всё это на уровне ощущений, как и везде в программировании. Я лишнее никогда не добавляю. Я сразу чуствую что можно, а что лишнее. И если получается как-то не так, то чуствую какой-то дискомфорт. Я понимаю что скорее всего уважаемый defunct чувствует что-то вроде этого. То есть ему просто не нравится данное решение. Кажется ему некрасивым. Но это не так! Надо просто попробовать. Там всё Ok. И проблем не больше чем везде. Кстати всё прекрасно работает и из под Си. Это видно из моего примера.
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Dec 1 2006, 16:52
Сообщение #17


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(IgorKossak @ Dec 1 2006, 11:51) *
Если бы я все свои посты совал в одну тему, то кто захотел бы читать около сотни страниц?
Да и как назвать такую тему? "Проблемы от IgorKossak"? wink.gif

Вот это бы был бестселлер! smile.gif


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Dec 1 2006, 17:26
Сообщение #18


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(Screw @ Nov 30 2006, 17:34) *
Т.е. из обработчика прерывания вызвать подпрограмму обработки? А МК не будет думать, что этот код относится к обработчику (ну и загнул wink.gif ?

Можно, но увеличится время прерывания. Так делают пацаны smile.gif , когда в одном прерывании много обработчиков событий, а в проекте много файлов. Например, я вот так:
Код
#pragma vector=TIMERB0_VECTOR
__interrupt void TimerB_modul0()
{ KbdService();
  ValveService();
  BackgroundService();
  PumpsService();
  SendByteFromBuffer0();
  ChemCounterSimulation();
  SensorService();
}

(был реальный открытый проект, но на MSP, не обессудьте tongue.gif )
То есть Вам и обработку клавиш можно, как и я, включить в одно прерывание с чем-нибудь. После включения тиристоров до пятницы (следующего прерывания) контроллер абсолютно свободен.

2. По поводу лазанья глубоко и проектика.
Пока кажется, что наоборот, Вы плаваете по поверхности wink.gif
Успехов


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
bodja74
сообщение Dec 1 2006, 17:28
Сообщение #19


Знающий
****

Группа: Свой
Сообщений: 543
Регистрация: 22-10-05
Пользователь №: 9 984



Цитата(Screw @ Nov 30 2006, 17:49) *
Вообще что-то сильно я вглубь полез.... Есть у меня такое качество.
По сути проект будет делать следующее:
1) есть 2 равноприоритетных прерывания высшего уровня INT0 и INT1. Перехлест их невозможен, происходят они с частотой 50 Гц каждое (нули синусоиды ловлю).
Так же в этом прерывании происходит открытие тиристоров в зависимости от алгоритма и данных с клавиатуры.
2) Есть прерывание от таймера счетчика для опроса клавиатуры. (А надо ли прерывание.... Но как подругому сделать клавиатуру доступной все время - пока непонятно)
3) В основной программе обработка данных с клавиатуры, вывод на LCD.

Вот такой вот проектик. Если у кого есть какие мысли - поделитесь, буду благодарен.


Я так понял симисторами регулируете движок,делал я такое когда у меня контроллер в стиралке здох.

1 По прерываниям выставляете и запускаете таймер ,он и будет управлять симистором,и выходите.
2 С таким же успехом можно и в основной программе опрашивать клаву.

ЗЫ Зачем такие глобальные проблемы решать ,приоритетности,скоростя,синхронизации,для данной задачи у контроллера просто навалом времени.
Насчет стабилитрона на замер сетевой фазы,ставте 100кОм и стабилитрон 5.1в ,будет вам и 0 и 1.
Go to the top of the page
 
+Quote Post
Screw
сообщение Dec 1 2006, 19:52
Сообщение #20


Частый гость
**

Группа: Свой
Сообщений: 149
Регистрация: 29-11-06
Из: Барнаул
Пользователь №: 22 916



Спасибо всем за советы - как чего-нибудь надумаю - еще спрошу wink.gif
Go to the top of the page
 
+Quote Post
defunct
сообщение Dec 2 2006, 02:03
Сообщение #21


кекс
******

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



Цитата(SasaVitebsk @ Dec 1 2006, 12:37) *
1) Непереводимая игра слов я ответил потому, что она там была. Поясните мне что значит фраза "запутаться" или "нарушить баланс стэка" и какие у Вас проблемы "связанные с синхронизацией данных"?

как минимум две очевидных проблемы:
1. Чтение частично обновленных данных.
2. повторный вход в текущий обработчик прерывания, как следствие - переполнение стека.

Цитата
Ещё раз Вам повторяю. Я с этим работаю постоянно. Никаких проблем нет. По крайней мере у меня.
Спору нет, охотно Вам верю, но применять сложное решение там, где есть более простое - не рационально.

Цитата
2) На счёт "второго уровня", давайте банально обратимся к оборудованию. Если бы это было не нужно, то этого нигде или почти негде небылобы. Но это есть аппаратно в x51 (2 уровня) в ARM (8) в других просто не интересовался.

Аргумент не очень убедительный, т.к. в противовес этому примеру можно поставить AVR'ы, PIC'и где уровней всего один..

Цитата
Приведу простой и по моему доступный пример, - приведите своё решение. У меня идёт сигнал со станции 32 кГц(31.25мкс) (АТС С32) где "0" импульс длительностью 2мкс, "1" - длительностью 4мкс. Ч/з 2мкс от среза мне необходимо выдать ответный импульс длительностью 2мкс. Есть прерывание от таймера и USART. Частота 7.3728.

Через 2us от среза это не строго? Иначе ваша задача нерешаема и с двумя уровнями вложенности, так как просто переход на обработчик прерывания занимает около 11 тактов, что с приведенным кварцем займет примерно ~1.5 us. С учетом вложенности прерываний - "люфт" будет приблизительно равен ~3 us. Первым делом я бы поставил кварц на 14.7456, ну а дальше смотрел бы.. Возможно пришлось бы добавлять на формирование импульсов отдельный MK или внешнюю логику.

Цитата
Всё это на уровне ощущений, как и везде в программировании. Я лишнее никогда не добавляю. Я сразу чуствую что можно, а что лишнее. И если получается как-то не так, то чуствую какой-то дискомфорт.

Есть такое ;>

Цитата
Я понимаю что скорее всего уважаемый defunct чувствует что-то вроде этого. То есть ему просто не нравится данное решение. Кажется ему некрасивым. Но это не так! Надо просто попробовать. Там всё Ok.

Как по мне, то там где многоуровневость действительно нужна, лучше применить упомянутые Вами x51 или ARM в которых многоуровневость поддерживается аппаратно.
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Dec 2 2006, 23:58
Сообщение #22


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Цитата(defunct @ Dec 2 2006, 02:03) *
как минимум две очевидных проблемы:
1. Чтение частично обновленных данных.
2. повторный вход в текущий обработчик прерывания, как следствие - переполнение стека.


Это очевидные "не проблемы". Стек может переполнится и с одним уровнем прерываний и ошибка совместного использования данных - также. Простой пример - проверка свободного остатка кольцевого буфера - а между сравнениями младшего и старшего байта указателя вызов процедуры прерывания от UART с переходом по кольцу. (Я один раз получил - долго искал)
Это не проблемы выбранного метода, - это просто недостаток опыта или знаний у программиста.

Цитата
Аргумент не очень убедительный, т.к. в противовес этому примеру можно поставить AVR'ы, PIC'и где уровней всего один..

Для меня убедительный. Если для x51 я могу выполнить две команды
setb ex1
setb px1
и получу практически то же самое что я делаю здесь софтово, и там никому в голову не придёт меня "осудить" за "неправильное" использование оборудования, то непонимаю как это мне можно пришить здесь.

Цитата
Как по мне, то там где многоуровневость действительно нужна, лучше применить упомянутые Вами x51 или ARM в которых многоуровневость поддерживается аппаратно.

Аппаратно - это громко сказано. Чего Вы боитесь?
Это мне напоминает момент когда я написал свою первую прогу на x48. Вижу - ошибка, найти не могу. И тут ... о ужас ... этот процессор не делает автоматического сохранения PSW (читай SREG) процессора при входе/возврате в/из прерывания.... как дальше жить ... какой бред....
С тех пор прошло много лет. Оказывается земля не рухнула, и всё я это делаю руками. Как то привык и эмоций это у меня не вызывает.

И там тоже нет никаких проблем. Я не делаю ничего крамольного. Я не обращаюсь к стеку и не модифицирую его. В x51 можно переключить банки регистров - в avr можно использовать разные регистры (это при написании на asm). Для Си вообще ничего делать не надо. Компилятор обо всём сам позаботится. Да - нельзя использовать совместные ресурсы в прерывании. Так я этого и так стараюсь не делать во избежание. Я стараюсь чтобы каждый процесс был завершён. Выходные данные одного процесса - входные для другого. А перепинговывание - это просто доп сложности.

В завершение скажу, что допускаю возможность повторного входа в прерывание (если оно грамотно написано). Ну например ситуация: идут нерегулярные прерывания от Int0 со средним временем не более одного прерывания в 200мкс. Обработка его занимает 60мкс. При этом оно может придти в конце интервала или в начале, таким образом минимальный разрыв м/у ними может составлять 10мкс.
Ничего нет сложного в написании данного прерывания без применения дополнительных внешних аппаратных средств. И процедура будеть выглядеть обычно.

Кстати изделие с протоколом описанным в моём топике выше выпускалось серийно с момента появления 4414 (максимальная тактовая частота 8000 поэтому о 14745600 речи не шло). К слову скажу что аналогичное изделие выпускалось в Днепропетровске. И было оно основано на PIC и тоже частота кварца была невысока.


Дальнейший спор на эту тему считаю бессмысленным, так как он просто отражает "пристрастия" авторов. А свои пристрастия, по моему убеждению, каждый должен выбирать себе сам. Так что выбор за Вами.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 3 2006, 01:08
Сообщение #23


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Пожалуй я тоже вставлю слова, т.к. вложенные прерывания использовал, и как решить ту задачу без них не представляю (при помощи ШИМ генерится огибающая аналогового сигнала, при периоде ШИМ 128 тактов процессора его обработчик прерывания выполняется за 105...120 тактов, а в оставшиеся такты надо за 40 периодов ШИМ подготовить данные для следующих 40 периодов без участия основной программы, т.е. в обработчике другого прерывания).
Цитата(defunct @ Dec 2 2006, 01:03) *
2. повторный вход в текущий обработчик прерывания, как следствие - переполнение стека.
Решается довольно просто:
Код
void Timer1_compA_handler() {
    TIMSK &= ~(1<< OCIE1A);  //запрещаем это прерывание

    __enable_interrupts();        // разрешаем вложенные

    собственно обработчик, вложенные прерывания разрешены

    __disable_interrupts();      // запрещаем вложенные

    TIMSK |= (1<< OCIE1A);    разрешаем это прерывание
}
Резюме - панически бояться вложенных прерываний не нужно. Но тщательно обдумывать любое решение необходимо.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
defunct
сообщение Dec 3 2006, 02:09
Сообщение #24


кекс
******

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



Цитата(SasaVitebsk @ Dec 2 2006, 23:58) *
Аппаратно - это громко сказано. Чего Вы боитесь?

Гм.. Аппаратно - это не громко, а точно сказано, т.к. имеются средства аппаратуры, которые автоматически блокируют возможность вызова прерываний того же уровня. Чтобы повторить это на AVR, Вам потребуется на входе в прерывание вручную блокировать все прерывания того же уровня, и лишь после этого устанавливать флаг I. Т.о. накладные расходы получатся весьма значительными, а выигрышь от всего этого - практически никаким.

Цитата
Это мне напоминает момент когда я написал свою первую прогу на x48. Вижу - ошибка, найти не могу. И тут ... о ужас ... этот процессор не делает автоматического сохранения PSW (читай SREG) процессора при входе/возврате в/из прерывания.... как дальше жить ... какой бред....
С тех пор прошло много лет. Оказывается земля не рухнула, и всё я это делаю руками. Как то привык и эмоций это у меня не вызывает.

И не надо его сохранять т.к. в x48 одноуровневый КП. Вот интересно, что бы Вы сказали если бы у x51-го PSW не сохранялся.. такой проц можно было бы сразу "фтопку".

Цитата
И там тоже нет никаких проблем. Я не делаю ничего крамольного. Я не обращаюсь к стеку и не модифицирую его.

Разрешая прерывания глобально, вне зависимости от Вас, идет работа со стеком. (вызовы других обработчиков прерываний).

Цитата
Для Си вообще ничего делать не надо. Компилятор обо всём сам позаботится.

Ну-ну.. smile.gif
Компилятор ни о чем не позаботится, ему все равно какие строки переводить в код. Заботиться обо всем нужно разработчику.

Цитата
Да - нельзя использовать совместные ресурсы в прерывании. Так я этого и так стараюсь не делать во избежание. Я стараюсь чтобы каждый процесс был завершён. Выходные данные одного процесса - входные для другого. А перепинговывание - это просто доп сложности.

Вот это и есть та самая забота - по устранению проблем связанных с синхронизацией, которую компилятор за Вас не сделает.

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

Ключевое слово "если" wink.gif

Цитата
Ну например ситуация: идут нерегулярные прерывания от Int0 со средним временем не более одного прерывания в 200мкс. Обработка его занимает 60мкс. При этом оно может придти в конце интервала или в начале, таким образом минимальный разрыв м/у ними может составлять 10мкс.

Вопрос, зачем это надо? Ведь после завершения обработки первого прерывания можно спокойно обработать и второе.

Цитата
Кстати изделие с протоколом описанным в моём топике выше выпускалось серийно с момента появления 4414 (максимальная тактовая частота 8000 поэтому о 14745600 речи не шло). К слову скажу что аналогичное изделие выпускалось в Днепропетровске. И было оно основано на PIC и тоже частота кварца была невысока.

Видимо это изделие решает не такую задачу как Вы описали.
На PIC'е подозреваю ребятам тяжко пришлось поизвращаться на асме, причем без прерываний, т.к. ваша задача (в том виде в каком Вы ее поставили) на PIC с 200ns циклом @20Mhz с прерываниями нерешаема вообще.
Go to the top of the page
 
+Quote Post
archi2000
сообщение Dec 3 2006, 11:56
Сообщение #25


Участник
*

Группа: Новичок
Сообщений: 38
Регистрация: 30-09-05
Пользователь №: 9 098



Я думаю, что стабилитрон как ограничитель работать не будет.
Если в сети 220В и резистор 100к то ток будет 2 мА. Нужно смотреть характеристику стабилитрона.
Минимальный ток стабилизации около 20 мА. Он не выходит на обратную ветвь характеристики и получается вместо 5В примерно 2,5В.
Лучше поставить регулируемый стабилитрон TL431.
Go to the top of the page
 
+Quote Post
Alex_Pol
сообщение Dec 3 2006, 13:37
Сообщение #26


Частый гость
**

Группа: Свой
Сообщений: 192
Регистрация: 23-03-05
Из: Украина. Днепропетровск
Пользователь №: 3 626



В сети 310 вольт. Амплитудное значение.
Go to the top of the page
 
+Quote Post
xemul
сообщение Dec 3 2006, 14:05
Сообщение #27



*****

Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731



И стабилитроны бывают разные. Есть с нормированием напряжения стабилизации и от 1 мА .
Go to the top of the page
 
+Quote Post
bodja74
сообщение Dec 3 2006, 14:54
Сообщение #28


Знающий
****

Группа: Свой
Сообщений: 543
Регистрация: 22-10-05
Пользователь №: 9 984



Цитата(archi2000 @ Dec 3 2006, 11:56) *
Я думаю, что стабилитрон как ограничитель работать не будет.
Если в сети 220В и резистор 100к то ток будет 2 мА. Нужно смотреть характеристику стабилитрона.
Минимальный ток стабилизации около 20 мА. Он не выходит на обратную ветвь характеристики и получается вместо 5В примерно 2,5В.
Лучше поставить регулируемый стабилитрон TL431.


А вы попробуйте,я же не из пальца это высмоктал,если по вашему то нужно ставить 10кОм,а в ИПБ от 18 до 33КОм хватает не то что для замера ,а для стартовой запитки микросхемы.
Go to the top of the page
 
+Quote Post
Alex_Pol
сообщение Dec 3 2006, 14:55
Сообщение #29


Частый гость
**

Группа: Свой
Сообщений: 192
Регистрация: 23-03-05
Из: Украина. Днепропетровск
Пользователь №: 3 626



2 xemul Точно. Были такие 2С133В. Ток стабилизизации от 1 до 30 ма.

Сообщение отредактировал Alex_Pol - Dec 3 2006, 14:58
Go to the top of the page
 
+Quote Post
archi2000
сообщение Dec 3 2006, 15:05
Сообщение #30


Участник
*

Группа: Новичок
Сообщений: 38
Регистрация: 30-09-05
Пользователь №: 9 098



Автор топика не говорит какой у него стабилитрон.
У меня вот какие мысли по этому поводу.
Чтобы с точностью допустим микросекунды отловить нули сетевого напряжения в двух каналах Int0 и Int1 нужно две цепочки диод резистор стабилитрон. Диоды включить противофазно и выпрямить две разных полуволны. Стабилитрон с большим диапазоном тока стабилизации, например 1 мА - 100 мА.
Каждое прерывание настроить на задний фронт прямоугольного импульса. Прерывания будут срабатывать почти точно в нулях. Как рассчитать резистор? Допустим мах напряжение 310В+20%=370В Ток 100 мА - резистор 370В/0,1А=3,7кОм. Что-то мало для розетки? Не сгорит ли?
Допустим 10 кОм поставим.
Тогда мгновенное напряжение сетевой синусоиды, при котором еще лог.1 на входе Int будет
1 мА*10кОм=10В.
Дальше стабилитрон уже не держит 5В и наступает крутой задний фронт. Я тут никак не учитывал ток через PIN процессора. TL431 имеет ток катода от 1 до 100 мА и регулируемое напряжение стабилизации от 2,5 В до 36 В и с помощью еще двух резисторов по 10 кОм может быть настроен на 5 В. Получим хорошие прямоугольники с крутыми фронтами.
Какие у кого мысли по этому поводу?
Go to the top of the page
 
+Quote Post
demaven
сообщение Dec 3 2006, 15:24
Сообщение #31


Частый гость
**

Группа: Свой
Сообщений: 108
Регистрация: 10-05-05
Из: Киргизия Бишкек
Пользователь №: 4 886



и будем греть плату и все вокруг. Прикинтье кол-во тепла, которое будет выделяться на резисторах и что с этим теплом делать - яйца жарить?

"Допустим 10 кОм поставим."

а резистор на 10 ком поместиться? 220/10 =22ма множим на 220 имеем почти 5 ватт, в пору что-нибудь жарить
Go to the top of the page
 
+Quote Post
archi2000
сообщение Dec 3 2006, 15:38
Сообщение #32


Участник
*

Группа: Новичок
Сообщений: 38
Регистрация: 30-09-05
Пользователь №: 9 098



Поставим 100 кОм.
Но пока не сказано какая точность по времени в разных каналах Int0 и Int1 все равно хочется поставить две цепочки и настроить прерывания по заднему фронту.
Еще вопрос - какая тактовая частота процессора? сколько потребляет процессор, ЖКИ и клавиатура у автора? Как правильно запитать это все без трансформатора, если допустим ток потребления большой?
Допустим 10 мА?

Сообщение отредактировал archi2000 - Dec 3 2006, 15:58
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Dec 3 2006, 16:02
Сообщение #33


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Цитата(defunct @ Dec 3 2006, 02:09) *
Гм.. Аппаратно - это не громко, а точно сказано, т.к. имеются средства аппаратуры, которые автоматически блокируют возможность вызова прерываний того же уровня. Чтобы повторить это на AVR, Вам потребуется на входе в прерывание вручную блокировать все прерывания того же уровня, и лишь после этого устанавливать флаг I. Т.о. накладные расходы получатся весьма значительными, а выигрышь от всего этого - практически никаким.

Как правило, прерываний не десятки а 2-5 и, даже если есть необходимость запрещать прерывания равного уровня накладные расходы не так уж и велики, - 2 такта на каждый запрещённый вектор. Но этого, как правило при 2-ух уровневой системе не требуется. Потому что ничего, фактически не произойдёт, а просто может поменятся порядок обработки событий (см. мой топик выше). А Выигрыш легко виден на осциллограмме в моём примере.

Цитата
Разрешая прерывания глобально, вне зависимости от Вас, идет работа со стеком. (вызовы других обработчиков прерываний).

И что тут страшного? Ну идёт, и что???? На то он и стэк! Это даже замечательно! Проблема может возникнуть как раз если работа идёт не через стек, а обходным путём. Ну например, для экономии в двух равных прерываниях использованы вместо push SREG, mov save_sreg,sreg.

Цитата
Ну-ну.. smile.gif
Компилятор ни о чем не позаботится, ему все равно какие строки переводить в код. Заботиться обо всем нужно разработчику.
...
Вот это и есть та самая забота - по устранению проблем связанных с синхронизацией, которую компилятор за Вас не сделает.
...
Ключевое слово "если" wink.gif

Мы говорили уже на эту тему. В том плане, что "это не проблема реализации, а проблема опытности разработчика". И говоря что "компилятор" обо всём позаботится я имел ввиду начинающих программистов. Проблемы начнуться тогда когда они станут "профи" и начнут запрещать компилятору использовать регистры и использовать вручную, начнутся тогда, когда они начнут вставлять свои куски ассеблерного кода или начнут переписывать обработчики прерываний, начнутся тогда, когда попытаются в прерывание воткнуть пол-головы и начнут м/у прерываниями передавать сложные данные. Иначе ничего не будет. Обычно прерывания логически слабо связаны м/у собой, так как они обрабатывают РАЗНЫЕ события. И, как правило, ничего страшного не происходит если из прерывания, которое формирует временные метки будет вызвано прерывание от USART а из него прерывание от Int0.

На самом деле это что-то сродни обсуждаемому вопросу: "зачем нужна OS". Лучше возможно и не станет, но красивее - точно. Каждый процесс логически закончен! А здесь ещё и выигрыш для конкретного обработчика (проигрыш для остальных).

У меня сейчас - светодиодное панно. Прерывания от USART - 3 (rs485), от таймера (таймаут для rs485), от таймера - регенерация экрана, от таймера (софтовое - каждое девятое прерывание регенерации) - обработка команд и голова приём команд. Высокоуровневое - регенерация. Графика и анимированная графика, полутона и цвет. Никаких специальных приёмов - нет. С максимальной оптимизацией по времени. IAR C. Кстати малейшие девиации при отображении картинки - видны на глаз.

Можно ли написать без этого? Да безусловно! В этом особая прелесть программирования, - творчество и совершенная свобода выбора. Будет ли красивее? Вполне возможно, но уже не мной. К тому же красота - субъективное понятие.
Но главное - у меня всё работает тоже. И я оцениваю своё решение как красивое. Значит моё решение тоже имеет право на жизнь. И я думаю, многие програмисты используют мой подход, так как я ни в коей мере не считаю его "своим изобретением". Возможно он родился раньше меня.

PS: А.Г.Алексенко,А.А.Галицын,А.Д.Иванников "Проектирование радио-электронной аппаратуры на микро-процессорах", Москва "Радио и связь" 1984г. (Когда-то была бестселером по i8080) стр. 51 "Для задания простого приоритетного режима не требуется никаких дополнительных команд, кроме команд инициализации. ... Поэтому для организации многоуровневой системы прерываний необходимо выполнить програмную установку этого тригера командой EI (РАЗРЕШИТЬ ПРЕРЫВАНИЯ) МП. ... Для реализации многоуровневой системы прерываний каждая из п/программ обслуживания должна иметь определённую структуру (рис.1.26)"
(1.26) Начало -- сохр. в стеке исп. регистров -- EI -- тело -- DI -- Сброс разряда регистра прер. (для avr не надо) -- EI -- RET
Go to the top of the page
 
+Quote Post
xemul
сообщение Dec 3 2006, 16:14
Сообщение #34



*****

Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731



Цитата(archi2000 @ Dec 3 2006, 15:05) *
Автор топика не говорит какой у него стабилитрон.
У меня вот какие мысли по этому поводу.
Чтобы с точностью допустим микросекунды отловить нули сетевого напряжения

Прежде, чем допускать эту точность, очень желательно оценить шумы в электрической сети.
Цитата
в двух каналах Int0 и Int1 нужно две цепочки диод резистор стабилитрон. Диоды включить
...

А смысл всего этого мероприятия? Компаратор в AVR'ах удовлетворительно работает около земли. Не проще ли подать сигнал через резистор кил в 500-1000 на вход компаратора (естесно, нужна пара защитных диодов встречно-параллельно на землю; если предполагается использовать SMD-резисторы, то придется ставить последовательно не меньше двух типоразмера 1206), опору повесить на землю, и попытаться порадоваться жизни? Потом огорчиться, обнаружив шумы в сети, и задуматься над проблемой фильтрации этих самых шумов. А вот здесь уже можно будет подумать и про требуемую/желаемую точность определения 0 напряжения.
Go to the top of the page
 
+Quote Post
archi2000
сообщение Dec 3 2006, 16:38
Сообщение #35


Участник
*

Группа: Новичок
Сообщений: 38
Регистрация: 30-09-05
Пользователь №: 9 098



Итак есть ФАЗА и НОЛЬ. Ноль на вывод земли процессора подключим. Дальше пока на внешних прерываниях будем работать.
К ФАЗЕ диод, резистор 30 кОм и стабилитрон 5В. И это подключить к двум выводам МК?
Int0 настроить на передний фронт, а Int1 на задний?
Дальше к стабилитрону подключить развязывающий диод Шоттки и электролит для фильтрации пульсаций и запитать процессор?
Так надеюсь будет работать при токе процессора 10мА.
Go to the top of the page
 
+Quote Post
xemul
сообщение Dec 3 2006, 16:54
Сообщение #36



*****

Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731



Цитата(archi2000 @ Dec 3 2006, 16:38) *
Итак есть ФАЗА и НОЛЬ. Ноль на вывод земли процессора подключим. Дальше пока на внешних прерываниях будем работать.
К ФАЗЕ диод, резистор 30 кОм и стабилитрон 5В. И это подключить к двум выводам МК?
Int0 настроить на передний фронт, а Int1 на задний?
Дальше к стабилитрону подключить развязывающий диод Шоттки и электролит для фильтрации пульсаций и запитать процессор?
Так надеюсь будет работать при токе процессора 10мА.

Если предполагается управлять тиристором, включенным именно по фазе (т.е. нагрузка привязана к нулю), то удобнее Vcc контроллера привязать к фазе, а балласт по питанию включать со стороны Gnd контроллера.
Питание контроллера и цепь z-cross лучше не объединять.
Чем Вы собираетесь занять контроллер, чтобы он начал потреблять 10 мА? Для бестрансформаторного питания, имхо, это многовато.
И в чем цимес использования и INT0, и INT1 для определения 0? Кста, если соберетесь считать погрешности и точности, сравните токи входов контроллера в режимах цифры и аналога.
Go to the top of the page
 
+Quote Post
archi2000
сообщение Dec 3 2006, 16:59
Сообщение #37


Участник
*

Группа: Новичок
Сообщений: 38
Регистрация: 30-09-05
Пользователь №: 9 098



Да, спасибо за ответы.
Я вообще не знаю зачем автору два прерывания. Достаточно выпрямить это диодным мостом, будут полуволны 100 Гц, можно отлавливать один задний фронт одним внешним прерыванием и управлять симистором. Я никогда не делал безтрансформаторное включение - поэтому и спрашиваю.
Go to the top of the page
 
+Quote Post
xemul
сообщение Dec 3 2006, 17:24
Сообщение #38



*****

Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731



Цитата(archi2000 @ Dec 3 2006, 16:59) *
Да, спасибо за ответы.
Я вообще не знаю зачем автору два прерывания. Достаточно выпрямить это диодным мостом, будут полуволны 100 Гц, можно отлавливать один задний фронт одним внешним прерыванием и управлять симистором. Я никогда не делал безтрансформаторное включение - поэтому и спрашиваю.

Если выпрямлять, то симистор (aka симметричный тиристор) не нужен, достаточно обычного. Но при большой мощности нагрузки суммарные потери на тиристоре и выпрямителе будут больше, чем на одном симисторе.
Неудобство без выпрямителя - питание схемы только от одного полупериода, но это не самое большое зло при ее среднем потреблении до 2-3 мА. Чтобы уложиться в такое потребление (тиристорам средней мощности нужно дунуть в управляющий электрод 5-20 мА, чтобы они открылись), имеет смысл открывать тиристор не уровнем, а пачкой коротких импульсов.
Go to the top of the page
 
+Quote Post
archi2000
сообщение Dec 3 2006, 19:18
Сообщение #39


Участник
*

Группа: Новичок
Сообщений: 38
Регистрация: 30-09-05
Пользователь №: 9 098



Я бы такое устройство побоялся покупать без гальванической развязки. Нажимать на кнопки клавиатуры зная, что к контактам внутри кнопки фаза через резистор как-то страшно.
Трансформатор наверное желательно поставить.
Go to the top of the page
 
+Quote Post
xemul
сообщение Dec 3 2006, 19:36
Сообщение #40



*****

Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731



Цитата(archi2000 @ Dec 3 2006, 19:18) *
Я бы такое устройство побоялся покупать без гальванической развязки. Нажимать на кнопки клавиатуры зная, что к контактам внутри кнопки фаза через резистор как-то страшно.
Трансформатор наверное желательно поставить.

У автора треда вопросы про z-cross и про клавиатуру вроде бы разнесены по разным пунктам.
Вы в магазинах электротоваров видели регуляторы яркости лампочек? И наши, и вражеские. Все с сертификатами, но без трансформаторов. А во времена незапамятные "Светлана" (?) делала контроллеры для такого дела вообще с сенсорным управлением, и люди как-то выживали. А вот контроллеры дохлиwink.gif. Так что неизвестно, кому больнее - людям или микросхемам.
Go to the top of the page
 
+Quote Post
Screw
сообщение Dec 3 2006, 20:33
Сообщение #41


Частый гость
**

Группа: Свой
Сообщений: 149
Регистрация: 29-11-06
Из: Барнаул
Пользователь №: 22 916



А тема как оказалось очень живая wink.gif

Спасибо всем за обсуждение, пара вопросов отпала сама собой.

Транс стоит - через мост и 7805 запитан контроллер и лсд. Фаза и ноль - пока что подаются через мегаомники напрямую к int0 (было решено проверять PIND.2..... выводы нужны), в дальнейшем можно будет с транса попробовать.....
По поводу симисторов - не мой случай, алгоритм такой, что симисторы не подойдут.

Фактически, вся программа была сведена к одному прерыванию - датчику нуля. Так что весь тред по-поводу многоуровневом прерывании был затеян, как выяснилось, зря.

Интересен еще один момент - кто как делает развязку силовой части и контроллера? В моем случае надо управлять тиристорами. Хотел поставить высокочастотные трансформаторы - но дорого, объемно, да и нет у нас их в городе.

С оптопарами как-то не имел дело, может вы мне чем поможите...
Тиристоры предполагаются со следующими номиналами: Uобр 400-450 В, рабочий ток до 200мА.

Кстати, имеет ли смысл искать что-то быстродействующее(я про тиристоры)?

Цитата(archi2000 @ Dec 3 2006, 16:59) *
Да, спасибо за ответы.
Я вообще не знаю зачем автору два прерывания. Достаточно выпрямить это диодным мостом, будут полуволны 100 Гц, можно отлавливать один задний фронт одним внешним прерыванием и управлять симистором. Я никогда не делал безтрансформаторное включение - поэтому и спрашиваю.


Мне надо знать какая идет по счету полуволна + надо знать, положительная или отрицательная wink.gif
Не все так просто wink.gif

Сообщение отредактировал Screw - Dec 3 2006, 20:31
Go to the top of the page
 
+Quote Post
archi2000
сообщение Dec 3 2006, 20:52
Сообщение #42


Участник
*

Группа: Новичок
Сообщений: 38
Регистрация: 30-09-05
Пользователь №: 9 098



Про оптроны и тиристоры можно тут посмотреть.
http://www.qrx.narod.ru/bp/up.htm
Есть трехквадрантные симисторы, может подойдут
http://www.dectel.ru/dectel_el/publications/3q.shtml

Сообщение отредактировал archi2000 - Dec 3 2006, 21:06
Go to the top of the page
 
+Quote Post
Screw
сообщение Dec 3 2006, 22:24
Сообщение #43


Частый гость
**

Группа: Свой
Сообщений: 149
Регистрация: 29-11-06
Из: Барнаул
Пользователь №: 22 916



Да общий принцип-то понятен.... интересует вся обвязка от вывода контроллера до тиристора с номиналами...

Смотрю я в сторону оптотиристоров - но рука по 80 р. за каждый отдавать не поднимается.... а надо 12 штук...
Go to the top of the page
 
+Quote Post
xemul
сообщение Dec 3 2006, 22:41
Сообщение #44



*****

Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731



Цитата(Screw @ Dec 3 2006, 22:24) *
Да общий принцип-то понятен.... интересует вся обвязка от вывода контроллера до тиристора с номиналами...
Смотрю я в сторону оптотиристоров - но рука по 80 р. за каждый отдавать не поднимается.... а надо 12 штук...

MOC3021, MOC3023, MOC3041, MOC3042, MOC3061..3 - стоят 10-20 руб. До 200 мА можно прямо ими, больше - привесить к ним что-нибудь помощнее. Подробности в даташитах.
Go to the top of the page
 
+Quote Post
Screw
сообщение Dec 3 2006, 22:57
Сообщение #45


Частый гость
**

Группа: Свой
Сообщений: 149
Регистрация: 29-11-06
Из: Барнаул
Пользователь №: 22 916



Цитата(xemul @ Dec 3 2006, 22:41) *
Цитата(Screw @ Dec 3 2006, 22:24) *

Да общий принцип-то понятен.... интересует вся обвязка от вывода контроллера до тиристора с номиналами...
Смотрю я в сторону оптотиристоров - но рука по 80 р. за каждый отдавать не поднимается.... а надо 12 штук...

MOC3021, MOC3023, MOC3041, MOC3042, MOC3061..3 - стоят 10-20 руб. До 200 мА можно прямо ими, больше - привесить к ним что-нибудь помощнее. Подробности в даташитах.


Спасибо!!! a14.gif
То, что надо!!!

Поторопился с ответом - там симисторы.... Но всеравно спасибо, будем искать wink.gif
Go to the top of the page
 
+Quote Post
demaven
сообщение Dec 4 2006, 06:26
Сообщение #46


Частый гость
**

Группа: Свой
Сообщений: 108
Регистрация: 10-05-05
Из: Киргизия Бишкек
Пользователь №: 4 886



Последние в списке МОСов переключаются ТОЛЬКО при переходе через ноль, для фазного регулирования не подойдут
Go to the top of the page
 
+Quote Post
xemul
сообщение Dec 4 2006, 14:44
Сообщение #47



*****

Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731



Цитата(demaven @ Dec 4 2006, 06:26) *
Последние в списке МОСов переключаются ТОЛЬКО при переходе через ноль, для фазного регулирования не подойдут

Это понятно. Были помянуты для полноты картины. Разные же бывают задачиsmile.gif
Go to the top of the page
 
+Quote Post
defunct
сообщение Dec 4 2006, 17:49
Сообщение #48


кекс
******

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



bb-offtopic.gif
Цитата(SasaVitebsk @ Dec 3 2006, 16:02) *
Можно ли написать без этого? Да безусловно! В этом особая прелесть программирования, - творчество и совершенная свобода выбора. Будет ли красивее? Вполне возможно, но уже не мной. К тому же красота - субъективное понятие.

Спасибо за потраченное Вами время!
Было интересно читать Ваши ответы.
К сожалению или к счастью мне нечем возразить на Ваш последний пост.
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Dec 4 2006, 21:39
Сообщение #49


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Цитата(defunct @ Dec 4 2006, 17:49) *
bb-offtopic.gif
Цитата(SasaVitebsk @ Dec 3 2006, 16:02) *

Можно ли написать без этого? Да безусловно! В этом особая прелесть программирования, - творчество и совершенная свобода выбора. Будет ли красивее? Вполне возможно, но уже не мной. К тому же красота - субъективное понятие.

Спасибо за потраченное Вами время!
Было интересно читать Ваши ответы.
К сожалению или к счастью мне нечем возразить на Ваш последний пост.


cheers.gif Взаимно!
Go to the top of the page
 
+Quote Post
Screw
сообщение Dec 5 2006, 20:57
Сообщение #50


Частый гость
**

Группа: Свой
Сообщений: 149
Регистрация: 29-11-06
Из: Барнаул
Пользователь №: 22 916



Цитата(demaven @ Dec 4 2006, 06:26) *
Последние в списке МОСов переключаются ТОЛЬКО при переходе через ноль, для фазного регулирования не подойдут


Ошибся я маленько..... 600 милиампер там ток. И-то - не факт. Двигатель УАД-32Ф.... кажется 100 Вт. мощность. Сопротивление одной обмотки 365 Ом, соеденины в звезду.

Питание будет подаваться в разные полуволны на разные обмотки, т.о. хочу получить вращающееся поле и заставить асинхронник ехать wink.gif Как думаете, наивно?
Go to the top of the page
 
+Quote Post

4 страниц V   1 2 3 > » 
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 18:54
Рейтинг@Mail.ru


Страница сгенерированна за 0.01873 секунд с 7
ELECTRONIX ©2004-2016