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

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

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

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

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

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

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

Закрытая тема
Опции темы
Непрочитано 27.09.2014, 23:54   #1
AVRkin
Прописка
 
Аватар для AVRkin
 
Регистрация: 07.09.2014
Сообщений: 136
Сказал спасибо: 18
Сказали Спасибо 2 раз(а) в 2 сообщении(ях)
AVRkin на пути к лучшему
По умолчанию Работа с прерываниями (медленно работает)

платформа с 2 мотор редукторами и колёсами
управление с пульта
скорость
вперёд
назад
поворот

есть проблема

нужно чтоб действие по кнопке производилось только тогда, когда она нажата
наверно прерывание нужно , которое возникает при отпускании всех кнопок

кнопки скорости, при достижении предела начинают в обратную сторону работать
Нажмите на изображение для увеличения
Название: Снимок.JPG
Просмотров: 205
Размер:	129.4 Кб
ID:	69929
int.zip проект в протеусе и кодевижн
Код:
#include ‹mega8.h›
#include ‹delay.h›

// Обработчик прерываний________________________________________  ________________________________
interrupt[3] void ExtInt1(void) // Обработчик прерываний на int1 (Порт D, Тип 3 - по нисходящему фронту).
   {                  //код программы, срабатывающей по сигналу на int1.
                    
              
            if((PIND.0==0)&&(OCR2‹0xff))
            {
            OCR2=OCR2+0x1f;
            delay_ms(5);
            } 
    
            if((PIND.1==0)&&(OCR2›0x00))
            {
            OCR2=OCR2-0x1f;
            delay_ms(5);
            }
           
            if(PIND.2==0)
            {
            PORTB=0B10100000;
            delay_ms(1);
            }

            if(PIND.4==0)
            {
            PORTB=0B10010000;
            delay_ms(1);
            }  
            
            if(PIND.5==0)
            {
            PORTB=0B01100000;
            delay_ms(1);
            }   
            
            if(PIND.6==0)
            {
            PORTB=0B01010000;
            delay_ms(1);
            }
                 
   }                               

// Настройки портов и регистров_________________________________________  _________________________
void main(void)
{
DDRB=0b11111111;  // Выводы порта B настраиваем на выход (0-вход, 1-выход)
PORTB=0b00000000; //Обнуляем порт B до начала выполнения программы 

DDRD=0b00000000;  // Выводы порта D настраиваем как вход (0-вход, 1-выход)
PORTD=0b11111111; // Подключаем внутренние подтягивающие резисторы к выводам порта D  

GICR=0b10000000;  /* разрешает внешние прерывания*/ 

MCUCR=0b00001000; /* Регистр настраивает прерывание на срабатывание */

#asm("sei")   // или SREG |= (1‹‹7);  Status Register, 7 бит разрешает общие прерывания.


//шим
                    ASSR=0b00000000;  
                    TCCR2=0x6C;       //частота ШИМ. 
                    TCNT2=0b00000000;  
                    OCR2=0b00000000;  //величина заполнения импульса.
                    TIMSK=0b00000000;              


//Основная программа______________________________________
  while(1)
    {   // Код основной программы.      
    }   
}

в архиве старая версия
в
if((PIND.0==0)&&(OCR2‹0xff))
{
OCR2=OCR2+0x1f;
delay_ms(5);
}

if((PIND.1==0)&&(OCR2›0x00))
{
OCR2=OCR2-0x1f;
delay_ms(5);
}
значения маленькие
Реклама:
__________________
Самое главное умение - умение радоваться жизни.

Последний раз редактировалось AVRkin; 28.09.2014 в 00:57.
AVRkin вне форума  
Непрочитано 28.09.2014, 06:55   #2
niXto
Почётный гражданин KAZUS.RU
 
Аватар для niXto
 
Регистрация: 13.10.2007
Адрес: Беларусь
Сообщений: 8,048
Сказал спасибо: 60
Сказали Спасибо 3,954 раз(а) в 2,309 сообщении(ях)
niXto на пути к лучшему
По умолчанию Re: работа с прерываниями (медленно работает)

Сообщение от AVRkin Посмотреть сообщение
наверно прерывание нужно
Да, нужно прерывание
niXto вне форума  
Непрочитано 28.09.2014, 08:12   #3
Easyrider83
Гуру портала
 
