Мелкие вопросы по МК и ПЛИС.

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Alexeyslav
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич
Контактная информация:

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение Alexeyslav »

Эти инклудники - ни больше ни меньше как простые объявления констант, смотри значения констант в даташите и занеси их в свой инклудник. По всей видимости, константы эти объединяются лог.функцией И в одну константу, таким образом константа с "0" битом включит соответствующий Fuse-bit в конфигурации.
Serj324
Встал на лапы
Сообщения: 129
Зарегистрирован: Вт мар 22, 2011 18:41:48

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение Serj324 »

Подскажите.
Нечаянно выставил опасный фьюз SPIEN и теперь не могу запрограммировать Atmega 8.
Подскажите как можно реанимировать ?
Есть два программатора
1-й Программатор Громова на Com порт (простая схема 5-ть деталей).
2-й USBasp программатор
Можно ли с помощью них как-то востановить МК ?
Подскажите простую схему.
Аватара пользователя
aam
Собутыльник Кота
Сообщения: 2994
Зарегистрирован: Сб фев 20, 2010 14:00:12
Откуда: Москва

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение aam »

Здравствуйте!
Допустим у меня проц Тини13 принимает на ногу сигнал по прерыванию PCINT (асинхронно).
И допустим во время выполнения подпрограммы прерывания проскочила короткая помеха какраз в тот момент, когда я читаю состояние вывода.
Поскольку прерывания генерируются по ИЗМЕНЕНИЮ сигнала, эта помеха должна вызвать 2 прерывания. Выполнятся ли они сразу после завершения обработки первоначального "правльного" прерывания или будут "проглочены"?
Иначе говоря, надо ли мне каждый раз проверять, какой сигнал был принят предыдущий раз или я могу быть уверен в том, что если в процедуре прерывания в данный момент читаю, скажем, лог. 1, то при предыдущем прерывании был лог. 0 ?

Источник импульсов - ИК-приемник ПДУ.
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение vitalik_1984 »

Serj324 писал(а):Подскажите.
Нечаянно выставил опасный фьюз SPIEN и теперь не могу запрограммировать Atmega 8.
Подскажите как можно реанимировать ?
Есть два программатора
1-й Программатор Громова на Com порт (простая схема 5-ть деталей).
2-й USBasp программатор

Ни тот ни другой вам не поможет. Вот тут про это же говорилось.
Alexeyslav
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич
Контактная информация:

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение Alexeyslav »

Выполнятся ли они сразу после завершения обработки первоначального "правльного" прерывания или будут "проглочены"?

Контроллер прост как валенок. Пока прерывание не обработано - реакции на последующие прерывания не будет, они будут проглочены. Согласно даташиту у контроллера есть два вида прерываний - которые автоматически сбрасывают признак прерывания, и такие признак которых надо сбрасывать вручную.
Надо только уточнить в даташите к какому типу прерываний относится прерывание по изменению уровня. Судя по тому что для прерывания есть только маска, оно относится к первому типу. И тогда проблема может возникнуть в случае когда возникает два прерывания по изменению уровня в момент обработки любого прерывания.
И потом, в таком случае когда ты в обработчике прерывания считываешь значение порта - спектр возможных проблем увеличивается. Ведь за время начиная от возникновения условия прерывания и до момента считывания значение на порту вполне может изменится и даже не один раз. А это минимум 4 такта, +4 такта на сохранение регистра статуса и несколько тактов на считывание значения с порта. Считай сам... какое это время, вероятность возникновения "проблемы" и т.д.

Например произошло прерывание по условию перехода 1->0 ожидаешь что на порту будет 0, а оно взяло и изменилось так что считывается "1". В первом случае установится признак прерывания, и после обработки будет выполнена та же самая процедура, и считает так же "1" если считать что переход был из-за помехи. Если будешь считать прерывания - помеху увидишь и обработаешь правильно(если задействовано только одно прерывание во всей прошивке иначе возможен пропуск и помеха сгенерирует только одно прерывание), а если хранить предыдущее значение и сравнивать - возможно очень много вариантов.
Аватара пользователя
Димаn
Открыл глаза
Сообщения: 65
Зарегистрирован: Пн авг 18, 2008 22:29:59
Откуда: Архангельск

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение Димаn »

