Портал для радиолюбителей и разработчиков электроники · с 2003 годаРеклама на сайте
Найти компонент, схему или даташит

Даташиты, справочник отечественных приборов, схемы с разбором и живой форум

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

 
Опции темы

Помогите начинающему по ATmega8515

Непрочитано 16.12.2011, 08:19  
roma9112
Гражданин KAZUS.RUN
 
Регистрация: 25.11.2008
Адрес: Волгоград
Сообщений: 507
Сказал спасибо: 42
Сказали Спасибо 49 раз(а) в 46 сообщении(ях)
roma9112 на пути к лучшему
По умолчанию Re: Помогите начинающему по ATmega8515

Сообщение от DAVE_ELEKTRIK Посмотреть сообщение
Так всеж-таки не пойму почему нужно ставить задержку после выполнения чего либо, а не сразу после отжатия кнопки - задержка, а потом выполнения чего не будь и вернуться опять к отслеживанию!? В принципе Я так понимаю не только для дребезга, не могу до конца вкурить.
Может Вы просто такой пример взяли, а может так и надо делать(я тут не особо спец), но я, когда часы делал, задержку на нажатие и сразу после отжатия намного меньше(ок 50мС) ставил - от дребезга, а вот после выполнения обработки нажатия пауз не ставил - потом ведь стоит опять задержка на нажатие.
Реклама:
roma9112 вне форума  
Непрочитано 16.12.2011, 08:26  
DAVE_ELEKTRIK
Прописка
 
Аватар для DAVE_ELEKTRIK
 
Регистрация: 18.10.2010
Адрес: Planet Earth )
Сообщений: 120
Сказал спасибо: 14
Сказали Спасибо 11 раз(а) в 11 сообщении(ях)
DAVE_ELEKTRIK на пути к лучшему
По умолчанию Re: Помогите начинающему по ATmega8515

Сообщение от roma9112 Посмотреть сообщение
задержку на нажатие и сразу после отжатия намного меньше(ок 50мС) ставил - от дребезга
Длительность паузы можно подобрать опытным путем, это понятно, но вопрос заключается в другом почему так, а не по другому. В чем секрет успеха?
__________________
Мозги кипят, ядрить твою валентность!!! Пойду закладывать остальные ингредиенты...
DAVE_ELEKTRIK вне форума  
Непрочитано 16.12.2011, 10:00  
alvadep
Почётный гражданин KAZUS.RUN
 
Регистрация: 05.05.2011
Адрес: Харьков
Сообщений: 5,042
Сказал спасибо: 589
Сказали Спасибо 3,967 раз(а) в 1,825 сообщении(ях)
alvadep на пути к лучшему
По умолчанию Re: Помогите начинающему по ATmega8515

Алгоритм не корректно написан вот почему.
Цитата:
sbis PinD,2 ; пропустить, если отпущена
rjmp Pincykle ; вернуться обратно, если нажата
Если отпускание кнопки произойдет в момент перехода на метку Pincykle, то у Вас не произойдет увеличение счетчика по этому нажатию. Хотя как раз дребезг в этом случае будет на пользу (при дребезге существует большая вероятность, что счетчик таки увеличится).

Правилнее было бы так (проверять только отжатие).
Цитата:
sbis PinD,2 ; пропустить, если отпущена
rjmp Pin_release ; вернуться обратно, если нажата
alvadep вне форума  
Непрочитано 17.12.2011, 03:19  
DAVE_ELEKTRIK
Прописка
 
Аватар для DAVE_ELEKTRIK
 
Регистрация: 18.10.2010
Адрес: Planet Earth )
Сообщений: 120
Сказал спасибо: 14
Сказали Спасибо 11 раз(а) в 11 сообщении(ях)
DAVE_ELEKTRIK на пути к лучшему
По умолчанию Re: Помогите начинающему по ATmega8515

Сообщение от alvadep Посмотреть сообщение
Алгоритм не корректно написан вот почему.
Согласен, алгоритм исправил. Но вопрос остался тот-же.
Принцип программы рекомендован Ю. Ревич
__________________
Мозги кипят, ядрить твою валентность!!! Пойду закладывать остальные ингредиенты...

Последний раз редактировалось DAVE_ELEKTRIK; 17.12.2011 в 03:56.
DAVE_ELEKTRIK вне форума  
Непрочитано 17.12.2011, 11:06  
alvadep
Почётный гражданин KAZUS.RUN
 
Регистрация: 05.05.2011
Адрес: Харьков
Сообщений: 5,042
Сказал спасибо: 589
Сказали Спасибо 3,967 раз(а) в 1,825 сообщении(ях)
alvadep на пути к лучшему
По умолчанию Re: Помогите начинающему по ATmega8515

