Вам сказали - ищите в Даташите, всё там есть.dzrkot писал(а):я не могу найти толковый источник)))Gudd-Head писал(а):Почитайте про вектор прерываний и что происходит в МК когда происходит разрешённое прерывание.
Мелкие вопросы по МК и ПЛИС.
Читал.
- Реклама
Вектор прерываний — это адреса ячеек памяти программ, которые загружаются в счётчик команд при возникновении прерывания.dzrkot писал(а):Всётаки я очень надеялся что мне на простом примитивном языке это подскажут, и в голове вся картина соберётся воедио.
Другими словами, МК начинает выполнять команды, расположенные по соотв. адресу прерывания.
Т.е. если у вас будет прерывание DMA, то будет выполняться команда по адресу 0FFE4h.
Обычно вектор прерываний содержит команды безусловного перехода на области памяти, где непосредственно находятся процедуры обработки прерываний.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
- Сообщения: 75
- Зарегистрирован: Чт авг 29, 2013 08:02:24
Сейчас просто не надо меня критиковать, скажите правильно ли я переварил) для конкретного моего случая)
В таблице векторов прерываний я нашёл флаг TA0CCR0 CCIFG0, который отвечает за таймер ТА0, по его адресу 0FFECh в IAR в самом хедере этого контера я нашёл такую строку
т.е. TIMER0_A0_VECTOR - это и есть то, что должно быть в процедуре обработки этого вектора т.е. в Си это будет иметь вид:
т.е. для того же DMA я делаю примерно тоже самое, но у меня будет отдельная конструкция
В таблице векторов прерываний я нашёл флаг TA0CCR0 CCIFG0, который отвечает за таймер ТА0, по его адресу 0FFECh в IAR в самом хедере этого контера я нашёл такую строку
Код: Выделить всё
#define TIMER0_A0_VECTOR (54 * 2u) /* 0xFFEC Timer0_A5 CC0 */Код: Выделить всё
__interrupt void TIMER0_A0_VECTOR (void)
{
//операторы
}
Код: Выделить всё
__interrupt void DMA_VECTOR (void)
{
//операторы
}
что такое прерывание в общих чертах Вы, полагаю уже знаете.
Я могу чуть подробнее рассказать:
В контроллере есть таблица векторов, в которой находятся команды перехода на обработчики прерываний.
Обработчик прерывания - обычная функция, выполняемая в прерывании.
Контроллер в обычном режиме двигает указатель по программной памяти и последовательно считывает и выполняет команды, одна за другой. В момент возникновения какого-либо события (например переполнения счетчика таймера) устанавливается аппаратный флаг. В случае если разрешены глобальные прерывания и разрешено прерывание от возникшего события, указателю программной памяти аппаратно присваивается значение из области таблицы векторов прерываний. Какое именно значение зависит от возникшего события. По соответствующему адресу должен стоять вектор, который направляет указатель на обработчик прерывания.... надеюсь понятно))))
PS пока строчил, тут уже все объяснили)
Я могу чуть подробнее рассказать:
В контроллере есть таблица векторов, в которой находятся команды перехода на обработчики прерываний.
Обработчик прерывания - обычная функция, выполняемая в прерывании.
Контроллер в обычном режиме двигает указатель по программной памяти и последовательно считывает и выполняет команды, одна за другой. В момент возникновения какого-либо события (например переполнения счетчика таймера) устанавливается аппаратный флаг. В случае если разрешены глобальные прерывания и разрешено прерывание от возникшего события, указателю программной памяти аппаратно присваивается значение из области таблицы векторов прерываний. Какое именно значение зависит от возникшего события. По соответствующему адресу должен стоять вектор, который направляет указатель на обработчик прерывания.... надеюсь понятно))))
PS пока строчил, тут уже все объяснили)
Последний раз редактировалось ibiza11 Пт дек 06, 2013 14:47:26, всего редактировалось 1 раз.
Ставим плюсы: )
- Сообщения: 75
- Зарегистрирован: Чт авг 29, 2013 08:02:24
спасибо)Gudd-Head писал(а):Вектор прерываний — это адреса ячеек памяти программ, которые загружаются в счётчик команд при возникновении прерывания.dzrkot писал(а):Всётаки я очень надеялся что мне на простом примитивном языке это подскажут, и в голове вся картина соберётся воедио.
Другими словами, МК начинает выполнять команды, расположенные по соотв. адресу прерывания.
Т.е. если у вас будет прерывание DMA, то будет выполняться команда по адресу 0FFE4h.
Обычно вектор прерываний содержит команды безусловного перехода на области памяти, где непосредственно находятся процедуры обработки прерываний.
тогда дальше, вот по этому адресу 0FFE4h , у меня что находится, просто грубо говоря пустая ограниченная область памяти, в которую я уже пишу код, и грубо говоря оперирую именно ей. А если мне надо скажем по прерыванию что-то посчитать для main, то мне придётся обращаться к локальным переменным в main через указатели(или ссылки в С++), ну т.е. это по сути будет (с точки зрения написания кода) просто функция, которая ничего не возвращает и не имеет аргументов?
- Реклама
- Сообщения: 75
- Зарегистрирован: Чт авг 29, 2013 08:02:24
спасибо, не всё, вы как раз таки ответили на то, что я ещё спросил) хотя про указатели итп было бы интересно понять..)ibiza11 писал(а):что такое прерывание в общих чертах Вы, полагаю уже знаете.
Я могу чуть подробнее рассказать:
В контроллере есть таблица векторов, в которой находятся команды перехода на обработчики прерываний.
Обработчик прерывания - обычная функция, выполняемая в прерывании.
Контроллер в обычном режиме двигает указатель по программной памяти и последовательно считывает и выполняет команды, одна за другой. В момент возникновения какого-либо события (например переполнения счетчика таймера) устанавливается аппаратный флаг. В случае если разрешены глобальные прерывания и разрешено прерывание от возникшего события, указателю программной памяти аппаратно присваивается значение из области таблицы векторов прерываний. Какое именно значение зависит от возникшего события. По соответствующему адресу должен стоять вектор, который направляет указатель на обработчик прерывания.... надеюсь понятно))))
PS пока строчил, тут уже все объяснили)
В общем и целом правильно.В каждом компиляторе свой синтаксис ообработки прерываний.т.е. TIMER0_A0_VECTOR - это и есть то, что должно быть в процедуре обработки этого вектора т.е. в Си это будет иметь вид:
И самое важное, не разрешайте прерываний, которые не описаны соответствующей конструкцией. Иначе случится неописанная ситуация в виде регулярного ресета.
- Сообщения: 75
- Зарегистрирован: Чт авг 29, 2013 08:02:24
ну таки кстати у меня не компилируется этоvitalik_1984 писал(а):В общем и целом правильно.В каждом компиляторе свой синтаксис ообработки прерываний.т.е. TIMER0_A0_VECTOR - это и есть то, что должно быть в процедуре обработки этого вектора т.е. в Си это будет иметь вид:
И самое важное, не разрешайте прерываний, которые не описаны соответствующей конструкцией. Иначе случится неописанная ситуация в виде регулярного ресета.
Код: Выделить всё
__interrupt void TIMER1_A0_VECTOR(void)
{
}- Сообщения: 75
- Зарегистрирован: Чт авг 29, 2013 08:02:24
вообщем-то нашёл такой пример
непонятно как в данном случае работает #pragma vector= и почему имя PCINT0_routine взято произвольно...
Но по сути моя конструкция должна выглядеть примерно так:
Код: Выделить всё
//директиве #pragma vector= нужно указать номер вектора
// прерывания, список векторов задан в файле iotiny45.h
#pragma vector=PCINT0_vect
//имя PCINT0_routine взято произвольно
__interrupt void PCINT0_routine(void)
{
__no_operation();
}Но по сути моя конструкция должна выглядеть примерно так:
Код: Выделить всё
#pragma vector = TIMER1_A0_VECTOR
__interrupt void TIMER_A0(void) // прерывание по флагу TA0CCR0 CCIFG0
{
}Так смотрите внимательнее
Там же написано, что нужно делать #pragma vector=Вектор
Эта директива компилятора она указывает, что следующая процедура является обработкой прерывания по данному вектору.
Любое произвольное название и будет названием этой процедуры.
А если не писать #pragma vector= то нужно пользоваться стандартными функциями
Что это за вектор такой?
TIMER1_A0_VECTOR
В студии есть TIMER1_COMPA_vect может все таки пересмотрите еще раз что там описано в вашем заголовочнике?
И вообще си чувствительно к регистру.
Там же написано, что нужно делать #pragma vector=Вектор
Эта директива компилятора она указывает, что следующая процедура является обработкой прерывания по данному вектору.
Любое произвольное название и будет названием этой процедуры.
А если не писать #pragma vector= то нужно пользоваться стандартными функциями
Что это за вектор такой?
TIMER1_A0_VECTOR
В студии есть TIMER1_COMPA_vect может все таки пересмотрите еще раз что там описано в вашем заголовочнике?
И вообще си чувствительно к регистру.
- Сообщения: 75
- Зарегистрирован: Чт авг 29, 2013 08:02:24
В студии? Я использую IAR for MSP430vitalik_1984 писал(а):Так смотрите внимательнее
Там же написано, что нужно делать #pragma vector=Вектор
Эта директива компилятора она указывает, что следующая процедура является обработкой прерывания по данному вектору.
Любое произвольное название и будет названием этой процедуры.
А если не писать #pragma vector= то нужно пользоваться стандартными функциями
Что это за вектор такой?
TIMER1_A0_VECTOR
В студии есть TIMER1_COMPA_vect может все таки пересмотрите еще раз что там описано в вашем заголовочнике?
И вообще си чувствительно к регистру.
там в хедере...
#include "msp430f5435A"
Код: Выделить всё
#define TIMER0_A0_VECTOR (54 * 2u) /* 0xFFEC Timer0_A5 CC0 */Необходимо преобразование на verilog'е
Как я понимаю есть 2 пути - описание математикой и подключением примитива 74185?
Короче говоря - проект на CPLD. Есть поле из 8-ми двоично-десятичных счётчиков и 8-ми регистров с выводом на 7-сегментный дешифратор. Имеет ли смысл переводить систему на двоичные счётчики, или преобразование Bin2BCD сожрет больше памяти чем при использовании двоично-деесятичной системы?
Как я понимаю есть 2 пути - описание математикой и подключением примитива 74185?
Короче говоря - проект на CPLD. Есть поле из 8-ми двоично-десятичных счётчиков и 8-ми регистров с выводом на 7-сегментный дешифратор. Имеет ли смысл переводить систему на двоичные счётчики, или преобразование Bin2BCD сожрет больше памяти чем при использовании двоично-деесятичной системы?
Если я правильно уловил вашу мысль, то вам необходимо считать и выводить 8 десятичных цифр. Если да, то bin2bcd на 8 разрядов потребует существенно больший объём по ресурсам ПЛИС нежели 8 двоично-десятичных счётчиков - надо будет в цикле делить на 10 с вычитанием... Это IMHO.
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
- Сообщения: 75
- Зарегистрирован: Чт авг 29, 2013 08:02:24
в datasheet в таблице регистра отвечающего за состояние портов, настроенных на выход, не указано значение default т.е. после reseta и т.п. ...т.е. их надо все обязательно инициализировать ручками? А что будет если их не инициализировать, они будут в случайном состоянии?
И ещё вопрос, входы, которые висят в воздухе - написано, что лучше их инициализировть как выходы, и программно сажать на землю/питание через подтягивающий резистор, но не сказано что из этого лучше...вообще я подумал что мб есть какое-то правило хорошего тона там или как-то принято это...?Ну т.е. что-то конкретное считается лучшим или принято из этого.
И ещё вопрос, входы, которые висят в воздухе - написано, что лучше их инициализировть как выходы, и программно сажать на землю/питание через подтягивающий резистор, но не сказано что из этого лучше...вообще я подумал что мб есть какое-то правило хорошего тона там или как-то принято это...?Ну т.е. что-то конкретное считается лучшим или принято из этого.
Не вижу проблемы ) Если ножки не используются - можно с ними ничего не делать, ибо совершенно все равно что там будет, особенно если они настроены на выход. В случае если они используются, в любом случае их надо инициализировать.dzrkot писал(а):в datasheet в таблице регистра отвечающего за состояние портов, настроенных на выход, не указано значение default т.е. после reseta и т.п. ...
- Сообщения: 75
- Зарегистрирован: Чт авг 29, 2013 08:02:24
Ну первое - думал мало ли...правила хорошего тона там..))BCluster писал(а):Не вижу проблемы ) Если ножки не используются - можно с ними ничего не делать, ибо совершенно все равно что там будет, особенно если они настроены на выход. В случае если они используются, в любом случае их надо инициализировать.dzrkot писал(а):в datasheet в таблице регистра отвечающего за состояние портов, настроенных на выход, не указано значение default т.е. после reseta и т.п. ...
Со вторым то понятное дело))
При перемычке 1-2:oleg63m писал(а):Mem писал(а):Спасибо за информацию, проверю.
все верно, подключаемся к компьютеру, запускаем TCOM и активировав TXD измеряем цепи, с ним связанные (1, 2, 3 ХР3)
если все соответствует уровням...
1. 5В
2. 0В
3. 4.82В
При перемычке 2-3:
1. 0В
2. 0В
3. 4.82В
Транзистор цел
Главный инженер проекта - человек, который как никто другой знает, что приближаться к спроектированной им хрени близко не стоит.
Поставил BC556, теперь на 2 ноге 4.82В 

Главный инженер проекта - человек, который как никто другой знает, что приближаться к спроектированной им хрени близко не стоит.
- Сообщения: 20132
- Зарегистрирован: Чт сен 01, 2011 12:53:27
- Откуда: ТьмуТаракания. Почетный житель подмостовья
я уже и забыл, когда это говорил.
ну всеравно, если получилось-поздравляю

ну всеравно, если получилось-поздравляю
Шекспир сказал: Судить меня -дано лишь Богу, другим я укажу дорогу... https://natribu.org/
Я его полностью поддерживаю.
Программирую на Fuse AtmelAVR.
Я его полностью поддерживаю.
Программирую на Fuse AtmelAVR.


