ATtiny45 - странность с внешним прерыванием

Обсуждаем контроллеры компании Atmel.
veso74
Поставщик валерьянки для Кота
Сообщения: 1907
Зарегистрирован: Сб май 05, 2012 20:24:52
Откуда: KN34PC, Болгария
Контактная информация:

Re: ATtiny45 - странность с внешним прерыванием

Сообщение veso74 »

После того, как МК перезагрузится из-за проблема, распечатайте этот регистр и приведите содержимое.
(Думаю над МК над 8-pins AVR с отладкой - миссия почти невыполнима).
---
Если нет другого варианта - "телефрагируйте" его содержимое через один выход со LED :).

Код: Выделить всё

MCUSR – MCU Status Register
The MCU Status Register provides information on which reset source caused an MCU Reset.
Реклама
watchmaker
Поставщик валерьянки для Кота
Сообщения: 2183
Зарегистрирован: Вс ноя 15, 2009 23:13:59
Откуда: Харьков
Контактная информация:

Re: ATtiny45 - странность с внешним прерыванием

Сообщение watchmaker »

После того, как МК перезагрузится
Он НЕ ПЕРЕЗАГРУЖАЕТСЯ, а просыпается и продолжает выполнять код с текущего места (и с текущими значениями переменных), не выполняя обработчик прерывания. Перезагрузка была бы заметна по сбросу в ноль переменной m_index - она остаётся с тем значением, которое было в неё записано.
Подозреваю, что дело всё-таки в кнопке с токопроводящей резинкой - при нажатии напряжение на пине поднимается недостаточно быстро.
Иногда мой питомец уходит в такую спячку, что разбудить его можно только щелчком по первой ноге...
Реклама
veso74
Поставщик валерьянки для Кота
Сообщения: 1907
Зарегистрирован: Сб май 05, 2012 20:24:52
Откуда: KN34PC, Болгария
Контактная информация:

Re: ATtiny45 - странность с внешним прерыванием

Сообщение veso74 »

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

Вот как "пробуждаю" ATtiny13A одной из двух кнопок, затем через 5 секунд он снова "засыпает".

Код: Выделить всё

#define PIN_TA  PB1
#define PIN_TI  PB2
...
  PORTB |= (1 << PIN_TI) | (1 << PIN_TA);  // pull-ups
  GIMSK |= (1 << PCIE);                    // sets the Pin change interrupt mask
  PCMSK |= (1 << PCINT1) | (1 << PCINT2);  // wake up from PB1 or PB2
...
  если время > 5000 ms  {
    sei();
    WDTCR &= ~(1 << WDTIE);  // disable Watchdog Timer interrupt
    set_sleep_mode(SLEEP_MODE_PWR_DOWN);
    sleep_enable();
    sleep_cpu();
  }

ISR(PCINT0_vect) {  // wake up
  sleep_disable();
  cli();
  WDTCR |= (1 << WDTIE);  // enable Watchdog Timer interrupt
}
Потребление равно нулю :) (почти) - одна батарейка CR2032 с 02.2023 работает до сих пор.
Не то чтобы пользовался устройством, но саморазряд определенно выше.
watchmaker
Поставщик валерьянки для Кота
Сообщения: 2183
Зарегистрирован: Вс ноя 15, 2009 23:13:59
Откуда: Харьков
Контактная информация:

Re: ATtiny45 - странность с внешним прерыванием

Сообщение watchmaker »

Ещё два вопроса по внешним прерываниям.
1. Безопасно ли на лету менять значения PCMSK и/или GIMSK? Не могу отследить, почему очень редко (два раза за неделю при сотнях запусков в день как от часов, так и с кнопки) контроллер намертво зависает. Есть подозрение на запись в PCMSK (включение внешнего прерывания) непосредственно перед уходом в спящий режим.
2. Можно ли сделать обработчик прерывания полностью пустым, т. е. использовать внешнее прерывание чисто для пробуждения чипа?
Иногда мой питомец уходит в такую спячку, что разбудить его можно только щелчком по первой ноге...
Реклама
Эиком - электронные компоненты и радиодетали
akl
Друг Кота
Сообщения: 4445
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Re: ATtiny45 - странность с внешним прерыванием

Сообщение akl »

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

Код: Выделить всё

	.INCLUDE "tn25def.inc"

.def	R_FF=R19
;*******************************
	.CSEG
RESET:
	RJMP	START
