Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

Закрытая тема
Опции темы
Непрочитано 15.05.2007, 17:49   #21
idmg
Частый гость
 
Регистрация: 24.04.2007
Сообщений: 29
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
idmg на пути к лучшему
По умолчанию

скачал книжку Евстифеева "микроконтроллеры AVR семейства мега", просвящаюсь.
Но поскольку в программировании полный ноль прошу помочь в следующем:
Хочу сделать реле времени на ATmega16 с установкой времени срабатывания переключателями + повесить один семисегментный индикатор для отображения установленной задержки срабатывания. Время задается дискретно с шагом 1 секунда от 1 секунды до 9 секунд (нужно 3 кнопки). Понимаю, что прога будет несложная настрочите плиз код на С (применяю CodeVision+VMlab) посмотреть, как надо писать проги.
Заранее спасибо!
Реклама:
idmg вне форума  
Непрочитано 15.05.2007, 18:01   #22
AndryG
Вид на жительство
 
Регистрация: 22.06.2006
Адрес: Украина
Сообщений: 308
Сказал спасибо: 19
Сказали Спасибо 32 раз(а) в 24 сообщении(ях)
AndryG на пути к лучшему
По умолчанию

Пробуем восстановить задачу и решить ее.
ДАНО: два светодиода и две кнопки.
Светодиоды должны "перемигиваться".
КН1 - разрешение моргания (нажато-моргаем, отпущено-не моргаем и не горим вообще)
КН2 - режим моргания (нажато - увеличивать частоту моргания, отпущено - с текущей частотой)
Оговорка. При достижении макс. частоты моргания нужно опять скинуться на минимальную.

Пробуем посторить алгоритм
Код:
 var ЗАДЕРЖКА - переменная с значением задержки
 
 ЦИКЛ_ОСНОВНОЙ НАЧАЛО
  ЕСЛИ КН1-нажато
   TO НАЧАЛО
     ЕСЛИ КН2-нажато  
       ТО ЗАДЕРЖКА ++ //Увеличит задержку //сюда приходим, если КН1-нажато И КН2-нажато  
     СД1-зажечь //Дальше идет орг. моргания... сюда приходим если КН1-нажато ... а КН2 - нам тут пофиг ... моргать то нужно 
     СД2-потушить
     ЖДАТЬ(ЗАДЕРЖКА)
     СД1-потушить
     СД2-зажечь  //... конец орг. моргания
   КОНЕЦ //КН1-нажато
   ИНАЧЕ НАЧАЛО//кн1-отпущена
    СД1-потушить
    СД2-потушить
   КОНЕЦ // иначе "кн1-отпущена"
  ЦИКЛ_ОСНОВНОЙ КОНЕЦ
Вот .. примерно так ... другими словами... если КН1 нажато, то моргаем и можем глянуть на КН2 ... иначе всё тушим.
Глянем на КН2 - это
"Если КН2 нажали, то задержку увеличим."

Всё.
AndryG вне форума  
Непрочитано 15.05.2007, 18:06   #23
idmg
Частый гость
 
Регистрация: 24.04.2007
Сообщений: 29
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
idmg на пути к лучшему
По умолчанию

AndryG!
Вы совершенно правильно поняли задачу. Сейчас попробую набросать прогу в СV по Вашему алгоритму.
idmg вне форума  
Непрочитано 15.05.2007, 18:11   #24
AndryG
Вид на жительство
 
Регистрация: 22.06.2006
Адрес: Украина
Сообщений: 308
Сказал спасибо: 19
Сказали Спасибо 32 раз(а) в 24 сообщении(ях)
AndryG на пути к лучшему
По умолчанию

Если Вы хотите сделать реле времени, то Вы и делайте .. а "код строчить" ... э то уже не Вы, а Мы сделаем

Перед тем, как писать код ... нужен АЛГОРИТМ !!!
Я, обычно, пишу так ...
Сперва делаю маааленькие подпрограммки, которые работаю с железом ... вывод числа на индикатор, опрос кнопок, отсчет времени ... и т.д.
Потом придумываю алгоритм основной задачи ... что делать при нажатии кнопки, когда и что выводить на индикатор и т.д. ... а потом уже сажусь писать код.