Аватар для Easyrider83
 
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 919
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
Easyrider83 на пути к лучшему
По умолчанию Re: работа с прерываниями (медленно работает)

Нужно прерывание. Нужно понимание. Все нужно. Где взять-то?
Easyrider83 вне форума  
Непрочитано 28.09.2014, 08:24   #4
AVRkin
Прописка
 
Аватар для AVRkin
 
Регистрация: 07.09.2014
Сообщений: 136
Сказал спасибо: 18
Сказали Спасибо 2 раз(а) в 2 сообщении(ях)
AVRkin на пути к лучшему
По умолчанию Re: работа с прерываниями (медленно работает)

а какое?
сейчас только придумал - в программу прерываний, каждой кнопке добавить цикл, проверяющий - нажата ли она
__________________
Самое главное умение - умение радоваться жизни.
AVRkin вне форума  
Непрочитано 28.09.2014, 08:47   #5
AVRkin
Прописка
 
Аватар для AVRkin
 
Регистрация: 07.09.2014
Сообщений: 136
Сказал спасибо: 18
Сказали Спасибо 2 раз(а) в 2 сообщении(ях)
AVRkin на пути к лучшему
По умолчанию Re: работа с прерываниями (медленно работает)

Код:
#include ‹mega8.h›
#include ‹delay.h›


interrupt[3] void ExtInt1(void) // Обработчик прерываний на int1 (Порт D, Тип 3 - по нисходящему фронту).
   {                 
                    
              
            if((PIND.0==0)&&(OCR2‹0xfc))
            
            {
            OCR2=OCR2+0x2A;
            delay_ms(5);
            } 
    
            if((PIND.1==0)&&(OCR2›0x00))   
            
            {
            OCR2=OCR2-0x2A;
            delay_ms(5);
            }
           
            while (PIND.2==0)                            
            {                                            
            PORTB=0B10100000;
            delay_ms(1);                                
            }    
            PORTB=0B00000000;


            while (PIND.4==0)
            {
            PORTB=0B10010000;
            delay_ms(1);
            }  
            PORTB=0B00000000;
            
            while (PIND.5==0)
            {
            PORTB=0B01100000;
            delay_ms(1);
            }   
            PORTB=0B00000000;
            
            while (PIND.6==0)
            {
            PORTB=0B01010000;
            delay_ms(1);
            }                         
            PORTB=0B00000000;
                 
   }                               

// Настройки портов и регистров_________________________________________  _________________________
void main(void)
{
DDRB=0b11111111;  
PORTB=0b00000000; 
                    
                    
//DDRC=0b11111111;  
//PORTC=0b00000000; 


DDRD=0b00000000;  
PORTD=0b11111111; 

GICR=0b10000000;  

MCUCR=0b00001000; 

#asm("sei")   //разрешает общие прерывания.


//шим_______________________________________________  ___________________________________________
ASSR=0b00000000;  
TCCR2=0x6C;       //частота ШИМ. 
TCNT2=0b00000000;  
OCR2=0b00000000;  //величина заполнения импульса.
TIMSK=0b00000000;              
         

//Основная программа_________________________________________  ___________________________________
  while(1)
    {   
    ;
    }
    
};
__________________
Самое главное умение - умение радоваться жизни.

Последний раз редактировалось AVRkin; 28.09.2014 в 09:01.
AVRkin вне форума  
Непрочитано 28.09.2014, 09:56   #6
AVRkin
Прописка
 
Аватар для AVRkin
 
Регистрация: 07.09.2014
Сообщений: 136
Сказал спасибо: 18
Сказали Спасибо 2 раз(а) в 2 сообщении(ях)
AVRkin на пути к лучшему
По умолчанию Re: работа с прерываниями (медленно работает)

всё работает нормально, начинаю изучать ИК пульты и протоколы передачи
есть ли какой нибудь простой способ передачи и обработки команд?
библиотека какая нибудь, чтоб вручную всё это не расписывать
делать буду - и пульт, и приёмник
__________________
Самое главное умение - умение радоваться жизни.
AVRkin вне форума  
Непрочитано 28.09.2014, 17:50   #7
jump
Почётный гражданин KAZUS.RU
 