.org	0x02	;PCINT0
	RET		;RETI
.org	0x05	;T0_OVER
	RETI
;*************************************************
START:
;	SER	R_FF

	SBI	PORTB,2	;включить подтяжку

;	OUT	DDRB,R_FF

	SBI	ACSR,ACD

	LDI	R16,1<<PRTIM1|1<<PRUSI|1<<PRADC
	OUT	PRR,R16
;запретить тактирование неиспольэуемых модулей
	LDI	R16,1<<PCINT2
	OUT	PCMSK,R16

	LDI	R16,1<<PCIE
	OUT	GIMSK,R16
	OUT	GIFR,R16

	LDI	R16,1<<SE|1<<SM1
	OUT	MCUCR,R16	; режим SLEEP PWD

	LDI	R16,1<<TOIE0		;1<<OCIE0A
	OUT	TIMSK,R16	;разрешить прерывание Timer0_OVER
	OUT	TIFR,R16

	LDI	R16,1<<CS10		;R16=1
	OUT	TCCR0B,R16
GO:
;	LDI	ZH,HIGH(2*TB_02)
;	LDI	ZL,LOW(2*TB_02)

WAIT:
	SEI
	SLEEP
	NOP
	BRID	VAR_KEY
;обработка прерываний от других модулей
;*
;*
;*
	RJMP	WAIT
;*******
VAR_KEY:
;обработка внешнего прерывания
;*
;*
;*
	RJMP	WAIT
.EXIT
Реклама
AQ29
Прорезались зубы
Сообщения: 201
Зарегистрирован: Сб июл 30, 2011 21:00:24

Re: ATtiny45 - странность с внешним прерыванием

Сообщение AQ29 »

[uquote="watchmaker",url="/forum/viewtopic.php?p=4733248#p4733248"]Не могу отследить, почему очень редко (два раза за неделю при сотнях запусков в день как от часов, так и с кнопки) контроллер намертво зависает.[/uquote]
Обычно такие дефекты связаны с плохой методикой написания программы, особенно при работе с прерываниями. От этого надо уходить.

[uquote="watchmaker",url="/forum/viewtopic.php?p=4733248#p4733248"]Можно ли сделать обработчик прерывания полностью пустым, т. е. использовать внешнее прерывание чисто для пробуждения чипа?[/uquote]
Вроде как изначально все обработчики прерывания пустые, на месте вектора прерывания просто стоит команда RETI.

Насчёт дребезга. Надо сделать нормальную программную защиту от дребезга кнопки, это просто, а не надеяться на авось. В нормальной среде разработки есть готовая команда, чтобы не морочиться.

[uquote="veso74",url="/forum/viewtopic.php?p=4733098#p4733098"]После того, как МК перезагрузится из-за проблема, распечатайте этот регистр и приведите содержимое.
(Думаю над МК над 8-pins AVR с отладкой - миссия почти невыполнима).[/uquote]
Дело не в МК AVR, а в отсутствии или наличии хорошей среды разработки и программатора-отладчика.
Реклама
Аватара пользователя
Just_Fluffy
Вымогатель припоя
Сообщения: 532
Зарегистрирован: Ср июн 29, 2022 16:25:45

Re: ATtiny45 - странность с внешним прерыванием

Сообщение Just_Fluffy »

AQ29 писал(а):адо сделать нормальную программную защиту от дребезга кнопки, это просто, а не надеяться на авось. В нормальной среде разработки есть готовая команда, чтобы не морочиться.
Приведите , пожалуйста, команду языка Си, на котором пишет ТС, что бы защититься от дребезга?
Белая и Пушистая
Аватара пользователя
smacorp
Друг Кота
Сообщения: 3483
Зарегистрирован: Вт окт 22, 2013 04:37:23
Откуда: Казань

Re: ATtiny45 - странность с внешним прерыванием

Сообщение smacorp »

Just_Fluffy, пожалуйста. :)

Код: Выделить всё

#define BROTHERLY_ANTI-BOUNCE "Не дребезжи по-братски есть же!"
Платы для HLDI - установки лазерной засветки фоторезиста.
Фоторезист Ordyl Alpha 350
Жидкое олово для лужения плат (видео) - самое лучшее и только у меня.
Паяльные маски XV501T-4 и KSM-S6189 (5 цветов).
Заказ печатных плат - pcbsmac@gmail.com
Аватара пользователя
Just_Fluffy
Вымогатель припоя
Сообщения: 532
Зарегистрирован: Ср июн 29, 2022 16:25:45