Сообщение от DAVE_ELEKTRIK Посмотреть сообщение
Так всеж-таки не пойму почему нужно ставить задержку после выполнения чего либо, а не сразу после отжатия кнопки - задержка, а потом выполнения чего не будь и вернуться опять к отслеживанию!? В моем случае это увеличения счетчика и вывод его в порт. В принципе Я так понимаю не только для дребезга, не могу до конца вкурить.
Логика здесь простая. Если какое-то действие (процедура) выполняется по какому-то условию, то выполнять это действие нужно сразу по выполнению условия без задержек (если задержки не предусмотрены для чего-то другого).
Дребезг это уже следствие нажатия/отпускания кнопки, поэтому надо, сначала выполнить то, что предусматривает условие, а потом бороться с дребезгом, если это еще будет нужно. Ведь длительность выполнения процедуры вполне может быть соизмерима с задержкой для устранения дребезга и тогда принудительную задержку вообще можно не делать.
alvadep вне форума  
Сказали "Спасибо" alvadep
ascerdfg (17.12.2011)
Непрочитано 17.12.2011, 19:16  
DAVE_ELEKTRIK
Прописка
 
Аватар для DAVE_ELEKTRIK
 
Регистрация: 18.10.2010
Адрес: Planet Earth )
Сообщений: 120
Сказал спасибо: 14
Сказали Спасибо 11 раз(а) в 11 сообщении(ях)
DAVE_ELEKTRIK на пути к лучшему
По умолчанию Re: Помогите начинающему по ATmega8515

Сообщение от alvadep Посмотреть сообщение
Если какое-то действие (процедура) выполняется по какому-то условию, то выполнять это действие нужно сразу по выполнению условия без задержек
Вот я и спрашивал зачем? Почему именно так? Задержки не предусмотрены для чего-то другого.

За дребезг я понял, можно дальше не рассказывать!

Обсудим вот это
Цитата:
А вот если нам нужно отлавливать нажатие кнопки, тогда, для достоверности, что это не случайный какой-то сигнал, нужно несколько раз выполнить опрос ножки. Если скажем 10 раз у нас показало, что на входе есть сигнал, значит можно с уверенностью сказать, что кнопка нажата. А задержка после нажатия кнопки или после отпускания я так думаю нужна лиш для того, что-бы ты пока идет задержка, успел за это время отпустить кнопку, что-бы повторно не выполнялась программа, которая выполняется при нажатии кнопки. А больше никаких задержек нигде мне кажется делать не нужно, если это только не нужно по логике программы.
__________________
Мозги кипят, ядрить твою валентность!!! Пойду закладывать остальные ингредиенты...
DAVE_ELEKTRIK вне форума  
Непрочитано 17.12.2011, 20:52  
roma9112
Гражданин KAZUS.RUN
 
Регистрация: 25.11.2008
Адрес: Волгоград
Сообщений: 507
Сказал спасибо: 42
Сказали Спасибо 49 раз(а) в 46 сообщении(ях)
roma9112 на пути к лучшему
По умолчанию Re: Помогите начинающему по ATmega8515

Сообщение от DAVE_ELEKTRIK Посмотреть сообщение
А вот если нам нужно отлавливать нажатие кнопки, тогда, для достоверности, что это не случайный какой-то сигнал, нужно несколько раз выполнить опрос ножки. Если скажем 10 раз у нас показало, что на входе есть сигнал, значит можно с уверенностью сказать, что кнопка нажата. А задержка после нажатия кнопки или после отпускания я так думаю нужна лиш для того, что-бы ты пока идет задержка, успел за это время отпустить кнопку, что-бы повторно не выполнялась программа, которая выполняется при нажатии кнопки. А больше никаких задержек нигде мне кажется делать не нужно, если это только не нужно по логике программы.
Не знаю, но по моему, немного не так - зачем 10 раз опрашивать и задержка на отпускание? Как успеть отпустить кнопку, оговаривать в инструкции скорость реакции человека? Мы же должны среагировать на событие нажатия кнопки - т.е. увидели нажатие - запустили таймер, с целью уйти от импульсных помех, после отработки таймера проверяем - кнопка еще нажата или нет. Если нужно однократное реагирование просто ждем отпускания с таймером от дребезга и последующей проверкой что кнопка отжата что-то делаем, если неоднократно, то что-то сделав, проверяем нажата ли и далее опять что-то делаем и т.д. Я думаю так.
roma9112 вне форума  
Непрочитано 18.12.2011, 14:48  
roma9112
Гражданин KAZUS.RUN
 
Регистрация: 25.11.2008
Адрес: Волгоград
Сообщений: 507
Сказал спасибо: 42
Сказали Спасибо 49 раз(а) в 46 сообщении(ях)
roma9112 на пути к лучшему
По умолчанию Re: Помогите начинающему по ATmega8515

