Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
15.05.2007, 17:49
|
#21
|
Частый гость
Регистрация: 24.04.2007
Сообщений: 29
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
скачал книжку Евстифеева "микроконтроллеры AVR семейства мега", просвящаюсь.
Но поскольку в программировании полный ноль прошу помочь в следующем:
Хочу сделать реле времени на ATmega16 с установкой времени срабатывания переключателями + повесить один семисегментный индикатор для отображения установленной задержки срабатывания. Время задается дискретно с шагом 1 секунда от 1 секунды до 9 секунд (нужно 3 кнопки). Понимаю, что прога будет несложная настрочите плиз код на С (применяю CodeVision+VMlab) посмотреть, как надо писать проги.
Заранее спасибо!
|
|
|
|
15.05.2007, 18:01
|
#22
|
Вид на жительство
Регистрация: 22.06.2006
Адрес: Украина
Сообщений: 308
Сказал спасибо: 19
Сказали Спасибо 32 раз(а) в 24 сообщении(ях)
|
Пробуем восстановить задачу и решить ее.
ДАНО: два светодиода и две кнопки.
Светодиоды должны "перемигиваться".
КН1 - разрешение моргания (нажато-моргаем, отпущено-не моргаем и не горим вообще)
КН2 - режим моргания (нажато - увеличивать частоту моргания, отпущено - с текущей частотой)
Оговорка. При достижении макс. частоты моргания нужно опять скинуться на минимальную.
Пробуем посторить алгоритм
Код:
|
var ЗАДЕРЖКА - переменная с значением задержки
ЦИКЛ_ОСНОВНОЙ НАЧАЛО
ЕСЛИ КН1-нажато
TO НАЧАЛО
ЕСЛИ КН2-нажато
ТО ЗАДЕРЖКА ++ //Увеличит задержку //сюда приходим, если КН1-нажато И КН2-нажато
СД1-зажечь //Дальше идет орг. моргания... сюда приходим если КН1-нажато ... а КН2 - нам тут пофиг ... моргать то нужно
СД2-потушить
ЖДАТЬ(ЗАДЕРЖКА)
СД1-потушить
СД2-зажечь //... конец орг. моргания
КОНЕЦ //КН1-нажато
ИНАЧЕ НАЧАЛО//кн1-отпущена
СД1-потушить
СД2-потушить
КОНЕЦ // иначе "кн1-отпущена"
ЦИКЛ_ОСНОВНОЙ КОНЕЦ |
Вот .. примерно так ... другими словами... если КН1 нажато, то моргаем и можем глянуть на КН2 ... иначе всё тушим.
Глянем на КН2 - это
"Если КН2 нажали, то задержку увеличим."
Всё.
|
|
|
|
15.05.2007, 18:06
|
#23
|
Частый гость
Регистрация: 24.04.2007
Сообщений: 29
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
AndryG!
Вы совершенно правильно поняли задачу. Сейчас попробую набросать прогу в СV по Вашему алгоритму.
|
|
|
|
15.05.2007, 18:11
|
#24
|
Вид на жительство
Регистрация: 22.06.2006
Адрес: Украина
Сообщений: 308
Сказал спасибо: 19
Сказали Спасибо 32 раз(а) в 24 сообщении(ях)
|
Если Вы хотите сделать реле времени, то Вы и делайте .. а "код строчить" ... э то уже не Вы, а Мы сделаем
Перед тем, как писать код ... нужен АЛГОРИТМ !!!
Я, обычно, пишу так ...
Сперва делаю маааленькие подпрограммки, которые работаю с железом ... вывод числа на индикатор, опрос кнопок, отсчет времени ... и т.д.
Потом придумываю алгоритм основной задачи ... что делать при нажатии кнопки, когда и что выводить на индикатор и т.д. ... а потом уже сажусь писать код.
Вам надобно сперва АЛГОРИТМ разработать .. а потом уже код писать ... тогда он и напишется просто и легко!
Берете бумагу и начинаете рисовать блок-схемы ... "по нажатию кнопки SET идем в режим настроек ... Если нажали ПЛЮС и текущий режим настроек - увеличить время задержки .... если задержка равна нулю, то подать сигнал .... на экран вывести текущую задержку " и т.д. и т.п.
Одно маленькое правило с своего опыта: "Время отладки программы обратно пропорционально квадрату времени обдумывания алгоритма"
Вот так ... так-что ждем для обсуждения сперва АЛГОРИТМ ... а потом уже код.
|
|
|
|
15.05.2007, 18:24
|
#25
|
Вид на жительство
Регистрация: 22.06.2006
Адрес: Украина
Сообщений: 308
Сказал спасибо: 19
Сказали Спасибо 32 раз(а) в 24 сообщении(ях)
|
Сообщение от idmg
|
AndryG!
Вы совершенно правильно поняли задачу. Сейчас попробую набросать прогу в СV по Вашему алгоритму.
|
Прочтите мой пост выше ... НЕ ВЕРЬТЕ МНЕ!!! Докажите сперва СЕБЕ, что моим словам можно верить, а доказательства ищутся в книгах, даташитах. здравом смысле
Не пишите код по МОЕМУ алгоритму ... напишите СВОЙ!!!
Неделю назад я разбирался с алгоритмом Брезенхама ... в руках был с Сети исходник красивый и куча доков ... читая доки и смотря на код я написал ... вывел, написал свой код ... 2-е капли воды похож на пример с Сети ... но зато в своем я разобрался от а до я ... хотя пример из Сети такой не понятный
|
|
|
|
15.05.2007, 18:31
|
#26
|
Частый гость
Регистрация: 24.04.2007
Сообщений: 29
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
AndryG!
Спасибо за дельные советы. Сейчас САМ =) пишу алгоритм для реле времени.
|
|
|
|
15.05.2007, 22:16
|
#27
|
Частый гость
Регистрация: 24.04.2007
Сообщений: 29
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
AndryG и avr123.nm.ru помогайте!
Написал программу по-новому:
#include ‹mega16.h›
#include ‹delay.h›
eeprom unsigned char ctr=10;
void main(void)
{MCUCSR=0xF0; MCUCSR=0xF0;
PORTA=0xFF;
DDRA=0x04;
PORTB=0xFF;
DDRB=0x04;
PORTC=0xFF;
DDRC=0x02;
PORTD=0xFF;
DDRD=0x02;
while (1)
{
if (PIND.3==0){
PORTA.2=0; if (ctr›=245) {PORTB.2=0;} else {PORTB.2=1;}
if (PINC.5==0){
ctr=ctr+5;
PORTC.1=0; PORTD.1=1;
delay_ms(ctr);
PORTC.1=1; PORTD.1=0;
delay_ms(ctr); if (ctr›=245) {PORTB.2=0;} else{PORTB.2=1;}}
else
{PORTC.1=0; PORTD.1=1;
delay_ms(ctr);
PORTC.1=1; PORTD.1=0;
delay_ms(ctr); if (ctr›=245) {PORTB.2=0;} else{PORTB.2=1;}}}
else {
PORTA.2=1; PORTB.2=1; PORTC.1=1; PORTD.1=1;
}}}
Все работает как нужно, НО... по порядку:
1. залил прогу в мк (программатор stk200/300)
2. программа выполняется четко по алгоритму (кнопка PD3 не нажата - диоды не горят; включаем PD3 - диоды мигают с паузой 10ms, заданной по умолчанию; нажимаем кнопку РС5 пауза увеличивается ;если пауза больше 245ms - загорается PB2).
но если оставить мк работать по программе и не трогать его диоды мигают с заданной паузой, но потом пауза увеличивается скачком.
WDT не включен, при симуляции в VMlab прога ведет себя также. Возможно надо смотреть файл delay.h, и еще как организовать long delay например 1 секунду , 1 час 1 неделя и т.д. Читал апноут об этом деле нифига не понял.
если интересно фотка платы
-- Прилагается рисунок: --
|
|
|
|
15.05.2007, 23:37
|
#28
|
Почётный гражданин KAZUS.RU
Регистрация: 06.02.2007
Сообщений: 1,340
Сказал спасибо: 3
Сказали Спасибо 106 раз(а) в 66 сообщении(ях)
|
возможно, опять не в тему.. Но мне кажется, что в функцию delay передается не чар, а инт. А если обозначить unsigned int str ? Может быть, фунция цепляет рядом стоящий байт ?
|
|
|
|
16.05.2007, 02:01
|
#29
|
Почётный гражданин KAZUS.RU
Регистрация: 13.05.2006
Адрес: Москва
Сообщений: 3,559
Сказал спасибо: 76
Сказали Спасибо 326 раз(а) в 230 сообщении(ях)
|
Сообщение от idmg
|
при симуляции в VMlab прога ведет себя также.
|
Дак вы смотрите в симуляторе когда увеличение происходит что с прогой, где она шагает и какие числа в регистрах.
Сообщение от idmg
|
как организовать long delay например 1 секунду , 1 час 1 неделя и т.д.
|
в delay_ms() можно большие числа подставлять и можно вызывать многократно в циклах типа while for
-- Прилагается рисунок: --
__________________
Обучалка AVR PIC ARM начинающим программирование курс самоучитель шаг за шагом с нуля, CVAVR, PROTEUS, MPLAB, WinAVR, IAR, KEIL электроника - http://proavr.narod.ru
|
|
|
|
16.05.2007, 10:25
|
#30
|
Вид на жительство
Регистрация: 22.06.2006
Адрес: Украина
Сообщений: 308
Сказал спасибо: 19
Сказали Спасибо 32 раз(а) в 24 сообщении(ях)
|
1. Учитесь оформлять код нормально - трудно читать!
2. Опять не ясно ... для чего в разных местах задержки стоят.
3. if (245)**** -- Какого они три раза в программе встречаются? Что Вы хотите этим кодом сделать?
Словами опишите.
4. Зачем перменная в EEPROM ? При записи тудыть значения идет времячко ... и чтение не одним словом происходит ... возможно получается глюк с этими задержками работы с переменной. Посмотрите код ... переменная в ЕЕПРОМ и Вы инициализируете ее в начале кода ... получается, что при включении пофиг что там было раньше - опять перепишет значение старое и поставит ваши 10... получается от еепром никакого толку (хотя может cvavr и не инициализирует переменные еепром ... уточнить нужно)
На неделю задержку ... я бы поставил прерывание по таймеру на 1 сек (например) и в нем бы отсчитывал к-во секунд в неделе.
На скору руку глянул код ... по идее Вы проверкой if(245) хотите, чтобы диод показывал значение переменной НЕЗАВИСИМО от того моргаем мы или нет... Один из способов оптимизации алгоритмов учат еще в третьем классе ... называется "вынесение за скобки"...
ЕСЛИ (245) не зависит от кнопки разрешения моргания ... значит и не нужно этот код в проверку кнопки ставить... а Вы написали этот кусок и там и сям ... оно то работает ... но это некрасиво!
Код:
|
while (1)
{
if (PIND.3==0){
PORTA.2=0;
if (ctr›=245)
{PORTB.2=0;}
else {PORTB.2=1;}
if (PINC.5==0){
ctr=ctr+5;
PORTC.1=0; PORTD.1=1;
delay_ms(ctr);
PORTC.1=1; PORTD.1=0;
delay_ms(ctr);
if (ctr›=245)
{PORTB.2=0;}
else{PORTB.2=1;}
}// if PC5
else
{PORTC.1=0; PORTD.1=1;
delay_ms(ctr);
PORTC.1=1; PORTD.1=0;
delay_ms(ctr);
if (ctr›=245)
{PORTB.2=0;}
else
{PORTB.2=1;}
} //else PC5
} //if PD3
else {
PORTA.2=1; PORTB.2=1; PORTC.1=1; PORTD.1=1;}
}// else PD3
}// while |
Вот так НЕМНОГО лучше - код тот же ... но теперь читабельней
Код:
|
if (ctr›=245)
{PORTB.2=0;}
else {PORTB.2=1;} |
ТРИ РАЗА ВСТРЕЧАЕТСЯ!
ПРИ
КН1 нажато,
КН1 нажато и КН2 отжато,
КН1 нажато и КН2 отжато.
"КН1 нажато" выносим "за скобки" - ставим перед IF(PC5)
Код:
|
PORTC.1=0; PORTD.1=1;
delay_ms(ctr);
PORTC.1=1; PORTD.1=0;
delay_ms(ctr); |
Аналогично. Попробуйте ПО Вашему КОДУ посторить алгоритм - увидите свои ошибки.
Теперь попробуем немного ужать ...
Код:
|
while (1)
{
if (PIND.3==0){ //КН1 нажато - моргаем и вкл. индикатор "245"
PORTA.2=0; // Я так понял это индикатор "МОЖНО МОРГАТЬ"
if (PINC.5==0) //КН2 - нажато - изменить задержку!
ctr=ctr+5;
if (ctr›=245) //По задержке выставить индикатор "245"
PORTB.2=0;
else
PORTB.2=1;
PORTC.1=0; PORTD.1=1; //МОРГАЕМ!!!
delay_ms(ctr);
PORTC.1=1; PORTD.1=0;
delay_ms(ctr);
} //if PD3
else { // КН1 - отжато
PORTA.2=1; //ГАСИМ ВСЁ
PORTB.2=1;
PORTC.1=1;
PORTD.1=1;
} //else PD3
}// while |
Вот это реализация алгоритма, который я Вам писал ... теперь и ошибку Вашу поискать можно с морганием ... я думаю, что это глюк ЕЕПРОМ переменной при CRT -› 0
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 16:59.
|
|