Если на 85, то как угодно. Я делал и по и2с на другую плату, и софт сериал.. да как хочешь изгаляйся, там памяти хватит.
Если на 13, то отладь сперва на 85-ой. ;) Я серьезно, у тебя 1 К программы. Я ставил как-то себе софтварный и2с собственного разлива и ловил на Ардуинку, но для кода уже очень мало остается. Тут либо на симуляторе - терпеть их не могу! - либо на 85-ой отлаживать.
-------------
Вообще, совет: совсем не использовать 13-ые. У меня еще есть несколько и я думаю куда их пристроить (или просто выбросить). Нет смысла изгаляться с 13, если энергопотребление у 85-ой такое же, а памяти в разы больше.
Вообще, совет: совсем не использовать 13-ые. У меня еще есть несколько и я думаю куда их пристроить (или просто выбросить). Нет смысла изгаляться с 13, если энергопотребление у 85-ой такое же, а памяти в разы больше.
Есть несколько готовых схем, где тинька 13 вполне себя оправдывает. Лично у меня работает
- Сенсорный выключатель с диммированием по оному каналу
- Сторожевой таймер
- Таймер сна или кнопка питания для более прожорливых МК
Когда есть готовые схемки и разведенные платки и госрть корпусов купленных по 0.3$ там вполне ксть где развернуться
Но вот сидеть и впихивать код в МК с мизерной памятью, когда Mega8 стоит всего в 1.5 раза дороже извращение еще то
Вообще, совет: совсем не использовать 13-ые. У меня еще есть несколько и я думаю куда их пристроить (или просто выбросить). Нет смысла изгаляться с 13, если энергопотребление у 85-ой такое же, а памяти в разы больше.
Есть несколько готовых схем, где тинька 13 вполне себя оправдывает. Лично у меня работает
- Сенсорный выключатель с диммированием по оному каналу
- Сторожевой таймер
- Таймер сна или кнопка питания для более прожорливых МК
Когда есть готовые схемки и разведенные платки и госрть корпусов купленных по 0.3$ там вполне ксть где развернуться
Но вот сидеть и впихивать код в МК с мизерной памятью, когда Mega8 стоит всего в 1.5 раза дороже извращение еще то
Да я не о замене на Мегу, я про ТИНЬКУ, Точно такую же по ногам - в 8-ми ногом корпусе и совместимую на плате - про Тиньку85. Если есть идея и плата, то ну ее нахер это 13-ую. Только если в столе валяются и девать некуда.
int main(void)
{
while(1)
{
mode = 0;
while ( (PINB&(1<<2)) == (1<<2) ) {};
while ( (PINB&(1<<2)) == 0b00000000 ) {};
_delay_us(1200);
if ( (PINB&(1<<2)) == (1<<2) ) mode++ ;
_delay_us(200);
if ( (PINB&(1<<2)) == (1<<2) ) mode++ ;
_delay_us(200);
if ( (PINB&(1<<2)) == (1<<2) ) mode++ ;
if (mode == 0 && analogRead(2)<150)
{
off();
}
else flag=0;
if ( mode == 1 ) doubleflash();
if ( mode == 2 ) siren();
if ( mode == 3 ) always();
if ( analogRead(2)<150 && flag==0)
{
always();
flag1=1;
}
}
}
Коллеги, подскажите где ошибка? Смысл такой, с RC приемника идет сигнал, когда уровень меньше 150 то выполняется условие OFF()(подсветка выключена), и когда пропал сигнал управления с пульта, т.е сигнал будет тот же 150, должно выполняться условие always()., а это условие не выполняется.Понимаю что ошибка кроется в 15 и 24 строках т.к выполняется одновременно одно условие.Режим mode=0 тоже соответствует условию <150
Ну я сделал прерывание по нарастанию фронта, так как мне нужно замерить длину импульса, while(PINB & (1<<PB1)) эта строка ждет пока не произойдет спад на 0, пока спада нет идет замер длительности, и если она меньше 1000мс то выключить светодиод.
обработка прерывания в любых МК (пусть меня гуру исправят если я не прав) ВСЕГДА должна занимать минимум времени, они не предназначены для периодов типа ваших целая секунда - вечность с точки зрения МК.
и если уж совсем хочеться так сделать - обязательно первой командой после срабатывания прерывания - выключить его.
опять же, повторюсь - напишите минимальный скетч зажигания светодиода при нарастании импульса - проверьте, а потом уже будете всякие расчеты и прочее делать.
Не получается напивать скетч по нарастанию, по изменению сигнала получается, а по нарастанию не получается(((
А уважаемый просящий не забыл про дребезг?
Что мешает прерыванию реагировать на оба фронта: по первому фронту запоминать текущее время, по второму вычислять длительность. В основном цикле проверять эту длительность и реагировать в бесконечном цикле.
Что мешает прерыванию реагировать на оба фронта: по первому фронту запоминать текущее время, по второму вычислять длительность. В основном цикле проверять эту длительность и реагировать в бесконечном цикле.
Так я так и хочу сделать, а вот реализовать никак не получается. Набросайте если не сложно примерчик.
Вам необходимо по большому счету всю логику программы поменять (если я правильно задачу понял):
Логику вы поняли правильно) . Но на входе у меня не кнопка, и сигнал с приемника радиоуправления, импульсы там идут каждые 20мс, и мне надо измерять длину импульса и если она меньше 1000мс, то соответсвенно выполнить какое то действие.
volatile int length = 0;
volatile int start_time = 0;
void setup() {
Serial.begin(9600);
// Привязываем к Pin2 прерывание по фронту сигнала
attachInterrupt(0, rising, RISING);
}
void loop() { }
//Обработчик прерывания на возрастание сигнала
void rising() {
// Привязываем к Pin2 прерывание по срезу сигнала
attachInterrupt(0, falling, FALLING);
//сохраняем значение времени начала импульса
start_time = micros();
}
//Обработчик прерывания по срезу сигнала
void falling() {
// Привязываем к Pin2 прерывание по фронту сигнала
attachInterrupt(0, rising, RISING);
//сохраняем значение длительности импульса
length = micros() - start_time;
if (length<1000) Serial.println("werty");
else Serial.println(length);
}
Вот делал на ардуино, все работает как надо, не пойму как этот код перевети на Attiny.
на его основе можно уже считать, чуть позже попробую примерчик накидать, или сами, условие на ==1 поменяйте и попробуйте светодиод зажечь по высокому уровню
на его основе можно уже считать, чуть позже попробую примерчик накидать, или сами, условие на ==1 поменяйте и попробуйте светодиод зажечь по высокому уровню
Код компилится, условие поменял на ==1, туда же вставил строку PB4_HIGH else PB4_LOW, не работает.
Так сразу прерывание срабатывает, независимо от того, что подано на вход PB1, т.е сразу после загрузки скетча светодиод на PB4 загорается, специально добавил delay туда чтобы понять, прерывание включается сразу.
во время отображения могут (и наверняка срабатывают, т.к. Serial.print работает несоизмеримо медленнее ваших замеров) оба прерывания сработать и наверняка переменная start_time дает уже некорректное значение.
если хотим правильные цифры получить - необходимо отключать прерывание сразу после их вызова, и включать после отображения данных.
да и здесь вам ответили что возможно времени меньше 1000 мкс не бывает
На ардуино код работает отлично, импульс который мне надо отследить длительностью 980мкс он четко показывает и выполняет необходимые действия как только этот импульс поймался. На импульсы другой длительности не реагирует, короче то что я хочу и сделать на Attiny13.
Не встретилась
Если на 85, то как угодно. Я делал и по и2с на другую плату, и софт сериал.. да как хочешь изгаляйся, там памяти хватит.
Если на 13, то отладь сперва на 85-ой. ;) Я серьезно, у тебя 1 К программы. Я ставил как-то себе софтварный и2с собственного разлива и ловил на Ардуинку, но для кода уже очень мало остается. Тут либо на симуляторе - терпеть их не могу! - либо на 85-ой отлаживать.
-------------
Вообще, совет: совсем не использовать 13-ые. У меня еще есть несколько и я думаю куда их пристроить (или просто выбросить). Нет смысла изгаляться с 13, если энергопотребление у 85-ой такое же, а памяти в разы больше.
Вообще, совет: совсем не использовать 13-ые. У меня еще есть несколько и я думаю куда их пристроить (или просто выбросить). Нет смысла изгаляться с 13, если энергопотребление у 85-ой такое же, а памяти в разы больше.
Есть несколько готовых схем, где тинька 13 вполне себя оправдывает. Лично у меня работает
- Сенсорный выключатель с диммированием по оному каналу
- Сторожевой таймер
- Таймер сна или кнопка питания для более прожорливых МК
Когда есть готовые схемки и разведенные платки и госрть корпусов купленных по 0.3$ там вполне ксть где развернуться
Но вот сидеть и впихивать код в МК с мизерной памятью, когда Mega8 стоит всего в 1.5 раза дороже извращение еще то
Можно исходники и схему
Вообще, совет: совсем не использовать 13-ые. У меня еще есть несколько и я думаю куда их пристроить (или просто выбросить). Нет смысла изгаляться с 13, если энергопотребление у 85-ой такое же, а памяти в разы больше.
Есть несколько готовых схем, где тинька 13 вполне себя оправдывает. Лично у меня работает
- Сенсорный выключатель с диммированием по оному каналу
- Сторожевой таймер
- Таймер сна или кнопка питания для более прожорливых МК
Когда есть готовые схемки и разведенные платки и госрть корпусов купленных по 0.3$ там вполне ксть где развернуться
Но вот сидеть и впихивать код в МК с мизерной памятью, когда Mega8 стоит всего в 1.5 раза дороже извращение еще то
Да я не о замене на Мегу, я про ТИНЬКУ, Точно такую же по ногам - в 8-ми ногом корпусе и совместимую на плате - про Тиньку85. Если есть идея и плата, то ну ее нахер это 13-ую. Только если в столе валяются и девать некуда.
Можно исходники и схему
Такой модуль подойдёт?
И всё же
Такой модуль подойдёт?
Для чего подойдет?
Там нет диммирования. Там нет запоминания состояния. Плавного включения.
Для включения в схему
Для включения в схему
Тема про тини 13. Я написал, как использую тини 13
Естественно TTP223 и тысячи других микросхем можно включат в свои схемы. Иногда тинька выходит дешевле, чем специализированная микросхема
Ребят, подскажите,почему не работает код?
а зачем 32 строка?
и прерывание вообще срабатывает? прикрутите какой нибудь светодиод - чтоб загорался как сработает прерывание,
я бы отключение прерывания засунул внутрь ISR(INT0_vect)
да и не пойму логику - ISR срабатывает один раз при спаде, зачем цикл while для расчета времени между стартом программы и спадом?
Прерывание не срабатывает. светодиод подключен.
Прерывание не срабатывает. светодиод подключен.
значит начинаем последовательно искать где косяк,
выкидываете из скетча все кроме запуска этого прерывания и на срабатывание прерывания включение светодиода - тестируйте.
ЗЫ. а вы правильно прерывание включаете? даташит читали?
и кстати в вашем случае логичнее было бы использовать прерывание PCINT - оно
срабатывает при любом изменении сигнала, а внутри уже обрабатывать
Ну я сделал прерывание по нарастанию фронта, так как мне нужно замерить длину импульса,
while
(PINB & (1<<PB1)) эта строка ждет пока не произойдет спад на 0, пока спада нет идет замер длительности,
и если она меньше 1000мс то выключить светодиод.обработка прерывания в любых МК (пусть меня гуру исправят если я не прав) ВСЕГДА должна занимать минимум времени, они не предназначены для периодов типа ваших целая секунда - вечность с точки зрения МК.
и если уж совсем хочеться так сделать - обязательно первой командой после срабатывания прерывания - выключить его.
опять же, повторюсь - напишите минимальный скетч зажигания светодиода при нарастании импульса - проверьте, а потом уже будете всякие расчеты и прочее делать.
Не получается напивать скетч по нарастанию, по изменению сигнала получается, а по нарастанию не получается(((
А нарастание - это не изменение?
Что мешает проверить значение сразу после входа в прерывания?
Пробный скетч написали?
Не получается напивать скетч по нарастанию, по изменению сигнала получается, а по нарастанию не получается(((
А уважаемый просящий не забыл про дребезг?
Что мешает прерыванию реагировать на оба фронта: по первому фронту запоминать текущее время, по второму вычислять длительность. В основном цикле проверять эту длительность и реагировать в бесконечном цикле.
Так я так и хочу сделать, а вот реализовать никак не получается. Набросайте если не сложно примерчик.
чтоб набросать примерчик, необходимо вчитаться в даташит, на это нужно время, которого к сожалению нет :(
могу скинуть пример с прерыванием PCINT на attiny85 но там много лишнего....
вам необходимо по большому счету всю логику программы поменять (если я правильно задачу понял):
при старте обнулять флаг, обнулять счетчик времени, запускать прерывание.
в прерывании первой командой выключить прерывание, установить флаг.
в цикле loop постоянно смотреть состояние флага/время и как только он установиться - делать свою логику.
примеров в интернете масса:
http://osboy.ru/blog/microcontrollers/attiny13-switch.html
http://1io.ru/articles/microcontroller/attiny13/
https://radiokot.ru/forum/viewtopic.php?p=1657416
Вам необходимо по большому счету всю логику программы поменять (если я правильно задачу понял):
Логику вы поняли правильно) . Но на входе у меня не кнопка, и сигнал с приемника радиоуправления, импульсы там идут каждые 20мс, и мне надо измерять длину импульса и если она меньше 1000мс, то соответсвенно выполнить какое то действие.
Вот делал на ардуино, все работает как надо, не пойму как этот код перевети на Attiny.
это как? "идут каждые 20мс, и мне надо измерять длину импульса и если она меньше 1000мс"
противоречие - нет? импульс 1000 мс не может идти каждые 20 мс, или его длительность меньше 20
тьфу,период 20мс, длительность импульса от 1мс до 2мс, надо отследить импульс менее 1мс.
тьфу,период 20мс, длительность импульса от 1мс до 2мс, надо отследить импульс менее 1мс.
Между периодами (импульсами) низкий уровень на пине?
[/quote] Между периодами (импульсами) низкий уровень на пине?[/quote]
так точно,низкий.
попробовал так,тоже ничего не получается.
тьфу,период 20мс, длительность импульса от 1мс до 2мс, надо отследить импульс менее 1мс.
Серва и вот её тайминг?
Ну да, по этой диаграмме и пытаюсь написать код.
вот пример сработки прерывания по низкому уровню для attiny85 (13ой нету попробовать)
попробуйте - откомпилируется или нет для attyny13
на его основе можно уже считать, чуть позже попробую примерчик накидать, или сами, условие на ==1 поменяйте и попробуйте светодиод зажечь по высокому уровню
Ну да, по этой диаграмме и пытаюсь написать код.
Только там меньше 1000мкс не бывает.
От 1000 до 2000 с серединой 1500.
Ищите RC Switch.
Включая поиском недавно на форуме, кто-то уже сделал это.
http://arduino.ru/forum/programmirovanie/poluchenie-dannykh-s-priemnika-...
https://brainwagon.org/2014/06/14/making-a-simple-rc-switch/
на его основе можно уже считать, чуть позже попробую примерчик накидать, или сами, условие на ==1 поменяйте и попробуйте светодиод зажечь по высокому уровню
Код компилится, условие поменял на ==1, туда же вставил строку PB4_HIGH else PB4_LOW, не работает.
туда же вставил строку PB4_HIGH else PB4_LOW
ничего не понял - весь код приведите
а так работает?:
я конечно не уверен - но вы реально думаете что сможете увидеть моргание светодиода длительностью 2 мс ?
тупо кнопку на PB1 прицепите - проверьте - от нажатия светодиод загорается?
Так сразу прерывание срабатывает, независимо от того, что подано на вход PB1, т.е сразу после загрузки скетча светодиод на PB4 загорается, специально добавил delay туда чтобы понять, прерывание включается сразу.
я конечно не уверен - но вы реально думаете что сможете увидеть моргание светодиода длительностью 2 мс ?
А мне не надо отслеживать моргание, мне же надо просто замерить длину импульса.
вот в этот скетч если кнопку подцепить - будет загораться при опузкании на ноль PB1? т.е. понять прерывание вообще работает?
http://arduino.ru/forum/programmirovanie/attiny13a-101-primenenie?page=2...
Вот набросал что я хочу получить, как это делаю,но ничего не получается((
вот в этот скетч если кнопку подцепить - будет загораться при опузкании на ноль PB1? т.е. понять прерывание вообще работает?
Да, работает, светодиод загорается при замыкании PB1 на землю.
наверное как то так:
Не, не работает.
Не, не работает.
а в 92 строке вписали зажечь светодиод?
хм..интересно, а если в 61 строке поменять условие на > ?
там вообще есть имульсы меньше 1000 мкс ?
а в 92 строке вписали зажечь светодиод?
хм..интересно, а если в 61 строке поменять условие на > ?
там вообще есть имульсы меньше 1000 мкс ?
Вписал, на ардуине уно проверял (скетч выше писал)длительность, импульсы есть, от 98- до 1700мкс.
а в 92 строке вписали зажечь светодиод?
хм..интересно, а если в 61 строке поменять условие на > ?
там вообще есть имульсы меньше 1000 мкс ?
Вписал, на ардуине уно проверял (скетч выше писал)длительность, импульсы есть, от 98- до 1700мкс.
условие на больше 1000 поменяли для тестирования? светодиод загорелся?
ЗЫ. Значит тестируйте на каждом шаге что бы выявить ошибку, например сначала на фронте сигнала, потом на спаде и т.д.
и кстати: смотрю ваш код для UNO - а вы уверены что он корректно работает?
http://arduino.ru/forum/programmirovanie/attiny13a-101-primenenie?page=2...
во время отображения могут (и наверняка срабатывают, т.к. Serial.print работает несоизмеримо медленнее ваших замеров) оба прерывания сработать и наверняка переменная start_time дает уже некорректное значение.
если хотим правильные цифры получить - необходимо отключать прерывание сразу после их вызова, и включать после отображения данных.
да и здесь вам ответили что возможно времени меньше 1000 мкс не бывает
http://arduino.ru/forum/programmirovanie/attiny13a-101-primenenie?page=2...
На ардуино код работает отлично, импульс который мне надо отследить длительностью 980мкс он четко показывает и выполняет необходимые действия как только этот импульс поймался. На импульсы другой длительности не реагирует, короче то что я хочу и сделать на Attiny13.