Страница 1 из 2

Регулировка временных задержек подстроечным резистором???

Добавлено: Пн мар 31, 2014 20:50:26
sanyo.95
Здравствуйте уважаемые коты. Извините если не туда написал. Я начинающий в изучении МК так что очень надеюсь на вашу помощь.
Как базу программы использовал обычное мигание светодиодом, в схему вместо светодиода включил реле, суть задачи - регулировать временные задержки двумя подстроечными резисторами. Покопался в сети и понял что мне нужно использовать АЦП, но так как я не силён в С - возникли проблемы с написанием кода.
Пишу в CVAVR, МК - atmega8.
Вот код который у меня получился (пока для одного резистора, работает как-то неадекватно):

#include <mega8.h>
#include <delay.h>

void main(void)
{
int r;
ACSR=0x80;
SFIOR=0x00;
ADMUX=0;
ADCSR=0x85;
PORTB=0x00;
DDRB=0x1;

while (1)
{
ADCSR |=0x40;
r=ADCW;


PORTB.0=1;
delay_ms(3000*r);
PORTB.0=0;
delay_ms(3000);
}
};

Прикрепляю схему, проект в протеусе и прошивку.
Помогите пожалуйста.
01.jpg
Схема
(137.6 КБ) 495 скачиваний
01.zip
Протеус, прошивка
(22.35 КБ) 200 скачиваний

Re: Регулировка временных задержек подстроечным резистором??

Добавлено: Вт апр 01, 2014 12:12:13
Gudd-Head
Без комментов в коде ничего не понятно что вы хотите сделать.
sanyo.95 писал(а):работает как-то неадекватно
Ничего удивительного :)

Re: Регулировка временных задержек подстроечным резистором??

Добавлено: Вт апр 01, 2014 12:41:48
Morroc
ну общая идея видимо такая - длительность первой паузы (единички на выходе) должна зависеть от угла поворота подстроечника, выходит, что меняется она от 0 сек до 1 часа если в остальном нет косяков, а вот что хотелось - непонятно

Re: Регулировка временных задержек подстроечным резистором??

Добавлено: Вт апр 01, 2014 12:44:21
Gudd-Head
Общая идея и так понятна.
Интересна её реализация в коде, сам алгоритм.

Re: Регулировка временных задержек подстроечным резистором??

Добавлено: Вт апр 01, 2014 12:47:18
Morroc
считать ацп - сделать пропорциональную паузу

хотелось бы знать чего именно (в цифириях) хотел автор
sanyo.95 писал(а): Пишу в CVAVR, МК - atmega8.
а нужно обязательно на C в CVAVR, ну т.е. цель - научиться работать с мк на низком уровне или это необязательно ? а то можно с "ардуин" начать - ни портов побитно ни прерываний ковырять не надо, все обернуто в готовые функции, r = analogRead(); и вперед, даже инициализировать не нужно особо ничего
sanyo.95 писал(а):Покопался в сети и понял что мне нужно использовать АЦП, но так как я не силён в С - возникли проблемы с написанием кода
лучше покопаться еще и посмотреть пример работы с АЦП - все чутка сложнее, чем в вашем коде

Re: Регулировка временных задержек подстроечным резистором??

Добавлено: Вт апр 01, 2014 15:58:28
sanyo.95
Morroc писал(а):ну общая идея видимо такая - длительность первой паузы (единички на выходе) должна зависеть от угла поворота подстроечника, выходит, что меняется она от 0 сек до 1 часа если в остальном нет косяков, а вот что хотелось - непонятно
Именно это я хочу осуществить только не до 1 часа, а до 10с максимум , и вторая задержка на которой 0, тоже должна регулироваться.
Gudd-Head писал(а):а нужно обязательно на C в CVAVR, ну т.е. цель - научиться работать с мк на низком уровне или это необязательно ?
Да, обязательно.
Morroc писал(а):хотелось бы знать чего именно (в цифириях) хотел автор
Не понял вопроса?
Gudd-Head писал(а):лучше покопаться еще и посмотреть пример работы с АЦП
Вот именно по той причине, что самостоятельно я не разобрался пишу сюда.