Re: ATtiny45 - странность с внешним прерыванием

Сообщение Just_Fluffy »

smacorp, использование данного дефайна даст ашыбку компиляции...
Обернуть строку в какой то printf надо....
И вообще, в нормальных средах разработки такие дефайны не нужны. Там уже все есть встроенное. И одна большая кнопка - сгенерировать код. Даже думать не надо, жми и наслаждайся
Белая и Пушистая
Аватара пользователя
smacorp
Друг Кота
Сообщения: 3483
Зарегистрирован: Вт окт 22, 2013 04:37:23
Откуда: Казань

Re: ATtiny45 - странность с внешним прерыванием

Сообщение smacorp »

Just_Fluffy, ашыбку не даёт, даёт ворнинг:

Код: Выделить всё

src\main.cpp:9:23: warning: ISO C++11 requires whitespace after the macro name
 #define BROTHERLY_ANTI-BOUNCE "Не дребезжи по-братски есть же!"
                       ^
Вот релиз:

Код: Выделить всё

#define BROTHERLY_ANTIBOUNCE "Не дребезжи по-братски есть же!"
Платы для HLDI - установки лазерной засветки фоторезиста.
Фоторезист Ordyl Alpha 350
Жидкое олово для лужения плат (видео) - самое лучшее и только у меня.
Паяльные маски XV501T-4 и KSM-S6189 (5 цветов).
Заказ печатных плат - pcbsmac@gmail.com
akl
Друг Кота
Сообщения: 4445
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Re: ATtiny45 - странность с внешним прерыванием

Сообщение akl »

[uquote="AQ29",url="/forum/viewtopic.php?p=4736438#p4736438"]...Вроде как изначально все обработчики прерывания пустые, на месте вектора прерывания просто стоит команда RETI...[/uquote]Зависит от среды разработки. На ассемблере делается вручную и необязательно RETI. Можно, при необходимости, выйти из обработчика по RET, т.е. с запретом прерываний. В вышеприведенном примере именно таким образом разделяются события, вызвавшие прерывание.
AQ29
Прорезались зубы
Сообщения: 201
Зарегистрирован: Сб июл 30, 2011 21:00:24

Re: ATtiny45 - странность с внешним прерыванием

Сообщение AQ29 »

[uquote="Just_Fluffy",url="/forum/viewtopic.php?p=4736446#p4736446"]Приведите , пожалуйста, команду языка Си, на котором пишет ТС, что бы защититься от дребезга?[/uquote]
На СИ не работаю, на мой взгляд, морочный язык. На котором работаю, есть простая команда чтения кнопок с подавлением дребезга и без всякого «обёртывания».
Чтение кнопок очень часто используется, поэтому, на мой взгляд, должна быть в хороших языках, это удобно.

Обычно надо дождаться окончания дребезга, затем отпускания кнопки, потом выполнять программу. Неясно, как сделано у ТС, возможно, тут заморочка.
[uquote="akl",url="/forum/viewtopic.php?p=4736556#p4736556"]Зависит от среды разработки. На ассемблере делается вручную и необязательно RETI. Можно, при необходимости, выйти из обработчика по RET, т.е. с запретом прерываний. В вышеприведенном примере именно таким образом разделяются события, вызвавшие прерывание.[/uquote]
Ассемблеры разные бывают. На близком к ассемблеру программе АБ вроде как RETI автоматически прописываются.
В моём случае можно включить или выключить эту автоматику.
Стандартный выход из прерывания по RETI вроде как предпочтительнее. Насколько обоснован нестандартный выход – вопрос.
Аватара пользователя
Just_Fluffy
Вымогатель припоя
Сообщения: 532
Зарегистрирован: Ср июн 29, 2022 16:25:45

Re: ATtiny45 - странность с внешним прерыванием

Сообщение Just_Fluffy »

AQ29, но ведь топикстартер пишет на си. Зачем вы ему рекламируете АБ и ваш современный ассемблер и среду разработки, имя которой вы так нигде и не назвали?
Белая и Пушистая
OKF
Это не хвост, это антенна
Сообщения: 1393
Зарегистрирован: Вт июн 07, 2011 08:03:18

Re: ATtiny45 - странность с внешним прерыванием

Сообщение OKF »