Вам надобно сперва АЛГОРИТМ разработать .. а потом уже код писать ... тогда он и напишется просто и легко!
Берете бумагу и начинаете рисовать блок-схемы ... "по нажатию кнопки SET идем в режим настроек ... Если нажали ПЛЮС и текущий режим настроек - увеличить время задержки .... если задержка равна нулю, то подать сигнал .... на экран вывести текущую задержку " и т.д. и т.п.

Одно маленькое правило с своего опыта: "Время отладки программы обратно пропорционально квадрату времени обдумывания алгоритма"

Вот так ... так-что ждем для обсуждения сперва АЛГОРИТМ ... а потом уже код.
AndryG вне форума  
Непрочитано 15.05.2007, 18:24   #25
AndryG
Вид на жительство
 
Регистрация: 22.06.2006
Адрес: Украина
Сообщений: 308
Сказал спасибо: 19
Сказали Спасибо 32 раз(а) в 24 сообщении(ях)
AndryG на пути к лучшему
По умолчанию

Сообщение от idmg
AndryG!
Вы совершенно правильно поняли задачу. Сейчас попробую набросать прогу в СV по Вашему алгоритму.
Прочтите мой пост выше ... НЕ ВЕРЬТЕ МНЕ!!! Докажите сперва СЕБЕ, что моим словам можно верить, а доказательства ищутся в книгах, даташитах. здравом смысле
Не пишите код по МОЕМУ алгоритму ... напишите СВОЙ!!!

Неделю назад я разбирался с алгоритмом Брезенхама ... в руках был с Сети исходник красивый и куча доков ... читая доки и смотря на код я написал ... вывел, написал свой код ... 2-е капли воды похож на пример с Сети ... но зато в своем я разобрался от а до я ... хотя пример из Сети такой не понятный
AndryG вне форума  
Непрочитано 15.05.2007, 18:31   #26
idmg
Частый гость
 
Регистрация: 24.04.2007
Сообщений: 29
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
idmg на пути к лучшему
По умолчанию

AndryG!
Спасибо за дельные советы. Сейчас САМ =) пишу алгоритм для реле времени.
idmg вне форума  
Непрочитано 15.05.2007, 22:16   #27
idmg
Частый гость
 
Регистрация: 24.04.2007
Сообщений: 29
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
idmg на пути к лучшему
По умолчанию

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 неделя и т.д. Читал апноут об этом деле нифига не понял.
если интересно фотка платы

-- Прилагается рисунок: --

idmg вне форума  
Непрочитано 15.05.2007, 23:37   #28
urry
Почётный гражданин KAZUS.RU
 
Аватар для urry
 
Регистрация: 06.02.2007
Сообщений: 1,340
Сказал спасибо: 3
Сказали Спасибо 106 раз(а) в 66 сообщении(ях)
urry на пути к лучшему
По умолчанию

возможно, опять не в тему.. Но мне кажется, что в функцию delay передается не чар, а инт. А если обозначить unsigned int str ? Может быть, фунция цепляет рядом стоящий байт ?
urry вне форума  
Непрочитано 16.05.2007, 02:01   #29
avr123-nm-ru
Почётный гражданин KAZUS.RU
 
Регистрация: 13.05.2006
Адрес: Москва
Сообщений: 3,559
Сказал спасибо: 76
Сказали Спасибо 326 раз(а) в 230 сообщении(ях)
avr123-nm-ru на пути к лучшему
По умолчанию

Сообщение от 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
avr123-nm-ru вне форума  
Непрочитано 16.05.2007, 10:25   #30
AndryG
Вид на жительство
 
Регистрация: 22.06.2006
Адрес: Украина
Сообщений: 308
Сказал спасибо: 19
Сказали Спасибо 32 раз(а) в 24 сообщении(ях)
AndryG на пути к лучшему
По умолчанию

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
AndryG вне форума  
Закрытая тема

Закладки

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
помогите не испортить Atmega16 ESWANT Микроконтроллеры, АЦП, память и т.д 10 25.07.2009 15:16
помогите чайнику с программой igor9999 Микроконтроллеры, АЦП, память и т.д 2 14.02.2009 01:46
Помогите с программой к МК Daimonn Микроконтроллеры, АЦП, память и т.д 54 24.07.2008 10:27
АЦП - для чайника (помогите разобраться)! Apach111 Электроника - это просто 2 30.05.2008 10:10
Помогите разобраться с программой на PIC16F628 eslizh Микроконтроллеры, АЦП, память и т.д 17 04.12.2007 23:47


Часовой пояс GMT +4, время: 20:05.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot