Мелкие вопросы по МК и ПЛИС.
Нет, для этого нужен целый микровзрыв. токи все же недостаточные чтобы расплавить шины - страдает только изоляция ячейки.
- Реклама
Проц - Тини2313. Написал в IAR AVR:
Протеус пишет, что "Interrupt generated and processor will reset after handling", в регистре WDTCR читается значение С8 - установлен флаг прерывания, но проц, хоть уср*сь, но не выходит на обработчик прерывания (в нем стоит точка останова).
В листинге проверил, команды присутствуют.
В чем дело?
Код: Выделить всё
WDTCR=0x18;
WDTCR=0x48;
//Разрешение прерываний
__enable_interrupt();
while (WDTCR & BIT(WDIE)); //ожидание прерывания от сторожевого таймера
//Обработчик
#pragma vector=WDT_vect
__interrupt void WDT_ISR()
{
rnd=TCNT0;
}В листинге проверил, команды присутствуют.
В чем дело?
А чего это он должен выходить на прерывания, если ты не установил режим работы вач-дога в режим генерации прерываний? По-дефолту, вачдог не при делах вообще либо просто вызывает аппаратный сброс(если биты конфигурации контроллера разрешают работу вач-дога) по тайм-ауту. конфигурировать его надо-с и разрешить прерывание от вач-дога. Толку-то, что ты общие прерывания разрешил...
Последний раз редактировалось Alexeyslav Вс авг 25, 2013 10:57:35, всего редактировалось 1 раз.
А я что сделал?
2) одновременно установил WDE и WDIE
Но прога не пашет(
1) Разрешил изменение конфигурацииaam писал(а):WDTCR=0x18;
WDTCR=0x48;
2) одновременно установил WDE и WDIE
Но прога не пашет(
В железе(вкладка периферии), после конфигурации биты устанавливаются? Там какая-то особая процедура работы с вач-догом, нельзя его просто так биты установить - делать это надо в несколько этапов, защита от случайного изменения.
Попробуй, когда отладку запутишь сразу после конфигурации остановить и посмотреть состояние "железа" если не установились биты, установи вручную и убедись в пошаговой отладке что прерывание сработало.
у мена такая последоватльность срабатывает:
WDR
set_io WDTCSR, 0b00011000
set_io WDTCSR, 0b00001111
но только у меня конфигурация рассчитана на аппаратный сброс.
Заметь, что сброс вач-дога перед операцией тоже обязателен.
Попробуй, когда отладку запутишь сразу после конфигурации остановить и посмотреть состояние "железа" если не установились биты, установи вручную и убедись в пошаговой отладке что прерывание сработало.
у мена такая последоватльность срабатывает:
WDR
set_io WDTCSR, 0b00011000
set_io WDTCSR, 0b00001111
но только у меня конфигурация рассчитана на аппаратный сброс.
Заметь, что сброс вач-дога перед операцией тоже обязателен.
- Реклама
Прогнал еще раз, вот что у меня:

В регистр числа 0x18 и 0x48 записываются. Протеус выдает сообщение о срабатывании ватчдога, значение в его регистре WDTCR изменяется на C8, т. е. торчит флаг прерывания, а бит WDIE не сброшен. Прога так и крутится на вайле. Т. е. видно, что прерывание есть, но обработчик не вызван (флаг WDIE и WDIF не сброшены).
Еще крайне странно, что проц бесконечно НЕ уходит в ресет, т. к. именно это и должно было произойти (команды пока WDR не написаны).
Фьюз WDTON=1 (не запрограммирован), но я так понял, он на это не влияет, т. к. ватчдог я включаю программно.
Может надо где-то глобально разрешить прерывания от ватчдога типа МЦУЦР ТИМСК и т п?
Что я хочу: 1 раз при включении питания выполнить обработчик прерывания ватчдога, в нем проинициализировать генератор случайных чисел (биения между таймером 0 и ватчдогом) и дальше ватчдог работает только как ватчдог, т. е. защищает от зависания и не генерит преревания.
В регистр числа 0x18 и 0x48 записываются. Протеус выдает сообщение о срабатывании ватчдога, значение в его регистре WDTCR изменяется на C8, т. е. торчит флаг прерывания, а бит WDIE не сброшен. Прога так и крутится на вайле. Т. е. видно, что прерывание есть, но обработчик не вызван (флаг WDIE и WDIF не сброшены).
Еще крайне странно, что проц бесконечно НЕ уходит в ресет, т. к. именно это и должно было произойти (команды пока WDR не написаны).
Фьюз WDTON=1 (не запрограммирован), но я так понял, он на это не влияет, т. к. ватчдог я включаю программно.
Может надо где-то глобально разрешить прерывания от ватчдога типа МЦУЦР ТИМСК и т п?
Что я хочу: 1 раз при включении питания выполнить обработчик прерывания ватчдога, в нем проинициализировать генератор случайных чисел (биения между таймером 0 и ватчдогом) и дальше ватчдог работает только как ватчдог, т. е. защищает от зависания и не генерит преревания.
эээ... прогони этот код для начала в студии, кстати в студии есть плагин позволяющий использовать в качестве отладчика протеус. Вот только щас не скажу точно как называется, кажется "Proteus VSM".
В студии что удобно - периферия вся отображена в удобном для восприятии виде.
Фьюз WDTON отвечает только за начальное состояние вачдога, программно с ним можно делать все что угодно.
Обрати внимание еще на флаг I в регистре статуса, может у тебя глобальные прерывания запрещены?
Когда вач-дог запрещен фьюзами, режим его работы - только прерывание, и если запретить глобально - работать не будет. Кстати, а почему ты уверен что он бесконечно крутится внутри цикла? может и сбрасывается - ведь он тут же входит в тот же самый цикл. У него есть еще один режим работы - если не обработать прерывание от него, и второй раз выйдет таймаут - происходит аппаратный сброс.
В студии что удобно - периферия вся отображена в удобном для восприятии виде.
Фьюз WDTON отвечает только за начальное состояние вачдога, программно с ним можно делать все что угодно.
Обрати внимание еще на флаг I в регистре статуса, может у тебя глобальные прерывания запрещены?
Когда вач-дог запрещен фьюзами, режим его работы - только прерывание, и если запретить глобально - работать не будет. Кстати, а почему ты уверен что он бесконечно крутится внутри цикла? может и сбрасывается - ведь он тут же входит в тот же самый цикл. У него есть еще один режим работы - если не обработать прерывание от него, и второй раз выйдет таймаут - происходит аппаратный сброс.
Нет. Помимо этого прерывания в проге есть прерывание по переполнению таймера, которое генерится с частотой 31,25 кГц и тактирует прогу. Я пробовал ставить точку останова в этом прерывании - на нее прога вылетает. А вот на точку останова в прерывании ватчдога - нет. На скриншоте видно, что прога работала значительное время - 0,6 "микроконтроллерных" секунды (симуляция не совсем в реал-тайме идет). В реале я и больше держал.Alexeyslav писал(а):Обрати внимание еще на флаг I в регистре статуса, может у тебя глобальные прерывания запрещены?
Еще что странно - что все время ватчдог не срабатывает не ресет. Обычно, когда пишешь прогу и забываешь поставить команду wdr, в этом окне сообщений начинает бежать куча фраз по каждому ресету от ватчдога.
Студией я пользуюсь редко, там вроде даже Си не по умолчанию ставится. Эта прога написана в IAR AVR. Листинг с ассемблером просмотрел - вктор прерывания правильный, команды на месте. Может глюк Протеуса?
***
Что-то вообще ерунда какая-то... В протеусе даже простой резет не наблюдается - ни при программной установке WDE, ни при установке фьюза WDTON.
Пипец кароче...
Взял написал тупо на асме в АВР студио:
Код: Выделить всё
ldi temp1, 0x18
out WDTCR, temp1
ldi temp1, (1<<WDE)|(1<<WDIE)
out WDTCR, temp1
cbi PORTB,0
sei ;разрешение прерываний
main:
inc R16
rjmp main
watch:
ldi R18,7
reti
Когда пишу инициализацию вида:
Код: Выделить всё
ldi temp1, 0x18
out WDTCR, temp1
ldi temp1, (1<<WDE)
out WDTCR, temp1И главное, статья есть по теме: http://gendocs.ru/v256/?cc=13
Написано, что для включения вроде вообще не обязательно 2 2 приема записывать в WDTCR.
Попробовал - Протеус пишет, что таймаут настройки ватчдога истек. Конфигурация не изменениа - вообще ватчдог не пашет(((
Пробовал по разному. Висит флаг прерывания от ватчдога (последний бит (WDIF) в регистре WDTCR), но на обработчик проц не выходит! То же самое творится если прогнать прогу в АВР Студио
Это может глюк в модели контроллера, попробуй другую модель. Да и на реальном, говоришь не срабатывает?
А ты перед инициализацией вачдога сбрасываешь его? В документации говорится что вачдог можно установить не позже 4-х тактов после его сброса, или как-то так. Даташит-то читал? Там есть пример инициализации его, и переключения режимов. Отклонение от прописанной процедуры чревато...
А ты перед инициализацией вачдога сбрасываешь его? В документации говорится что вачдог можно установить не позже 4-х тактов после его сброса, или как-то так. Даташит-то читал? Там есть пример инициализации его, и переключения режимов. Отклонение от прописанной процедуры чревато...
Реальный пока не спаян)
Я пробовал только в Протеусе и в АВР Студио. Проц у меня ТИНИ2313.
Я по-разному пробовал - нифига.
Ватчдог то у меня настроен. Я же говорю - у меня в проге после его срабатывания начинает висеть флаг прерывания в WDTCR. Бит WDIE тоже стоит. Т. е. это признак того, что прерывание-то прошло, но почему-то не обработано, т. к. именно обработчик должен аппаратно сбрасывать оба эти бита в ноль, после чего ватчдог переходит в режим сброса и по следующему прерыванию должен произойти ребут:
If WDE is set, WDIE is automatically cleared by hardware when a time-out occurs. After the WDIE bit is cleared, the next time-out will generate a reset.
У меня же этого не происходит.
Устанавливается же бит WDIE у меня однократно в начале проги ДО цикла, т. е. если бы он был сброшен аппаратно, то снова восстановиться не может.
Я пробовал только в Протеусе и в АВР Студио. Проц у меня ТИНИ2313.
Там про сброс нет, а про бит WDCE и выключение есть. И в ДШ про выключение тоже. Сбрасывать надо "на всякий случай" чтобы при переконфигурировании ватчдог случайно не резетнул проц.Alexeyslav писал(а):В документации говорится что вачдог можно установить не позже 4-х тактов после его сброса, или как-то так
Я по-разному пробовал - нифига.
Ватчдог то у меня настроен. Я же говорю - у меня в проге после его срабатывания начинает висеть флаг прерывания в WDTCR. Бит WDIE тоже стоит. Т. е. это признак того, что прерывание-то прошло, но почему-то не обработано, т. к. именно обработчик должен аппаратно сбрасывать оба эти бита в ноль, после чего ватчдог переходит в режим сброса и по следующему прерыванию должен произойти ребут:
If WDE is set, WDIE is automatically cleared by hardware when a time-out occurs. After the WDIE bit is cleared, the next time-out will generate a reset.
У меня же этого не происходит.
Устанавливается же бит WDIE у меня однократно в начале проги ДО цикла, т. е. если бы он был сброшен аппаратно, то снова восстановиться не может.
Попробуй этот алгоритм на модели ATMEGA8, может и правда модель плохая?
Приведенный мною код на ATMEGA48A точно работает и в протеусе и в железе. А точно у тебя вачдог настроен на INT-RESET? Ведь есть режим "только прерывание".
Посмотри еще в даташите в конце раздела про вач-дог, там должны быть перечислены все регистры к нему причастные, может все-таки что-то упустил и есть какая-то еще особенность?
Приведенный мною код на ATMEGA48A точно работает и в протеусе и в железе. А точно у тебя вачдог настроен на INT-RESET? Ведь есть режим "только прерывание".
Посмотри еще в даташите в конце раздела про вач-дог, там должны быть перечислены все регистры к нему причастные, может все-таки что-то упустил и есть какая-то еще особенность?
Ватчдог точно настроен, т к я писал одновременно и WDE и WDIE как написано в ДШ. Кроме того, флаги все вздернуты, т. е. что-то с прерываниями. Щас глянул вектора - вроде все правильно, причем 2313А отличается от 2313 только двумя дополнительными PCINT, но эти процы обратно совместимы. Но с другой стороны, вектора объявлены в соответствующих INCLUDE... Естественно, имя я правильно написал. Интересно посмотреть как PC изменяется и на какой адрес он уходит...
Проще наверно будет спаять и посмотреть что в живую будет. Тем более все равно ведь паять.
***
Попробовал скомпилировал и смоделировал на Тини13. Там тоже очень интересно все. Прерывание вызывается, обрабатывается, но после команды reti прога уходит на ресет, причем даже если в прерывании я выполнил команду wdr. Причем ватчдог трассируется правильно - сообщение о сбросе есть, но проц ресетится.
Пора паять...
Проще наверно будет спаять и посмотреть что в живую будет. Тем более все равно ведь паять.
***
Попробовал скомпилировал и смоделировал на Тини13. Там тоже очень интересно все. Прерывание вызывается, обрабатывается, но после команды reti прога уходит на ресет, причем даже если в прерывании я выполнил команду wdr. Причем ватчдог трассируется правильно - сообщение о сбросе есть, но проц ресетится.
Пора паять...
Нахимичил что-то в прерывании, не установил стек...
Так я же на Си писал исходную прогу.
Короче, залил прогу в живой проц - он работает. При каждом включении питания числа меняются вполне рандомно (инициализирую функцию rand() содержимым TCNT0). Чтобы окончательно убедиться попробую еще в этом прерывании поставить маркер (например, мигнуть светодиодом) и посмотреть что будет. Но если бы прерывание на сработало, проц завис бы на вайле, в котором тестируется сброс бита WDIE, но он вроде работает согласно программе.
Вот такой вот глючный протеус
Короче, залил прогу в живой проц - он работает. При каждом включении питания числа меняются вполне рандомно (инициализирую функцию rand() содержимым TCNT0). Чтобы окончательно убедиться попробую еще в этом прерывании поставить маркер (например, мигнуть светодиодом) и посмотреть что будет. Но если бы прерывание на сработало, проц завис бы на вайле, в котором тестируется сброс бита WDIE, но он вроде работает согласно программе.
Вот такой вот глючный протеус
А, кстати, в протеусе не забыл выставить соответственно фьюзы? Там ведь они тоже работают...
На С тоже можно нехило нахимичить
На С тоже можно нехило нахимичить
Во всяком случае там трудно нахимичить со стеком или забыть сохранить SREG при входе в прерывание
А какие фьюзы? Ведь там только один фьюз, отвечающий за ватчдог, ито если его выставить, то ватчдог ВСЕГДА включен аппаратно и ВСЕГДА ТОЛЬКО на сброс. Соответственно, в моем случае этот фьюз незапрограммирован (ватчдог аппаратно не включен).
А какие фьюзы? Ведь там только один фьюз, отвечающий за ватчдог, ито если его выставить, то ватчдог ВСЕГДА включен аппаратно и ВСЕГДА ТОЛЬКО на сброс. Соответственно, в моем случае этот фьюз незапрограммирован (ватчдог аппаратно не включен).
Кто-нибудь знает, в какой системе (RC5, NEC или еще что) работают такие пульты:

?
У меня такого нет и посмотреть осцилом не могу.

?
У меня такого нет и посмотреть осцилом не могу.
У меня есть. Обычный RC5, на некоторые кнопки срабатывает ТВ-тюнер.
Вот выход сигнала кнопки "ON" со стандартного фотоприемника:
Вот выход сигнала кнопки "ON" со стандартного фотоприемника:
Большое спасибо!
Только вот что-то стартовые биты совсем не RC5товские... Больше на NEC смахивает.
А фотоприемник у вас на сколько килогерц?
Только вот что-то стартовые биты совсем не RC5товские... Больше на NEC смахивает.
А фотоприемник у вас на сколько килогерц?
Стандартный, с телевизора.


