Многозадачность

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Первый раз сказал Мяу!
Сообщения: 20
Зарегистрирован: Вс окт 11, 2009 17:21:33
Откуда: Владимир

Сообщение Irdis777 »

Добрый вечер, форумчане! Огромное спасибо, что откликаетесь на вопросы! Мир спасет электроника :))
Возник такой вопрос. Может ли контроллер выполнять несколько программ одновременно? Допустим, МК используется в охранной системе. На одном из входов весит датчик открытия. На другом, например, датчик разбития стекла в другой комнате. Так вот, если сработал датчик открытия, а потом спустя некоторое время датчик разбития, то контроллер сначала выполнит программу, определенную для открытия, а потом перейдет на разбитие? Пусть время выполнения программ больше интервала между срабатываниями. Или проще на входные шлейфы испльзовать свои МК, просто более простые и дешевые, и чтобы ими управлял центральный? Заранее спасибо!
Реклама
Модератор
Аватара пользователя
Сообщения: 11492
Зарегистрирован: Чт дек 11, 2008 14:52:26
Откуда: град Нижний

Сообщение МитяРа »

Эти и многие другие похожие вещи и алгоритмы делаются по прерываниям..
И пофигу мышь, сколько датчиков висит в системе.. /в разумных пределах конечно/...
Реклама
Первый раз сказал Мяу!
Сообщения: 20
Зарегистрирован: Вс окт 11, 2009 17:21:33
Откуда: Владимир

Сообщение Irdis777 »

Ага. что-то где-то начал понимать, спасибо ответу обучалке :)
Модератор
Аватара пользователя
Сообщения: 11492
Зарегистрирован: Чт дек 11, 2008 14:52:26
Откуда: град Нижний

Сообщение МитяРа »

_noise
хоть "например" что ли добавить, а то как-то.
А там вместо "например" в начале фразы написано "Эти и многие другие похожие".. :) :tea:
Реклама
Эиком - электронные компоненты и радиодетали
Первый раз сказал Мяу!
Сообщения: 20
Зарегистрирован: Вс окт 11, 2009 17:21:33
Откуда: Владимир

Сообщение Irdis777 »

А не могли бы вы порекомендовать какую нибудь статью или сайт для примера?
Реклама
Модератор
Аватара пользователя
Сообщения: 11492
Зарегистрирован: Чт дек 11, 2008 14:52:26
Откуда: град Нижний

Сообщение МитяРа »

Irdis777..
А не могли бы вы порекомендовать какую нибудь статью или сайт для примера?
А чем те не понравилась ссылка _noise тремя постами выше?
..
_noise
оригинальный однако способ цитирования, уж не первый раз замечаю: популярно так. отстаю от моды.
Да нет.. это мя когда на Коте зарегился, то никак не мог разобраться с цитированием..
Пришлось придумать что-то своё..
Реклама
Первый раз сказал Мяу!
Сообщения: 20
Зарегистрирован: Вс окт 11, 2009 17:21:33
Откуда: Владимир

Сообщение Irdis777 »

[quote="МитяРа"]Irdis777..
А не могли бы вы порекомендовать какую нибудь статью или сайт для примера?
А чем те не понравилась ссылка _noise тремя постами выше?
..
_noise

просто я пока на си учусь.хотелось бы побольше примеров разобранных
Первый раз сказал Мяу!
Сообщения: 20
Зарегистрирован: Вс окт 11, 2009 17:21:33
Откуда: Владимир

Сообщение Irdis777 »

Или вообще книгу какую-нибудь, где все было бы понятно написано и с нуля :)
Опытный кот
Аватара пользователя
Сообщения: 890
Зарегистрирован: Вт янв 20, 2009 14:49:08
Откуда: Гондурас, Мурманск

Сообщение DrWatson »

поиск по форуму и Гугль рулят - были темы такие и не один раз.
Полазай по торрент-трекерам - там сборки книг по сотням мегабайт попадаются.
Ищите, да обрящете...
- Если вы такие умные, то почему тогда строем не ходите?
ἓν οἶδα ὅτι οὐδὲν οἶδα (с) Σωκράτης
Первый раз сказал Мяу!
Сообщения: 20
Зарегистрирован: Вс окт 11, 2009 17:21:33
Откуда: Владимир

Сообщение Irdis777 »

Добрый вечер.
Че-то я конкретно видимо торможу :( , но никак не могу сделать элементарное. Просто надо чтобы порт D мигал по прерываниям. Это не является какой либо технической задачей и не требует реализации в металле) Просто хочу понять
Вот исходник:
#include <mega128>
#include <delay>
unsigned char ch;
void timer1_ovf_isr(void)
{
ch++;
}
void main(void)
{
PORTA=0xFF;
DDRA=0x00;
PORTB=0xFF;
DDRB=0x00;
PORTC=0x00;
DDRC=0xFF;
//PORTD=0x00;
DDRD=0xFF;
PORTE=0x00;
DDRE=0x00;
PORTF=0x00;
DDRF=0x00;
PORTG=0x00;
DDRG=0x00;
ACSR=0x80;
while (1)
{
PORTD = ch;
delay_ms(100);
};
}

Подскажите, пожалуйста, где косяк?
Опытный кот
Аватара пользователя
Сообщения: 890
Зарегистрирован: Вт янв 20, 2009 14:49:08
Откуда: Гондурас, Мурманск

Сообщение DrWatson »

Во-первых перед while(1) надо разрешить прерывания ассемблерной командой sei (вроде бы в данной реализации компилятора есть функция sei() в <interrupt.h>)
Во вторых строчку PORTD=ch; можно поместить и в обработчик прерывания после ch++; а цикл while(1) в данном случае можно сделать и пустым.
- Если вы такие умные, то почему тогда строем не ходите?
ἓν οἶδα ὅτι οὐδὲν οἶδα (с) Σωκράτης
Первый раз сказал Мяу!
Сообщения: 20
Зарегистрирован: Вс окт 11, 2009 17:21:33
Откуда: Владимир

Сообщение Irdis777 »

как будто прерывания не работают. а выходах висят 0 :(
какую бы задержку не ставил, ничегоне меняется
Опытный кот
Аватара пользователя
Сообщения: 890
Зарегистрирован: Вт янв 20, 2009 14:49:08
Откуда: Гондурас, Мурманск

Сообщение DrWatson »

мил человек, ты вообще читаешь что тебе пишут? :evil:
как у тебя будут работать прерывания, если ты их не разрешил, да еще и таймер Т1, который должен эти прерывания вызывать не проинициализировал!!!
бегом читать даташит про таймер Т1 и прерывания!
- Если вы такие умные, то почему тогда строем не ходите?
ἓν οἶδα ὅτι οὐδὲν οἶδα (с) Σωκράτης
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»