Pull to refresh

Comments 32

Очень интересно, только одно «но».
Можно заключительную картинку (фотографию) изделия?
Что получилось в конце?
Только видео, увы — подарок уже подарил. Видео в первой части.
А где в статье ссылки на предыдущие статьи? Прошу исправить.
UFO just landed and posted this here
Вот спасибо! как раз праздники впереди, а тут и идея подарка есть.
Шикарный подарок. Китайцы случаем что-то подобное не делают? 100% купил-бы
Не знаю, но в промышленных масштабах такие штуки можно делать за копейки…
Очень интересно спасибо. Сам недавно начал писать по АВРки, так что опыта не много. Но могу посоветовать вот что: исключи _delay_ms из кода, замени ее функцией аналогичной из avr/sleep.h за исключением действий с числами с плавающей точной. Если точно задержек не критична конечно +-1-2%, то можно значительно сэкономить на размере (процентов 80 точно). Жаль что у 13 тиньки только один таймер, но зато у нее 4 АЦП. Из-за у меня есть задумка на ее основе сделать автомат один с термистором.
Кстати вопрос в чем писал/компилял? У меня AVRStudio почему отказалась создавать проект для 13 тиньки на C только на асме.
>исключи _delay_ms из кода, замени ее функцией аналогичной из avr/sleep.h за исключением действий с числами с плавающей точной.

Не понял. Во-первых, где тут числа с плавающей точкой? Все в интах. Во-вторых, в avr/sleep.h лежат функции собственно усыпления микроконтроллера (перевода его в спящий режим), а не задержки.
Они у меня используются, но не тут. В активном режиме меня совершенно не устроит спящий микроконтроллер, он должен продолжать подавать ШИМ-сигнал и проверять сенсоры.

Писал и компилял в AVR Studio+WinGCC
Упс сорри, дезинформировал немного. Копаем delay.h доходим до util/delay.h
Функция собственно:

void
_delay_ms(double __ms)
{
uint16_t __ticks;
double __tmp = ((F_CPU) / 4e3) * __ms;
if (__tmp < 1.0)
__ticks = 1;
else if (__tmp > 65535)
{
// __ticks = requested delay in 1/10 ms
__ticks = (uint16_t) (__ms * 10.0);
while(__ticks)
{
// wait 1/10 ms
_delay_loop_2(((F_CPU) / 4e3) / 10);
__ticks --;
}
return;
}
else
__ticks = (uint16_t)__tmp;
_delay_loop_2(__ticks);
}

Меня здесь например раздражает строчка
double __tmp = ((F_CPU) / 4e3) * __ms;
Посчитать, округлить и переписать и сравни с какой точностью получится разница.
Буэ, мерзость какая, я и не знал что они внутри аж с даблами работают.
Однозначно нафиг, спасибо. В АВРках я только с фикседами работаю, когда необходимы дроби.
Не за что, дерзай.
У меня дочка уже нацеливается кристалл растить, будем искать мешок купороса ;)
Оптимизация компилятора! Поэтому если поставишь оптимизацию в 0, ничего работать и не будет! Не слушай никого, все сам проверяй! =)
Вот что написано в этом же исходнике:
«In order for these functions to work as intended, compiler optimizations MUST be enabled, and the delay time MUST be an expression that is a known constant at compile-time.» translate.google.ru/ если непонятно, он весьма адекватно это переводит.

И вообще конструкция из толпы делэйев по 20мс мне не понятна, не проще ли написать один сразу на 100мс? Я более чем уверен что код с одним делэйем будет в разы меньше!!!

Не верите откомпильте сами:
Сначала откомпилен первый вариант а потом второй:

При этом сколько внутрь одной делэйки не вбивай, размер не будет меняться!

И вообще код очень не читаем, советую пользоваться макро, они облегчат вам жизнь.
#ifndef _BV
#define _BV(bit) (1 << (bit))
#endif

#ifndef sbi
#define sbi(data, bit) (data) |= _BV(bit)
#endif

#ifndef cbi
#define cbi(data, bit) (data) &= ~_BV(bit)
#endif

Надеюсь критика достаточна конструктивная. =)
Проект весьма хорош! =)
Этот делей лучше вообще убрать, у меня было полное ощущение что они юзают никак не даблы, поэтому большие делеи будут переполняться) Видимо, это мне приснилось)
А, они надеятся на оптимизацию, чтоб в компил-тайме вычислить и округлить…
Все равно неприятно осознавать что где-то в глубине кода — даблы)
В качестве компилятора+примитивная среда можно использовать WinAVR. AVRStudio, кстати, после установки WinAVR сама прикрутит в качестве компилятора gcc-avr.
Не совсем понял логику:
if((PWM>0)&&(Delay%2==0))   //Медленно гаснем
				PWM--;
			if(Delay>0x0200)                      //Совсем погасли

мы ведь Delay уменьшаем, но проверяем на больше 0x200
Delay всегда увеличивается. Это просто счетчик времени.
Уменьшается PWM, скважность.
действительно, проглядел, извиняюсь (и еще раз о пользе сна)
Так вот прям три части в один день.)

Я вот как раз позавчера вырастил два кристала из медного купороса.)
Сейчас еще одна статья будет, ждите)
Как же я завидую людям, у которых руки не из жопы :)
Кстати, вместо затравки можно использовать медную проволку.
Я ж решил немного поиздеваться: выращиваю ярко-зеленый кристалл. :)
UFO just landed and posted this here
Для зеленого не знаю солей (в самом деле, из чего вырастить ярко-зеленый?) а вот красно-оранжевый выращивается из красной кровяной соли. И выглядят очень неплохо, судя по фото (сам не выращивал). Говорят, они намного стабильнее кристаллов купороса.

Медный купорос и обычная пищевая соль. Последняя должна преобладать. =)
А не повлияет ли это на структуру кристалла? Мне что-то сомнительно, что все пройдет удачно.
Не повлияет, если вы хорошо растворите пищевую соль, которую надо растворять последней (на крайняк, она может плавать на дне).

У меня уже вырастают первые кристаллы, фотку прилагаю.
dl.dropbox.com/u/15528316/IMG_0086.JPG

Качество очень плохое, но под рукой нет фотоаппарата.
=) Да идея крутая. Автору спасибо. Пошел за медным купорос =)
Для зеленого цвета кристаллов используйте NiSO4 * 7H2O.
Получаются великолепные изумрудные кристаллы.
Sign up to leave a comment.

Articles

Change theme settings