Я вот со своей прогой приемника ДУ замучался, уже опять на Тини13 переделал,а когда более детально симуляцию прогнал, то вообще впал в недоумение. Когда контроллеру разрешено прерывание, в регистре статуса висит флаг I. Так вот когда у меня идет обработка ISR(TIM0_OVF_vect) флаг по нормальному сбрасывается, считаем тики и если больше 600 - выполняем операции, удачно зависаем, и видим - флаг I то появился! Т.е. прерывание считается обработанным! Если в этот момент я искусственно в симуляторе вызову внешнее прерывание, то МК уходит на его обработку - сюда ISR(INT0_vect). Но мне то надо, чтобы он ушел в этот кусок -
while(paket==0)
{
PORTB|=(1‹‹PB4); //включаем приемник
_delay_ms(300); //задержка 300мС
if(paket==0)
{
PORTB&=(~(1‹‹PB4)); //отключаем питание приемника
_delay_ms(700); //задержка 700мС
}
else {PORTB|=(1‹‹PB4);} //включаем приемник

}

Подскажите кто-нибудь как это все-таки исправить?

Почему то с утра не могу ничего подгрузить на форум попробую всатвить весь текст

/************************************************** ***
Chip type : ATtiny13
Program type : Application
Clock frequency : 4,800000 MHz
************************************************** ***/
#include ‹avr/io.h›
#include ‹avr/iotn13.h›
#include ‹util/delay.h›
#include ‹avr/interrupt.h›
#define F_CPU 4800000UL //тактовая частота МК


unsigned int tick = 0; //счетчик тиков таймера
unsigned char b_cnt = 0; //счетчик принятых бит
unsigned char start_cond = 0; //флаг стартового условия
unsigned char repeat_cond = 0; //флаг повтора
unsigned long cod = 0; //байт полученного кода валидности
unsigned long cod_valid=0x800e; //байт установленного кода валидности
unsigned long cod_2 = 0; //байт полученного кода валидности
unsigned long cod_1 = 0; //байт полученного кода валидности
unsigned long cod_cod = 0; //байт проверенного кода валидности
volatile unsigned char paket=0; //признак начала приема посылки


int main(void)
{
// Declare your local variables here


// Port B initialization
// Func5=Out Func4=Out Func3=Out Func2=Out Func1=In Func0=Out
// State5=0 State4=0 State3=0 State2=0 State1=0 State0=0
PORTB=0x00;
DDRB=0x3D;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Mode: Normal top=FFh
// OC0 output: Disconnected
TCCR0A=0x00;
TCCR0B=0x00;
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x00;


// External Interrupt(s) initialization
// INT: On
// INT Mode: Falling Edge
MCUCR=0x02;
GIMSK=0x40;
PCMSK=0x00;
GIFR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK0=0x02;


// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
//ACSR=0x80;
//SFIOR=0x00;

sei();

while(paket==0)
{
PORTB|=(1‹‹PB4); //включаем приемник
_delay_ms(300); //задержка 300мС
if(paket==0)
{
PORTB&=(~(1‹‹PB4)); //отключаем питание приемника
_delay_ms(700); //задержка 700мС
}
else {PORTB|=(1‹‹PB4);} //включаем приемник

}


}

// External Interrupt 0 service routine
ISR(INT0_vect)
{
PORTB|=(1‹‹PB4); // для надежности опять включаем приемник
paket=1; // устанавливаем признак начала обработки посылки
MCUCR^=(1‹‹ISC00); // меняем работу внешнего прерывания на срез
TCNT0=0xFE; //запускаем таймер
TCCR0B=2; //к-т деления тактовой для таймера 8

if (tick›=240 && tick‹450) //если случилось от 110 до 135 тиков
{
start_cond = 1; //фиксируем стартовое условие - как-бы сарт-бит
cod = 0; //обнуляем ранее полученный код
}

if (tick ›= 33 && tick ‹ 44 && start_cond) //если случилось от 14 до 20 тиков
{
++b_cnt; //приняли "1" и увеличили счетчик битов
cod = (cod ‹‹ 1) + 1; // пишем единицу в код
PORTB^=(1‹‹PB2);
}
if (tick ›= 12 && tick ‹ 21 && start_cond) //если случилось от 5 до 9 тиков
{
++b_cnt; //приняли "0" и увеличили счетчик битов
cod = (cod ‹‹ 1); //далее - аналогично по битам
PORTB^=(1‹‹PB3);
}
tick = 0; //обнулили тики
if (b_cnt == 25) //если приняли уже все 25 бит
{
b_cnt = 0; //обнулили счетчик битов
start_cond = 0; //сбросили стартовое условие
TCCR0B=0x00; //остановили таймер
TCNT0=0x00;
paket=0;
MCUCR=0x02;
if (cod==cod_valid)
{
PORTB|=(1‹‹PB0); //если принятый код равен коду проверки, включаем...
}
}
}