Добрый вечер! Подскажите, плиз по старой доброй Меге8. Если порт D задействовал как USART, остальные ноги не работают? Во всяком случае пытаюсь счас "поморгать" светодиодом на ноге PD2 - при включенном USART'е не получается.... :?
Alexeyslav
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич
Контактная информация:

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение Alexeyslav »

Не работают только ноги RX и TX когда приемник и/или передатчик USART соответственно включен. Если включен только приемник - соответственно лапкой TX можно дергать как обычным портом.
Аватара пользователя
Димаn
Открыл глаза
Сообщения: 65
Зарегистрирован: Пн авг 18, 2008 22:29:59
Откуда: Архангельск

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение Димаn »

Тогда кусочек кода. В Меге8 выходы: RXD- это D0; TXD - это D1. Пытаюсь поморгать D2
#include <avr/io.h>
#include <avr/interrupt.h>
#include "usart.h"
#include <util/delay.h>


int main( void )
{
DDRD|=(1<<PD2);
USART_Init();

while(1){
PORTD^=(1<<PD2);
_delay_ms(1000);
}
}


void USART_Init(void)
{
UBRRH=0;
UBRRL=51; //ñêîðîñòü îáìåíà 9600 áîä
UCSRB=(1<<RXCIE)|(1<<RXEN)|(1<<TXEN); //ðàçð. ïðåðûâ ïðè ïðèåìå, ðàçð ïðèåìà, ðàçð ïåðåäà÷è.
UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0); //ðàçìåð ñëîâà 8 ðàçðÿäîâ
}
Аватара пользователя
aam
Собутыльник Кота
Сообщения: 2994
Зарегистрирован: Сб фев 20, 2010 14:00:12
Откуда: Москва

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение aam »

Alexeyslav писал(а):Пока прерывание не обработано - реакции на последующие прерывания не будет, они будут проглочены.

Я читал, что там очередь вроде есть. Надо будет еще почитать...

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

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

Прерывание в проге не одно. Есть еще прерывание по переполнению таймера, который одновременно работает ШИМ-генератором Fast PWM. Этим таймером я считаю дительность импульсов от ПДУ протокола RC-5 (т. е. там в прерывании тупо счетчик). Прерывание по уровню на ноге - только одно.
Alexeyslav
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич
Контактная информация:

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение Alexeyslav »

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

Для пульта ДУ это не страшно, вероятность возникновения довольно мала а прерывание от таймера зависимо от прерывания по уровню. Я так понял в прерывании по уровню сбрасываешь таймер и он начинает считать с нуля, по следующему прерыванию считываешь и обнуляешь... а срабатывание прерывания от таймера будет означать таймаут и окончание команды. т.е. оно технически во время нормальной посылки срабатывать не должно и мешать не будет.
Аватара пользователя
Димаn
Открыл глаза
Сообщения: 65
Зарегистрирован: Пн авг 18, 2008 22:29:59
Откуда: Архангельск

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение Димаn »

возможно в моей ситуации нельзя использовать конструкцию вида (1 <<PD2) ? Нету сейчас возиожности проверить...
Аватара пользователя
aam
Собутыльник Кота
Сообщения: 2994
Зарегистрирован: Сб фев 20, 2010 14:00:12
Откуда: Москва

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение aam »

Не совсем так. Таймер у меня генерирует ШИМ с частотой 37,5 кГц (внутренний RC Тини13 9,6 МГц) и сбрасывать его нельзя. Одновременно таймер генерирует прерывания по ПЕРЕПОЛНЕНИЮ, т. е. каждые 26,67 мкс. Эти прерывания успользуются у меня как-то вроде клока - в процедуре обработки просто инкрементируется регистр-счетчик и если доходит до FF, то перестает инкрементироваться.
Сигнал от фотоприемника заведен на ногу PCINT3 и включены асинхронные прерывания PCINT и по маске выбрана эта нога, чтоб только с нее происходило прерывание. В этом прерывании регистр-счетчик проверяется и обнуляется - таким образом я измеряю длительность импульса от фотоприемника.

