Форум myROBOT.ru » Свободное общение » Болталочка » Простые программы

Страниц (1): [1]
 

1. soob - 18 Августа, 2013 - 13:35:16 - перейти к сообщению
Доброго времени суток!
С ознакомлением МК, как наверно как и у многих, в голове появились множество проектов которые хочется реализовать. На данный момент, не без помощи местных форумчан, умею заливать прошивку в Atmega8 и писать простой код для мигания светодиодами.. но этого далеко не достаточно даже для простого "проекта" (управление освещением салона авто)
По личному опыту (знаю PHP) убедился, что на много легче учится на практике нежели тратить время на чтение литературы.

...потому, хочу найти человека, который мог бы писать небольшие программы и объяснить что к чему. Если найдется человек, то я могу оплачивать обучение Улыбка (в разумных пределах)

к примеру то же освещение автосалона:
открываем дверь
- плавно включается свет

закрываем дверь
- задержка (3-10 сек.)
- плавное затухание
2. Predator - 18 Августа, 2013 - 16:59:10 - перейти к сообщению
Вы лучше пишите эти программы самостоятельно и задавайте появившиеся вопросы.
Например ваше управление светом - 3 основных задачи: опрос датчика двери, плавное включение-выключение, задержка перед выключением.

Форум это много таких людей, которые (ну по крайней мере я) не сделают для вас ничего, но подскажут как делать и предостерегут от вероятных ошибок.
3. soob - 18 Августа, 2013 - 18:05:28 - перейти к сообщению
Predator, согласен с Вами.
Я создал тему потому, что более месяца парился с этой задачей, а на форуме каждый пишет код по разному

например:
PORTD |= _BV(PD3); и PORTD.3=1; или #include <avr/io.h> и #include <mega8.h>

и получалось что у меня обработка кнопок на одном языке, ШИМ на другом, ну и т.п.

сейчас вроде нашел понятные мне статьи по теме..
4. Predator - 18 Августа, 2013 - 19:48:09 - перейти к сообщению
ну вы-же понимаете, что PORTD |= _BV(PD3); и PORTD.3=1; выполняет одну и ту-же функцию: взвести PORTD.3 в единицу, а в своём коде вы можете использовать любую, удобную для вас, конструкцию. На вкус и цвет все фломастеры разные....
я например когда что-то показываю пользователям AVRов - вообще использую неадекватные, но понятные имена. А конкретный код будет зависеть от компилятора и используемых библиотек....
5. soob - 18 Августа, 2013 - 20:31:03 - перейти к сообщению
Вот что у меня получилось:
CODE:
#include <mega8.h>
#include <delay.h>
void main(void)
{

PORTB=0x00;
DDRB=0x08;

PORTD=0x01;
DDRD=0x02;

ASSR=0x00;
TCCR2=0x6C;
TCNT2=0x00;
OCR2=0x00;
TIMSK=0x00;

while (1)
{
if ((PIND.0==0)&&(OCR2<0xff))
{
while(OCR2<0xff)
{
OCR2=OCR2+0x01;
delay_ms(1);
}
delay_ms(200);
}

if ((PIND.0!=0)&&(OCR2>0x00))
{
while(OCR2>0x00)
{
OCR2=OCR2-0x01;
delay_ms(1);
}
delay_ms(200);
}

delay_ms(100);
};
}


вроде работает Тащусь
6. Predator - 18 Августа, 2013 - 23:36:49 - перейти к сообщению
ну вот, ато прибедняетесь... я правда в АВРах не разбираюсь, но предположу, что OCR2 это регистр ШИМ. Не хватает только задержки 3-10 сек после закрывания двери.
Ну и еще кое-что я бы по другому сделал...
7. soob - 19 Августа, 2013 - 23:15:55 - перейти к сообщению
добавил защиту от дребезга (не знаю правильно ли)
и задержку перед гашением
CODE:

...
if ((PIND.0!=0)&&(OCR2>0x00)) /*если дверь закрыта и светодиод не погашен*/
{
delay_ms(10); /*ждем доли сек для проверки*/
if ((PIND.0!=0) /*если дверь закрыта*/
{
delay_ms(1000); /* задержка */
while(OCR2>0x00) /* затухание*/
{
...
{


вроде работает, но светодиод почему-то полностью не гаснет. С момента подкл-я питания к МК он оч. слабо, но горит Ламер
8. Predator - 25 Августа, 2013 - 10:45:18 - перейти к сообщению
проверку на тему дребезга можно было не делать - у вас тут не единичное нажатие кнопки, а продолжительное удержание и отработка события тоже плавная и продолжительная. проверка дребезга сделана правильно, только для таких больших контактов, как в конечнике в двери машины надо милисекунд 100.
почему светодиод не гаснет полностью - это вопрос... надо почитать в датащите про модуль ШИМ повнимательнее, возможно даже при 0 в регистре там есть импульс в один такт......