Регистрация: 20.06.2006
Адрес: Украина, Запорожье
Сообщений: 7,982
Сказал спасибо: 0
Сказали Спасибо 4,941 раз(а) в 2,370 сообщении(ях)
jump на пути к лучшему
По умолчанию Re: работа с прерываниями (медленно работает)

Сообщение от AVRkin Посмотреть сообщение
есть ли какой нибудь простой способ передачи и обработки команд? библиотека какая нибудь, чтоб вручную всё это не расписывать делать буду - и пульт, и приёмник
очередная свистоперделка невъе... космических масштабов? так проще поискать проекты, работающие по протоколу RC-5
jump вне форума  
Непрочитано 28.09.2014, 19:08   #8
AVRkin
Прописка
 
Аватар для AVRkin
 
Регистрация: 07.09.2014
Сообщений: 136
Сказал спасибо: 18
Сказали Спасибо 2 раз(а) в 2 сообщении(ях)
AVRkin на пути к лучшему
По умолчанию Re: работа с прерываниями (медленно работает)

собрал это
http://www.getchip.net/posts/099-ras...na-attiny2313/
оно работает, но адекватного исходника нет (есть только алгоритм билдер)
прикрутить не получится

в интернетах откопал http://forum.ggbest.ru/showthread.php?t=588
изучаю
__________________
Самое главное умение - умение радоваться жизни.
AVRkin вне форума  
Непрочитано 28.09.2014, 22:46   #9
NewWriter
Заблокирован
 
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,486
Сказал спасибо: 396
Сказали Спасибо 2,220 раз(а) в 1,319 сообщении(ях)
NewWriter на пути к лучшему
По умолчанию Re: Работа с прерываниями (медленно работает)

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

Если по нажатию кнопки какой-то параметр должен изменяться на величину шага дискретно, то чтобы за доли секунды не улететь от мин. до макс., нужно ввести задержку, подсчитывая количество входов в этот участок кода и выполняя очередное изменение параметра только после достижения какого-то числа.
Если нужно, чтобы за одно нажатие кнопки параметр менялся только на один шаг, то нужно перед тем, как изменить параметр по нажатию кнопки, убедиться, что до этого кнопка была отпущена или не нажата. Делается это при помощи флагов состояния.
Если нужно, чтобы по короткому нажатию кнопки выполнялось одно действие, а по долгому нажатию какое-то другое (или например непрерывное изменение параметра), то любое действие нужно выполнять только после отпускания кнопки из нажатого положения, измеряя длительность удержания кнопки по количеству входов в участок кода и проверяя превышение порога длительности. По факту нажатия запускается только подсчет длительности удержания кнопки.

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

Если клавиатура допускает ложные срабатывания, когда вместо одного факта нажатия получаются два-три, то нужно увеличить интервалы обращения к клавиатуре.
Если наоборот, клавиатура делает пропуски и с задержкой реагирует на нажатия, нужно уменьшить интервалы, задаваемые таймером.

Прежде чем браться за ИК-протоколы, нужно научится вообще управляться с кнопками..
Если и передатчик, и приёмник будут самодельные полностью, то пофик на протоколы и команды. От протокола взять только основу, а структуру бит и количество байт - придумать отфанаря

Последний раз редактировалось NewWriter; 28.09.2014 в 22:58.
NewWriter вне форума  
Сказали "Спасибо" NewWriter
Vlad German (02.10.2014)
Непрочитано 28.09.2014, 23:14   #10
jump
Почётный гражданин KAZUS.RU
 
Регистрация: 20.06.2006
Адрес: Украина, Запорожье
Сообщений: 7,982
Сказал спасибо: 0
Сказали Спасибо 4,941 раз(а) в 2,370 сообщении(ях)
jump на пути к лучшему
По умолчанию Re: Работа с прерываниями (медленно работает)

Сообщение от NewWriter Посмотреть сообщение
структуру бит и количество байт - придумать отфанаря
NRZ тоже отфанаря придумывать будете?
jump вне форума  
Закрытая тема

Закладки


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

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

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

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Напряжённая работа Roshens Отвлекитесь, эмбеддеры! 8 01.09.2010 23:08
как работает UC3846? sofist Источники питания и свет 13 07.02.2008 16:51
Кто работает с фирменным ICD2 ? FreeTramp Микроконтроллеры, АЦП, память и т.д 4 06.06.2007 18:40
PROTEUS не работает crystall Proteus 1 21.11.2006 00:27


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


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