Re: Регулировка временных задержек подстроечным резистором??

Добавлено: Вт апр 01, 2014 19:27:00
Morroc
начал что то писать, но похерилось :) отправлю пока сюда ->

http://radiokot.ru/forum/viewtopic.php?f=20&t=60071

если 10 с надо максимум - зачем 3000 * результат ?

Re: Регулировка временных задержек подстроечным резистором??

Добавлено: Вт апр 01, 2014 20:51:25
sanyo.95
Morroc писал(а):начал что то писать, но похерилось :) отправлю пока сюда ->

http://radiokot.ru/forum/viewtopic.php?f=20&t=60071

если 10 с надо максимум - зачем 3000 * результат ?
Ну я по-другому не додумался как управлять задержкой :))

А насчет ссылки, я именно на примере этого устройства и пытался написать свой код, ну никак я не пойму как это работает.

Re: Регулировка временных задержек подстроечным резистором??

Добавлено: Вт апр 01, 2014 23:27:36
Morroc
Я не про управление задержкой, а про ее длительность. Мы ведь можем из АЦП и 1000 считать, умножим на 3000 и получим 3000000 мс ? многовато

#include <mega8.h>
#include <delay.h>

void main(void)
{
int r;
ACSR=0x80; // это вроде к компаратору относится, оно точно нужно ?
SFIOR=0x00;
ADMUX=0;
ADCSR=0x85;
PORTB=0x00;
DDRB=0x1;


while (1)
{
ADCSR |=0x40;

while((ADCSRA & 0x10)==0); // <- чего то такого по идее не хватает тут
ADCSRA|=0x10; // <- устанавливаем ADIF

r=ADCW;
PORTB.0=1;
delay_ms(3000*r);
PORTB.0=0;
delay_ms(3000);
}
};

а так работает ?

Re: Регулировка временных задержек подстроечным резистором??

Добавлено: Ср апр 02, 2014 00:21:59
sanyo.95
Спасибище!!! Всё работает. Насчет 3000мс ты прав способом подбора поставил 20мс :))
Есть пара вопросов:
Morroc писал(а):Мы ведь можем из АЦП и 1000 считать
А можно как-то определить какое значение идет с АЦП?
Morroc писал(а):ACSR=0x80; // это вроде к компаратору относится, оно точно нужно ?
Это я не знаю, к сожалению :(
Morroc писал(а):while((ADCSRA & 0x10)==0); // <- чего то такого по идее не хватает тут
Поясни пожалуйста, что означает эта строка?

1. Чтобы регулировать другую задержку нужна ещё одна переменная?
2. Насколько я понимаю АЦП не может работать с двумя входами одновременно - нужны ли прерывания?
3. Регулировка ведь не зависит от номинала резистора?
Пока наверное хватит :sleep:
Спасибо ещё раз что откликнулся :)

Re: Регулировка временных задержек подстроечным резистором??