Поэтому прерывания от ноги и от таймера никак не связаны и запросто могут инициироваться одновременно. Другой вопрос, что значение регистра-счетчика +/- 1 не существенно - я проверяю отклонение импульса +/- 25% от номинальной длительности протокола RC5.

Alexeyslav писал(а):Но если два раза или более одно и то же прерывание возникнет во время обработки прерывания - оно будет обработано по окончанию только один раз

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

ЗЫ: по идее, надо делать как вы описали, т. е. использовать захват, но таймер 1, а мне нужен ШИМ для ЦАПа. И к тому же, если не ошибаюсь, у Тини 13 нет захвата таймера. Можно взять Тини25, но я люблю максимальную простоту и дешевизну при максимальной функциональности. Не хватит памяти Тини13 - придется брать 25.


Димаn, конструкция вида "1 <<PD2" - тупо для препроцессора. Я обычно пишу что-то типа: 0b00000010 - нагляднее как-то. В вашем случае это единица, сдвинутая на константу PD2 (забыл, какое значение несет эта аббревиатура...). Причем это выражение вычисляется препроцессором при компиляции и в конечной проге бедет стоять как я написал двоичное число, а не набор команд.


***

Вот что вычитал в ДШ:
1) При возникновении прерываний флаг I регистра SREG аппаратно сбрасывается, запрещая тем самым обработку следующих прерываний. При возврате из подпрограммы обработки прерываний (команда RETI) флаг I устанавливается аппаратно.
2) Все имеющиеся прерывания можно разделить на два типа. Прерывания первого типа генерируются при наступлении некоторого события, в результате которого устанавливается флаг прерывания. При этом флаг прерывания аппаратно (или программно) сбрасывается.
Прерывания второго типа не имеют флагов прерываний и генерируются в течение всего времени, пока присутствуют условия, необходимые для этого. Соответственно, если условия, вызывающие прерывание, исчезнут до разрешения прерывания, генерации прерывания не произойдет.
3) Микроконтроллеры семейства Mega поддерживают очередь прерываний, которая работает следующим образом: если условия генерации одного или более прерываний возникают в то время, когда флаг общего разрешения прерываний сброшен, соответствующие флаги устанавливаются в «1» и остаются в этом состоянии до установки флага общего разрешения прерываний. После разрешения прерываний, выполняется их обработка в порядке приоритета.
4) После выхода из прерывания процессор всегда выполняет одну команду основной программы, прежде чем обслужить любое отложенное прерывание.
5) для индикации внешних прерываний используется регистр флагов прерываний GIFR (тини13/25).
Если в результате события на любом из выводов PCINT... формируется запрос на прерывание, этот бит устанавливается в 1. Флаг сбрасывается аппаратно при запуске подпрограммы обработки прерывания или программно, записью в него 1.

Получается, если у меня произошло прерывание PCINT по изменению на ноге, то у меня запускается процедура его обработки, сбрасывается флаг PCINT в GIFR и I в SREG. Если в процессе выполнения этой процедуры уровень на ноге опять меняется, то у меня устанавливается флаг PCINT, но поскольку флаг I сброшен, повторно обработчик не может быть вызван (п. 3). Когда процедура завершается, команда reti устанавливает флаг I. Проц выполняет одну команду из кода (п. 4) и повторно вызывает этот мой обработчик, т. к. флаг PCINT установлен и прерывание в очереди. Запустившись повторно, обработчик "думает", что это следующий фронт импульса, но проанализировав значение регистра-счетчика, которое к этому моменту будет равно 0, максимум 1, "понимает", что "импульс" слишком короткий и по этому условию вылетает на обработку ошибки (что мне и нужно).

Вроде ничего не напутал?

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

Если рассмотреть взаимодействие внешнего прерывания и прерывания от таймера, то одно из них попадет в очередь и выполнится после завершения 1-го. Если во время обработки внешнего прерывания в очередной раз переполнится таймер, его прерывание произойдет только после завершения подпрограммы обработки внешнего прерывания и на ее работу не повлияет.
Если фотоприемник "дернет" ногу во время прерывания от таймера, то обработка этого события начнется после выхода из обработчика таймера, который всего-навсего получит значение регистра-счетчика на 1 больше, что не смертельно в данном случае (разброс на длительность импульса +/-25%, типовая ожидаемая ширина импульса - 33 единицы регистра-счетчика - 880 мкс) .

