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

 
 
4 страниц V   1 2 3 > »   
Reply to this topicStart new topic
> Много вопросов накопилось... Сильно не глумитесь, 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
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

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

 


RSS Текстовая версия Сейчас: 13th July 2025 - 05:56
Рейтинг@Mail.ru


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