Даёшь неморочный АБ в массы!
На ассемблере можно почти всё сделать одной командой. На макроассемблере.)
Аватара пользователя
Just_Fluffy
Вымогатель припоя
Сообщения: 532
Зарегистрирован: Ср июн 29, 2022 16:25:45

Re: ATtiny45 - странность с внешним прерыванием

Сообщение Just_Fluffy »

OKF писал(а):Даёшь неморочный АБ в массы!
Пардоньте, но нет.
Лио нормальный асм, либо си.... А вот это вот... поделие... хоть и визуальное, и ассемблерно-приближенное... Может, если бы я потрогала АБ до изучения асма - то может и зашло б... Но обычный асм и студия 4й версии - наше всё.
А может и не зашло, ибо до микроконтроллеров было много программирования на си, паскале, pl/sql, немного на JS..
Белая и Пушистая
OKF
Это не хвост, это антенна
Сообщения: 1393
Зарегистрирован: Вт июн 07, 2011 08:03:18

Re: ATtiny45 - странность с внешним прерыванием

Сообщение OKF »

А вот начинала бы с Бейсика, тогда и АБ засчастье был бы.)
Серьёзно. Это потому что люди не с того начали. Вот сознание и исказилось.)
Аватара пользователя
Just_Fluffy
Вымогатель припоя
Сообщения: 532
Зарегистрирован: Ср июн 29, 2022 16:25:45

Re: ATtiny45 - странность с внешним прерыванием

Сообщение Just_Fluffy »

OKF, не поверишь, но в школе был Бейсик. В студенчестве - Паскаль. На халтурке - Борланд Си++
Белая и Пушистая
OKF
Это не хвост, это антенна
Сообщения: 1393
Зарегистрирован: Вт июн 07, 2011 08:03:18

Re: ATtiny45 - странность с внешним прерыванием

Сообщение OKF »

[uquote="Just_Fluffy",url="/forum/viewtopic.php?p=4736766#p4736766"]OKF, не поверишь, но в школе был Бейсик.[/uquote]
Значит кто-то пошел неправильным путём. Бывают исключения. Видать халтурки этому виной.)
Аватара пользователя
Just_Fluffy
Вымогатель припоя
Сообщения: 532
Зарегистрирован: Ср июн 29, 2022 16:25:45

Re: ATtiny45 - странность с внешним прерыванием

Сообщение Just_Fluffy »

Да не халтурки, а уроки информатики... Сначала алгоритм ы тетради, а потом превращение алгоритма в текст программы. И препод правильно сказал - что, имея алгоритм, не важно, какой потом будет язык программирования. А учили нас Бейсику, поскольку он был прописан в школьной программе для школ, которые оборудованы были компьютерными классами.
Белая и Пушистая
AQ29
Прорезались зубы
Сообщения: 201
Зарегистрирован: Сб июл 30, 2011 21:00:24

Re: ATtiny45 - странность с внешним прерыванием

Сообщение AQ29 »

[uquote="Just_Fluffy",url="/forum/viewtopic.php?p=4736624#p4736624"]AQ29, но ведь топикстартер пишет на си. Зачем вы ему рекламируете АБ и ваш современный ассемблер и среду разработки, имя которой вы так нигде и не назвали?[/uquote]
Тут вроде рекламы нет. На чём пишу, пока в разработке, да и имени пока нет, хотя в ваших постах неявно прозвучал интересный вариант названия.

Кстати, в моём варианте поиск такой ошибки был бы скорее всего очень простым. За несколько минут поставил несколько команд по ходу программы – вот и ясен путь программы и значения переменных в этих точках.
А вот так на СИ тратить массу времени на простую ошибку - это не моё.

[uquote="OKF",url="/forum/viewtopic.php?p=4736702#p4736702"]Даёшь неморочный АБ в массы!
На ассемблере можно почти всё сделать одной командой. На макроассемблере.)[/uquote]
АБ давно устарела. Запоздали вы с таким лозунгом лет на 20.
Сомневаюсь в таких возможностях макроассемблера. Наверно, даже прочитать кнопки без дребезга одной командой не получится.

[uquote="Just_Fluffy",url="/forum/viewtopic.php?p=4736766#p4736766"]OKF, не поверишь, но в школе был Бейсик. В студенчестве - Паскаль. На халтурке - Борланд Си++[/uquote]
Что вы так на бейсик обрушились. Для компьютера и сейчас бейсик вроде как активно развивается, только название стало Visual Basic.
Ответить

Вернуться в «AVR»