Можно было разделить по функциям но я боялся за размер скетча.
Кстати сейчас заметил, если я уменьшаю переменную long intervalRED = 600000; на 100000, всё работает.
Не могу понять почему?
Имхо надо искать косяки с переполнением.
Хорошую вам аналогию провели с смешались в кучу кони люди... Вы опять смешиваете сигнед и ансигнед. Если память мне не изменяет, в выражениях все приводится к сигнед, если есть хоть один сигнед.
Поэтому у вас и идёт переполнение имхо.
Кстати, в тини ядре акая точность сигнед Лонга?
Хотя опять же посмотрел, вроде и не должно быть переполнение. Вся проблема Атмелов, что никакой отладки нет, поэтому я и перешёл на стм8.
Кстати, вы экономите память, при этом очень расточительно ее используете на константы, которые могут быть прописаны в коде (interval red interval green), зачем вам две переменые lastMilis? Они разве различаются? Зачем два раза вызвать функцию, которая по сути должна вернуть одно и тоже? При инициализации портов вы можете вместо 4х строчек записать 2, так как настройка идёт одного порта, а не нескольких.
Активнее используйте макросы, это облегчает чтение кода не изменяя эффективность.
И я так понял светодиоды ут вас включены по разному? Проверьте, красный светодиод ут вас вообще управляется? Т.е в аппаратной части проблем нет?
Zahar, если я вам скажу, что компилятор умнее ,как правило, всех программистов, которые пишут программы. Вы мне поверите. Так вот чаще всего все эти действия которые вроде должны уменьшить код, код не уменьшают, а запутывают и увеличивают размер скетча. Так что не бойтесь добавлять лишние функции. Лишее и ненужное компилятор отбросит. Но компилятор еще не очень умный, что бы исправлять ну очень кривой код.
Иногда и элементарных вещей компилятор не видит, пока ему не подскажешь.
Скорее обратное. Человек который программирует не видит варианты. А когда компилятор показывает этот вариант, человек говорит, компилятор ты дурак, я имел здесь совершено другое. Та же аналогия: заказчик программист. Заказчик говорит делай то и это. А если то и это сделано, то "тупой программист" просто не понял заказчика. "Тупой программист" не знает "элеметарных вещей" :)
Ну мы примерно одно и тоже сказали: человек-программист не смог объяснить компилятору, что он от него хочет получить. Проблема скудности языка человека. Так и люди могут друг друга не понимать из-за костноязычности. Поэтому компилятору приходится дополнительно подсказывать, уточнять, что же хотел программист.
Я понимаю что между началом IF и следующим оператором присваивания
миллис может немножко изменится,
но не до такой-же степени точность вам нужна в ущерб размеру кода.
обсалютно одно и тоже. На размер скетча никак не влияет.
Вот именно, что на размер компилированного кода не влияет, но значительно упрощает чтение и понимание кода, его сопровождение и модификацию. Ты думаешь тут всем очень и интересно разбираться с магическими числами? Кстати, позволяет сильно сократить количество ошибок, особенно при модификации или переносе кода.
Ну и интересно, заработало у вас? Вы в комментах пишите 1 минута, но 600000 это 10 минут. Так работает ты выдержка, которая вначале не работала?
Подскажите у всех правильно работает функция delay();? У меня к примеру delay(1000); не равна секунде, а длиннее процентов на 20-30. В чём может быть проблема?
Attiny без внешнего кварц сильно не стабилен, в ДШ написано насколько, но 20....30 процентов что то не вериться - откуда цифры? Реальный скетч замера для проверки есть?
это совершенно нормально. Более того, так и должно быть. Пишите свой delay(), если есть желание.
millis - точнее, лучше прямо ovrf используйте, чтобы умножение к коду не приклеилось.
вот только что у себя посмотрел - по секундомеру - 10 мин, по тиньке - 428 сек ;) ;) ;).
Че то не верится в такую разницу - может частоты не те стоят? Уж не первый проект на attiny рисую - нет такой большой разницы - в будние дни после праздников проверю из любопытства
Я же написал, что дело не в генераторе, а в самой функции delay() в ядре тиньки. Если считать задержку через millis(), то там все нормально, в пределах 2-3%. Причем это НАПИСАНО в самой wiring.c, аглицким по белому в "todo". Есть желание - меняйте. У меня есть своя реализация.
========================
void delay(unsigned ms){
while(ms--){
_delay_ms(1); //Using the libc routine over and over is non-optimal but it works and is close enough
}//Note, I may have to reimplement this because the avr-libc delay is too slow *todo*
}
Подскажите у всех правильно работает функция delay();? У меня к примеру delay(1000); не равна секунде, а длиннее процентов на 20-30. В чём может быть проблема?
Вот этим регистром можно корректировать частоту МК.
К Attiny13 вобще можно кварц подцепить? В даташите по английски да еще так мутно написано, я ничего не понял. В даташите на Atmega328 все четко написано с какой частотой кварцы можно ставить и какой емкости конденсаторы к ним и еще схема нарисована куда все подсоединять.
500mA Высокая Эффективность 0.8-3.3 В до 3.3 В УГФ Step-up Dc-dc для ds18b20 dht22 STM32 FPGA CPLD Питания http://s.aliexpress.com/ZVFbUvu2?fromSns=Copy to Clipboard
(from AliExpress Android)
Радиомодуль самый дешёвый, качество отвратительное, но с антенной на несколько метров пробивает.
433 мГц РФ передатчик и приемник Ссылка Комплект для Arduino/arm/MCU WL хорошее качество http://s.aliexpress.com/i2YbInU7?fromSns=Copy to Clipboard
(from AliExpress Android)
С дуру взял ещё подороже супергетеродинный, думал сильно лучше, но ошибся, самое противное - у него было большое потребление, а пин выключения напрямую включён - пришлось на модуле отрывать ножку у чипа и припаивать на attiny85, что бы так же загонять радиомодуль в сон
Радиомодуль самый дешёвый, качество отвратительное, но с антенной на несколько метров пробивает.
433 мГц РФ передатчик и приемник Ссылка Комплект для Arduino/arm/MCU WL хорошее качество http://s.aliexpress.com/i2YbInU7?fromSns=Copy to Clipboard
(from AliExpress Android)
Andy, добрый день. Судя по Вашим словам, используете супергетеродин на 433 МГц, без применения библиотек типа WirtualWire и у Вас все работает? Ну Вы шаман, однако. Поделитесь, как подбирали длину антенны, ставили ли противовес и какую дальность передачи получили? Мой опыт - всего порядка 15 метров в городе в здании. При этом антенна - штырь в четверть волны.
я не шаман, а как и все начинающие ардуинщики - копипастер :) , тут пару страниц назад есть ссылка на источник, откуда скетч взят, я уже доработал для своих нужд.
никаких подборов длин антен, на передатчик - кусок провода метровой длины, на приемник - спиралька сантиметров 10, радиус действия метров 5 в помещении максимум - мне больше не нужно - просто повесить градусник на улице за окном.
Все понятно, просто звучали тут восторженные возгласы и цифры под километр, вот это меня и ввело в заблуждение. Тогда могу и посоветовать погуглить в сторону библиотеки WirtualWire. Обещают хорошую устойчивость к помехам. Сам не пробовал, т.к. пишу не на ардуино, а адаптировать библу было лень. Сделал т просто широтной-импульсный сигнал частотой 1кгц. На стороне приема rc-цепь и компаратор на транзисторе вроде. Мне надо было передавать 1 бит только. Работало, но иногда были сбои. Потом отказался вообще от вчрф, т.к. заказчик изменил ТЗ.
Все понятно, просто звучали тут восторженные возгласы и цифры под километр, вот это меня и ввело в заблуждение. Тогда могу и посоветовать погуглить в сторону библиотеки WirtualWire. Обещают хорошую устойчивость к помехам. Сам не пробовал, т.к. пишу не на ардуино, а адаптировать библу было лень. Сделал т просто широтной-импульсный сигнал частотой 1кгц. На стороне приема rc-цепь и компаратор на транзисторе вроде. Мне надо было передавать 1 бит только. Работало, но иногда были сбои. Потом отказался вообще от вчрф, т.к. заказчик изменил из.
что использовать всегда зависит от поставленной задачи.
VirtualWire на AtTiny запистить не смог - не стабильно работает - при уходе МК в спящий режим - потом уже не всегда передает данные.
Просто интересно, батарейка сильный мороз выдерживает?
Сам мечтаю сделать внешний термометр без проводов, но вижу его немного иначе. Батарейка, МК и передатчик в помещении, а датчик на улице, соединенный коротким проводком.
Zahar, почему вы все тащите в одну кучу. Или все же принцип разделяй и властвуй уже отменили
Что вы имеете в виду?
А что, с Новым годом поздравлять уже не принято? Ауууу. С Новым годом, ребята!
. Как вариант, высокоомный делитель в половину опорного и его смещать в плюс и минус. Прокатит?
А питание операционных усилителей двуполярное?
По идее должно работать, но на практике обычно на два разных входа ацп заводят.
А у вас Бородино
Можно было разделить по функциям но я боялся за размер скетча.
Кстати сейчас заметил, если я уменьшаю переменную long intervalRED = 600000; на 100000, всё работает.
Не могу понять почему?
Можно было разделить по функциям но я боялся за размер скетча.
Кстати сейчас заметил, если я уменьшаю переменную long intervalRED = 600000; на 100000, всё работает.
Не могу понять почему?
Имхо надо искать косяки с переполнением.
Хорошую вам аналогию провели с смешались в кучу кони люди... Вы опять смешиваете сигнед и ансигнед. Если память мне не изменяет, в выражениях все приводится к сигнед, если есть хоть один сигнед.
Поэтому у вас и идёт переполнение имхо.
Кстати, в тини ядре акая точность сигнед Лонга?
Хотя опять же посмотрел, вроде и не должно быть переполнение. Вся проблема Атмелов, что никакой отладки нет, поэтому я и перешёл на стм8.
Кстати, вы экономите память, при этом очень расточительно ее используете на константы, которые могут быть прописаны в коде (interval red interval green), зачем вам две переменые lastMilis? Они разве различаются? Зачем два раза вызвать функцию, которая по сути должна вернуть одно и тоже? При инициализации портов вы можете вместо 4х строчек записать 2, так как настройка идёт одного порта, а не нескольких.
Активнее используйте макросы, это облегчает чтение кода не изменяя эффективность.
И я так понял светодиоды ут вас включены по разному? Проверьте, красный светодиод ут вас вообще управляется? Т.е в аппаратной части проблем нет?
Zahar, если я вам скажу, что компилятор умнее ,как правило, всех программистов, которые пишут программы. Вы мне поверите. Так вот чаще всего все эти действия которые вроде должны уменьшить код, код не уменьшают, а запутывают и увеличивают размер скетча. Так что не бойтесь добавлять лишние функции. Лишее и ненужное компилятор отбросит. Но компилятор еще не очень умный, что бы исправлять ну очень кривой код.
Иногда и элементарных вещей компилятор не видит, пока ему не подскажешь.
Прошу прощения, дубль пошел. Значит поздравим всех с наступившим новым годом!
Скорее обратное. Человек который программирует не видит варианты. А когда компилятор показывает этот вариант, человек говорит, компилятор ты дурак, я имел здесь совершено другое. Та же аналогия: заказчик программист. Заказчик говорит делай то и это. А если то и это сделано, то "тупой программист" просто не понял заказчика. "Тупой программист" не знает "элеметарных вещей" :)
Ну мы примерно одно и тоже сказали: человек-программист не смог объяснить компилятору, что он от него хочет получить. Проблема скудности языка человека. Так и люди могут друг друга не понимать из-за костноязычности. Поэтому компилятору приходится дополнительно подсказывать, уточнять, что же хотел программист.
Прислушался к вашим наставлениям.
Вот что получилось
Кстати если кому то интересно что это вообще такое, это USB паяльник, купил его на ибеи.
По закону подлости как только купил сразу проверил его, паяльник работал.
Только он мне понадобился, естественно он перестал работать.
Решил поменять всю внутреннею начинку.
Я только не совсем понял смысл использования переменной currentMillisRED,
а также currentMillisGREEN.
А если просто так:
Я понимаю что между началом IF и следующим оператором присваивания
миллис может немножко изменится,
но не до такой-же степени точность вам нужна в ущерб размеру кода.
Вот блин, столько всего написал и сбой прошел... Ладно, ещё чего нибудь другого напишу.
Вообще, лучше сделать Миллс статической глобальной (чтобы убрать лишние вызов функций). И обновлять ее в каждой итерации loop.
Далее, чтобы в каждом цикле не производить излишне арифметические операции, я бы сделал так:
Ulong nextRED = currentMillis+intervalRED // выполняется в setup
if (currentMillis > nextRED)
{nextRED += intervalRED;
PORTB ^= (1<<RED);}
Ах, да, забыл написать то что слетело из-за сбоя:
#define RED 0
#define GREEN 4
#define intervalRED 1000
#define intervalGREEN 600000
setup()
{
currentMillis = millis();
DDRB = (1<<RED)&(1<<GREEN)
...
}
Я только не совсем понял смысл использования переменной currentMillisRED,
а также currentMillisGREEN.
Да наверное ты прав, я брал это из примеров не особо задумываясь для чего нужна эта переменная.
DDRB = (1<<RED)&(1<<GREEN)
это DDRB = 0b00010001; // PB0,PB4 - выходы
обсалютно одно и тоже. На размер скетча никак не влияет.
DDRB = (1<<RED)&(1<<GREEN)
это DDRB = 0b00010001; // PB0,PB4 - выходы
обсалютно одно и тоже. На размер скетча никак не влияет.
Вот именно, что на размер компилированного кода не влияет, но значительно упрощает чтение и понимание кода, его сопровождение и модификацию. Ты думаешь тут всем очень и интересно разбираться с магическими числами? Кстати, позволяет сильно сократить количество ошибок, особенно при модификации или переносе кода.
Ну и интересно, заработало у вас? Вы в комментах пишите 1 минута, но 600000 это 10 минут. Так работает ты выдержка, которая вначале не работала?
DDRB = (1<<RED)&(1<<GREEN)
это DDRB = 0b00010001; // PB0,PB4 - выходы
обсалютно одно и тоже. На размер скетча никак не влияет.
Это абсолютно разные выражения. Команда (1<<RED)&(1<<GREEN) полностью обнулит регистр.
Да-да, правильно надо ИЛИ
(1<< RED)|(1<< GREEN)
Прошу прощения за невнимательность, большую часть внимания отвлекается на набор текста на телефоне.
Как убрать автоисправитель? В редакторе комментариев нет bb кодов.
Подскажите у всех правильно работает функция delay();? У меня к примеру delay(1000); не равна секунде, а длиннее процентов на 20-30. В чём может быть проблема?
Attiny без внешнего кварц сильно не стабилен, в ДШ написано насколько, но 20....30 процентов что то не вериться - откуда цифры? Реальный скетч замера для проверки есть?
Я не программист, только начал. Сделал цикл задержки на 10 минут
for (diod=1; diod <=600; diod++){
digitalWrite(4,HIGH);
delay(500);
digitalWrite(4,LOW);
delay(500); }
И заметил, что светодиод как то медленно мигает. Замерил по секундомеру, этот цикл выполняется за 13 с лишним минут. Это норма?
это совершенно нормально. Более того, так и должно быть. Пишите свой delay(), если есть желание.
millis - точнее, лучше прямо ovrf используйте, чтобы умножение к коду не приклеилось.
вот только что у себя посмотрел - по секундомеру - 10 мин, по тиньке - 428 сек ;) ;) ;).
это совершенно нормально. Более того, так и должно быть. Пишите свой delay(), если есть желание.
millis - точнее, лучше прямо ovrf используйте, чтобы умножение к коду не приклеилось.
вот только что у себя посмотрел - по секундомеру - 10 мин, по тиньке - 428 сек ;) ;) ;).
Че то не верится в такую разницу - может частоты не те стоят? Уж не первый проект на attiny рисую - нет такой большой разницы - в будние дни после праздников проверю из любопытства
Считайте фьюзы и посмотрите, какая тактовая частота выставлена. И сверьте её с тактовой частотой в boards.txt для этого микроконтроллера.
Блин! Коллеги!
Я же написал, что дело не в генераторе, а в самой функции delay() в ядре тиньки. Если считать задержку через millis(), то там все нормально, в пределах 2-3%. Причем это НАПИСАНО в самой wiring.c, аглицким по белому в "todo". Есть желание - меняйте. У меня есть своя реализация.
========================
это совершенно нормально. Более того, так и должно быть. Пишите свой delay(), если есть желание.
millis - точнее, лучше прямо ovrf используйте, чтобы умножение к коду не приклеилось.
вот только что у себя посмотрел - по секундомеру - 10 мин, по тиньке - 428 сек ;) ;) ;).
Да, я так и подобрал у меня 10 минут равно 457 секунд. Я не разбираюсь, но чем выше я ставлю тактовую частоту в tiny, тем медленнее работает delay().
В общем всем спасибо! Тема закрыта.
Ну и интересно, заработало у вас? Вы в комментах пишите 1 минута, но 600000 это 10 минут. Так работает ты выдержка, которая вначале не работала?
1) Да все заработало.
2) В посте выше в коментах написано 10минут.
3) Скажите пожалуйста, почему я не получаю сообщения от сервера о том что есть "новые сообщения" ?
Подскажите у всех правильно работает функция delay();? У меня к примеру delay(1000); не равна секунде, а длиннее процентов на 20-30. В чём может быть проблема?
Вот этим регистром можно корректировать частоту МК.
OSCCAL=0x7F;
Значения варируюца от 0x00 до 0x7F
Ах, да, забыл написать то что слетело из-за сбоя:
#define RED 0
#define GREEN 4
#define intervalRED 1000
#define intervalGREEN 600000
setup()
{
currentMillis = millis();
DDRB = (1<<RED)&(1<<GREEN)
...
}
А почему я не могу исправить свое сообщение? Какие-то могу, какие-то нет.
Просьба к админу исправить ошибку в последней строке.
Ну и интересно, заработало у вас? Вы в комментах пишите 1 минута, но 600000 это 10 минут. Так работает ты выдержка, которая вначале не работала?
1) Да все заработало.
А смогли локализовать ошибку почему не работало?
Просто на первый взгляд не было не видно.
К Attiny13 вобще можно кварц подцепить? В даташите по английски да еще так мутно написано, я ничего не понял. В даташите на Atmega328 все четко написано с какой частотой кварцы можно ставить и какой емкости конденсаторы к ним и еще схема нарисована куда все подсоединять.
melectro, можно кварцевый генератор до 20МГц
А смогли локализовать ошибку почему не работало? Просто на первый взгляд не было не видно.
Нет.
Очевидно где то происходило переполнение, но где именно я так и не понял.
Наконец то пришли правильные стабилизаторы с микроамперными токами потребления в покое,
10 мкА без нагрузки, 16 мкА в спящем режиме всей схемы.
Уличный термометр, каждые ~17 минут отправляющий данные, скетч:
500mA Высокая Эффективность 0.8-3.3 В до 3.3 В УГФ Step-up Dc-dc для ds18b20 dht22 STM32 FPGA CPLD Питания
http://s.aliexpress.com/ZVFbUvu2?fromSns=Copy to Clipboard
(from AliExpress Android)
Это вообще крутой пример. А что за радиомодуль? Я вот такие пробовал, только у другого продавца за 800 рублей
https://ru.aliexpress.com/item/2pcs-E45-TTL-100-20dBm-3km-SX1276-868MHz-...
Эти вообще на километр в городе передают и 4 в лесу. Если рядом можно мощность снижать со 100 до 1 мВт, чтобы помех не делать...
Радиомодуль самый дешёвый, качество отвратительное, но с антенной на несколько метров пробивает.
433 мГц РФ передатчик и приемник Ссылка Комплект для Arduino/arm/MCU WL хорошее качество
http://s.aliexpress.com/i2YbInU7?fromSns=Copy to Clipboard
(from AliExpress Android)
С дуру взял ещё подороже супергетеродинный, думал сильно лучше, но ошибся, самое противное - у него было большое потребление, а пин выключения напрямую включён - пришлось на модуле отрывать ножку у чипа и припаивать на attiny85, что бы так же загонять радиомодуль в сон
433 мГц РФ передатчик и приемник Ссылка Комплект для Arduino/arm/MCU WL хорошее качество
http://s.aliexpress.com/i2YbInU7?fromSns=Copy to Clipboard
(from AliExpress Android)
Andy, добрый день. Судя по Вашим словам, используете супергетеродин на 433 МГц, без применения библиотек типа WirtualWire и у Вас все работает? Ну Вы шаман, однако. Поделитесь, как подбирали длину антенны, ставили ли противовес и какую дальность передачи получили? Мой опыт - всего порядка 15 метров в городе в здании. При этом антенна - штырь в четверть волны.
Опять у меня дубли пошли(
я не шаман, а как и все начинающие ардуинщики - копипастер :) , тут пару страниц назад есть ссылка на источник, откуда скетч взят, я уже доработал для своих нужд.
никаких подборов длин антен, на передатчик - кусок провода метровой длины, на приемник - спиралька сантиметров 10, радиус действия метров 5 в помещении максимум - мне больше не нужно - просто повесить градусник на улице за окном.
...............- мне больше не нужно - просто повесить градусник на улице за окном.
...............- мне больше не нужно - просто повесить градусник на улице за окном.
конечно, что вас смущает?
Все понятно, просто звучали тут восторженные возгласы и цифры под километр, вот это меня и ввело в заблуждение. Тогда могу и посоветовать погуглить в сторону библиотеки WirtualWire. Обещают хорошую устойчивость к помехам. Сам не пробовал, т.к. пишу не на ардуино, а адаптировать библу было лень. Сделал т просто широтной-импульсный сигнал частотой 1кгц. На стороне приема rc-цепь и компаратор на транзисторе вроде. Мне надо было передавать 1 бит только. Работало, но иногда были сбои. Потом отказался вообще от вчрф, т.к. заказчик изменил ТЗ.
что использовать всегда зависит от поставленной задачи.
VirtualWire на AtTiny запистить не смог - не стабильно работает - при уходе МК в спящий режим - потом уже не всегда передает данные.
конечно, что вас смущает?
Сам мечтаю сделать внешний термометр без проводов, но вижу его немного иначе. Батарейка, МК и передатчик в помещении, а датчик на улице, соединенный коротким проводком.