А вот что я не учитывал до настоящего времени - это то, что в прерывании надо сохранять в стек SREG :) Возможно, в этом причина некоторых "странных и непонятных" глюков предыдущих моих устройств. Например, прерывание возникает в момент выполнения операции сравнения и не запомнив SREG, после выхода из прерывания я прос*у результат сравнения и уйду не на ту метку не по тому условию.
Serj324
Встал на лапы
Сообщения: 129
Зарегистрирован: Вт мар 22, 2011 18:41:48

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение Serj324 »

Подскажите имеется выпаянная но рабочая я проверял Atmega 8535-16pi
Какие существуют интересные схемы для сборки на данном МК. Подскажите.
Второй день ищу и нечго не могу найти.
Аватара пользователя
oleg63m
Друг Кота
Сообщения: 20132
Зарегистрирован: Чт сен 01, 2011 12:53:27
Откуда: ТьмуТаракания. Почетный житель подмостовья
Контактная информация:

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение oleg63m »

параллельный программатор http://radiokot.ru/forum/viewtopic.php?f=20&t=864
Шекспир сказал: Судить меня -дано лишь Богу, другим я укажу дорогу... https://natribu.org/
Я его полностью поддерживаю.
Программирую на Fuse AtmelAVR.
Аватара пользователя
slavokhire5
Прорезались зубы
Сообщения: 202
Зарегистрирован: Пн сен 26, 2011 13:48:25
Откуда: Харьков

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение slavokhire5 »

привет всем котам. возник вопрос по спящим режимам Tiny13a. в каких из них возможно удерживать выходы? (0 и/или 1, в зависимости от хода выполнения программы)
Осилит дорогу идущий
--------------------------
Пишу на Си за еду
Chettuser

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение Chettuser »

Может быть вопрос покажется глупым, но...
Реализация какиз из функций, преобразующих int в string, а именно itoa или sprintf меньше занимает места в памяти?
Спасибо.
_Vasilij_
Встал на лапы
Сообщения: 124
Зарегистрирован: Пт янв 25, 2013 02:48:32

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение _Vasilij_ »

Здравствуйте, вопрос мелкий, но для меня пока неясный.
Задача измерение "мокрости" земли в таймере полива на МК. Датчик простейший из из двух разделенных дорожек текстолита или штыри может потом сделаю.
Проблема в том, что как сказали если на датчике будет постоянное напряжение, то соли отложатся и врать начнет, поэтому мерять нужно переменным током.
Я подумал, что буду так делать - сначала на одну ногу выдаю еденицу, а на другой жду её появления, а в следующем замере наоборот - на вторую выдаю 1, а на первой жду отклика...ну и так каждый час, меняя при замере.
Только вот как тут быть с подтяжками портов, чтоб без ложных срабатываний...и в каком состоянии держать порты между измерениями, чтоб на датчике не было химических реакций ?
Alexeyslav
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич
Контактная информация:

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение Alexeyslav »

Попробуй сделать емкостной датчик. Принцип тот же, только плата покрыта лаком. Идея в том что наличие токопроводящей жидкости возле электродов изменяет их емкость. Емкость получится в пикофарадах конечно, но её без проблем измерить контролером с применением таймера в режиме захвата, или просто по прерыванию считывать сколько таймер тактов насчитал. с усреднением 16 замеров или даже сотни(чего мелочится, это ж дело такое - торопится некуда). Либо просто подать частоту на один электрод и измерять реактивное сопротивление емкости на фиксированной частоте - потом выпрямление, АЦП и т.д. после калибровки можно мерять степень увлажнения почвы. И главное - никакого непосредственного контакта электродов, а следовательно никакой химии.
_Vasilij_
Встал на лапы
Сообщения: 124
Зарегистрирован: Пт янв 25, 2013 02:48:32

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение _Vasilij_ »

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

Вернуться в «Разные вопросы по МК»