// Timer 0 overflow interrupt service routine
ISR(TIM0_OVF_vect)
{
if(paket==1)
{
TCNT0=0xFE; //переинициализировали таймер
}
if (++tick › 600) //если насчитали более 600 тиков
{
TCCR0B=0x00; //сбросили все к исходному состоянию
TCNT0=0x00;
tick = 0;
start_cond = 0;
paket=0;
MCUCR=0x02; //настраиваем внешнее прерывание по фронту сигнала
} //для измерения длительности сигнала
}
roma9112 вне форума  
Непрочитано 20.12.2011, 10:43  
pinco
Гражданин KAZUS.RUN
 
Регистрация: 04.04.2007
Сообщений: 937
Сказал спасибо: 571
Сказали Спасибо 113 раз(а) в 85 сообщении(ях)
pinco на пути к лучшему
По умолчанию Re: Помогите начинающему по ATmega8515

Сообщение от roma9112 Посмотреть сообщение
...Мы же должны среагировать на событие нажатия кнопки - т.е. увидели нажатие - запустили таймер, с целью уйти от импульсных помех, после отработки таймера проверяем - кнопка еще нажата или нет. Если нужно однократное реагирование просто ждем отпускания с таймером от дребезга и последующей проверкой что кнопка отжата что-то делаем, если неоднократно,...
Дребезг в кнопке обычно прекращается после 10-15 мс точно , так что выдержка его 20мс или чуть более 30 например вполне достаточно , и можно не ждать больше . Теперь о том почему стоит задержка до и задержка - после - , до стоит для того чтобы когда контроллер первый самый раз обнаруживает нажатие кнопки то он должен удостоверится что она действительно нажата , а не случайно , поэтому выжидается 20 мс и еще раз проверяется нажатие кнопки - если нажата то действительно нажата и можно только тогда выполнять действие , а не сразу же после первого-го же нажатия а после ждем с проверкой на нажатие как у автора поста выше ,затем после выполнения действия зная что кнопка нажата - ждем в цикле теперь когда она отожмется - и когда обнаружили отжатие то здесь тоже выжидаем те же 20 мс или побольше - тоже для успокоения дребезга но уже для надежного обнаружения что именно отжата кнопка , ну и затем уже со спокойной совестью чтобы перейти контороллеру в исходное ожидание следующего нажатия кнопки , и так далее .Этот алгоритм надежнее всего ,кто-то предпочитает вместо выдержки 20 мс по 10 раз опрашивать кнопку -это менее надежно чем выдержка потому что во время этих 10 опросов каждый раз неизвестно в дребезге сколько раз окажется замкнутой и сколько раз разомкнутой кнопка , а также лишние команды опроса кнопки . Так что для обнаружения надежного нажатия и надежного отпуска - учтите что и именно надежный отпуск тоже надо без дребезга регистрировать , а не просто отпуск по первому же его обнаружению - тогда и будет полностью устойчивая и надежная сработка Вашего устройства от такой кнопки .
__________________
Короче асма кода нет !
pinco вне форума  
Непрочитано 20.12.2011, 11:03  
OlegNZH
Почётный гражданин KAZUS.RUN
 
Регистрация: 28.02.2010
Сообщений: 2,294
Сказал спасибо: 52
Сказали Спасибо 460 раз(а) в 391 сообщении(ях)
OlegNZH на пути к лучшему
По умолчанию Re: Помогите начинающему по ATmega8515

Забывается немаловажный фактор - ПРИ НАЖАТИИ ДОЛЖНО ЧТО-ТО ИЗМЕНИТЬСЯ ВИЗУАЛЬНО(допустим- цИфирька перескочить) - если на отжатие работать- коряво всё выглядит,хотя проще.Т.е. два события нужно обрабатывать- Нажатие ,достоверность,Решение,зат� �м повторы исключить(или наоборот -задействовать),Отжатие.
OlegNZH вне форума  
 
Опции темы

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

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

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

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите начинающему (PIC16F84A). Slava-martyn Микроконтроллеры, АЦП, память и т.д 11 09.09.2010 21:55
помогите начинающему по WinAVR umkamaks Микроконтроллеры, АЦП, память и т.д 4 05.05.2010 21:01
Помогите начинающему! kolira Микроконтроллеры, АЦП, память и т.д 6 30.01.2010 15:22
Помогите советом начинающему eler Делимся опытом 100 11.09.2008 17:28
Помогите начинающему!!!! sma-etu Микроконтроллеры, АЦП, память и т.д 2 13.12.2006 18:31


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


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.