Добавлено: Ср апр 02, 2014 00:53:06
Morroc
sanyo.95 писал(а): А можно как-то определить какое значение идет с АЦП?
в такой конфигурации получится от 0 до 1023 (10 бит)
sanyo.95 писал(а):
Morroc писал(а):ACSR=0x80; // это вроде к компаратору относится, оно точно нужно ?
Это я не знаю, к сожалению :(
думаю можно убрать
sanyo.95 писал(а):
Morroc писал(а):while((ADCSRA & 0x10)==0); // <- чего то такого по идее не хватает тут
Поясни пожалуйста, что означает эта строка?
после запуска измерения нужно обязательно дождаться появления этого бита - он означает окончания измерения и только после этого можно считывать результат, в таком режиме (есть еще другой режим работы ацп - режим непрерывного измерения) после окончания измерения нужно сбросить этот бит, делается это с помощью ADCSRA|=0x10;
sanyo.95 писал(а): 1. Чтобы регулировать другую задержку нужна ещё одна переменная?
лучше бы да - оно понятнее будет
sanyo.95 писал(а): 2. Насколько я понимаю АЦП не может работать с двумя входами одновременно - нужны ли прерывания?
прерывание можно использовать как раз для измерения, а конкретный вход выбирается через ADMUX, в данном коде можно запускать в цикле сначала измерение при ADMUX=0, потом при ADMUX=1 (после переключения и до начала измерения нужно еще сделать delay_us(10);), потом формируем паузы
sanyo.95 писал(а): 3. Регулировка ведь не зависит от номинала резистора?
угу, если взять поменьше - будет ток через него "лишний" течь, если слишком большой - возможны помехи и какое то влияние сопротивления входа меги на измеряемое напряжение, 1к в принципе пойдет, но можно и 10к

Re: Регулировка временных задержек подстроечным резистором??

Добавлено: Ср апр 02, 2014 17:30:03
sanyo.95
Morroc писал(а):прерывание можно использовать как раз для измерения, а конкретный вход выбирается через ADMUX, в данном коде можно запускать в цикле сначала измерение при ADMUX=0, потом при ADMUX=1 (после переключения и до начала измерения нужно еще сделать delay_us(10);), потом формируем паузы
Про паузы и прерывания чего - то не понял. Куда их писать и как?


В общем из всего, что я понял, слепил код под вторую задержку. В протеусе вроде работает. Выкладываю для исправления "неровностей".
И ещё хочу спросить по поводу Fuse bit - как их настроить?

Код:
#include <mega8.h>
#include <delay.h>

void main(void)
{
int r;
int t;
SFIOR=0x00;
ADMUX=0;
ADMUX=1;
ADCSR=0x85;
PORTB=0x00;
DDRB=0x1;


while (1)
{
ADCSR |=0x40;

while((ADCSRA & 0x10)==0); // <- чего то такого по идее не хватает тут
ADCSRA|=0x10; // <- устанавливаем ADIF

r=ADCW;
t=ADCW;
PORTB.0=1;
delay_ms(20*t);
PORTB.0=0;
delay_ms(20*r);
}
};

Re: Регулировка временных задержек подстроечным резистором??

Добавлено: Ср апр 02, 2014 17:58:11
Morroc
sanyo.95 писал(а): В протеусе вроде работает.
да ладно :) и что оно делает ?
sanyo.95 писал(а): И ещё хочу спросить по поводу Fuse bit - как их настроить?
целая тема есть про них - лучше туда, можно ничего не настраивать если устраивает работа от внутреннего генератора на тактовой 1 МГц


#include <mega8.h>
#include <delay.h>

void main(void)
{
int r;
int t;
SFIOR=0x00;
// ADMUX=0; <- тут убираем
// ADMUX=1;
ADCSR=0x85;
PORTB=0x00;
DDRB=0x1;


while (1)
{

//замер по одной ноге
ADMUX=0; // <- вставляем сюда
delay_us(10); // ждем чутка после переключения
ADCSR |=0x40;
while((ADCSRA & 0x10)==0); // <- чего то такого по идее не хватает тут
ADCSRA|=0x10; // <- устанавливаем ADIF
r=ADCW;

//замер по второй ноге
ADMUX=1; // <- вставляем сюда
delay_us(10); // ждем чутка после переключения
ADCSR |=0x40;
while((ADCSRA & 0x10)==0); // <- чего то такого по идее не хватает тут
ADCSRA|=0x10; // <- устанавливаем ADIF
t=ADCW;

// теперь длительность состояния 1 регулируется одним подстроечником, а длительность 0 на той же ноге PORTB другим подстроечником - так надо ?

PORTB.0=1;
delay_ms(20*t);
PORTB.0=0;
delay_ms(20*r);
}
};

Re: Регулировка временных задержек подстроечным резистором??

Добавлено: Ср апр 02, 2014 18:20:05
sanyo.95
Спасибо большое за код, да и вообще за помощь, про фюзы почитаю.

Morroc писал(а):да ладно и что оно делает ?
Нет ну серьёзно работает, незнаю как но работает))) цепляю ,протеус и прошивку, посмотри:
01.rar
Протеус, прошивка
(20.53 КБ) 178 скачиваний

Re: Регулировка временных задержек подстроечным резистором??

Добавлено: Ср апр 02, 2014 22:09:48
sanyo.95
Ну как, работает?

Re: Регулировка временных задержек подстроечным резистором??

Добавлено: Чт апр 03, 2014 09:56:16
Morroc
не пробовал, но там дважды одно значение считывается и каналы АЦП не переключаются - работать то может и работает, только длительность 0 и 1 таким кодом должна регулироваться одновременно одним резистором

Re: Регулировка временных задержек подстроечным резистором??

Добавлено: Сб апр 05, 2014 11:09:27
sanyo.95
Вот почитал про фюзы, и понял что для этой схемы ничего не надо трогать. Исправте мненя, если это не так.

Re: Регулировка временных задержек подстроечным резистором??

Добавлено: Вт апр 08, 2014 17:01:07
sanyo.95
Извините пожалуйста. Пришлось немного переделать данную программу. Суть такова: если тумблер включен то на определенный промежуток времени включается 1е реле(время его работы регулируется подстроечным резистором) а уже за ним включается 2е реле(время работы и время простоя регулируется подстроечными резисторами). "Написал" код( с вашей помощью), собрал, прошил - работает. Но проблема заключается в том, что программа выполняется только один раз(один цикл). Очень надеюсь на Вашу помощь. Выкладываю код:

#include <mega8.h>
#include <delay.h>

void main(void)
{
int r;
int t;
int w;
SFIOR=0x00;
ADCSR=0x85;

PORTB=0x00;
DDRB=0x1;

PORTB=0x02;
DDRB=0x03;


while (1)
{
//замер по ноге 00
ADMUX=0;
delay_us(10); // ждем после переключения
ADCSR |=0x40;
while((ADCSRA & 0x10)==0);
ADCSRA|=0x10; // устанавливаем ADIF
w=ADCW;

//замер по ноге 01
ADMUX=1;
delay_us(10); // ждем после переключения
ADCSR |=0x40;
while((ADCSRA & 0x10)==0);
ADCSRA|=0x10; // устанавливаем ADIF
r=ADCW;

//замер по ноге 02
ADMUX=2;
delay_us(10); // ждем после переключения
ADCSR |=0x40;
while((ADCSRA & 0x10)==0);
ADCSRA|=0x10; // устанавливаем ADIF
t=ADCW;


if(PINB.2==0) // если тумблер замкнут на 0
{
PORTB.1=1;
delay_ms(20*w); // на ножку РВ1 на время (20*w) подать 1, после отключения РВ1, выполнить следующее:
PORTB.1=0;
}
PORTB.0=1;
delay_ms(20*t);
PORTB.0=0;
delay_ms(20*r);
}
};

Если тумблер замкнут на 1, то выполняться должен только этот цикл:
РORTB.0=1;
delay_ms(20*t);
PORTB.0=0;
delay_ms(20*r);

В Proteus работает, вроде как надо. На реальном устройстве выполняется только раз.

Посмотрите пожалуйста код и посмотрите что не так?

Re: Регулировка временных задержек подстроечным резистором??

Добавлено: Вт апр 08, 2014 18:00:03
Morroc
а без строчки delay_ms(20*w); работает ?

Re: Регулировка временных задержек подстроечным резистором??

Добавлено: Вт апр 08, 2014 18:14:34
sanyo.95
Morroc писал(а):а без строчки delay_ms(20*w); работает ?
Так если я её уберу реле же мгновенно переключиться и всё?
Не могу чего-то скомпилировать пишет "Linker error: the program has no 'main' function"...