Светодиодные фонари и световые приборы. Всё о светотехнике.
Изображения Дневники Группы Поиск
Вернуться   Форум FONAREVKA.RU Лаборатория Электроника и схемотехника Электроника Микроконтроллеры
Расширенный поиск
Забыли пароль? Регистрация

  • О нашем проекте
  • Светотехника и световые приборы
  • Правила форума
Проект FONAREVKA.RU специализируется на предоставлении всей необходимой информации по светотехнике:

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

Если у вас есть вопросы по выбору фонарей, аккумуляторов и зарядных устройств ознакомьтесь с FAQ от наших экспертов:

F.A.Q. по выбору фонарей различных типов;
F.A.Q. по выбору аккумуляторов;
F.A.Q. по выбору зарядных устройств.
Ответ  Создать новую тему
Просмотров в теме 182687   Ответов в теме 119   Подписчиков на тему 0   Добавили в закладки 0
Опции темы Поиск в этой теме
Старый 23.02.2012, 18:17   101
lasers_chem_kot
Завсегдатай Фонарёвки
 
Аватар для lasers_chem_kot
 
Регистрация: 13.03.2010
Последняя активность: 15.08.2015 05:45
Сообщений: 494
Сказал(а) спасибо: 0
Поблагодарили: 0 раз(а) в 0 сообщениях

Отправить сообщение для lasers_chem_kot с помощью ICQ
По умолчанию

Если разрешены прерывания, то выполнение программы "приостанавливается" - сохраняются значения регистров, производится вызов обработчика прерывания. Как только он отработал, производится возврат управления программе, т.е. в вашем случае продолжится выполнение delay_ms(8000);. Как следствие из этого и не следует долго засиживаться в обработчиках прерываний
lasers_chem_kot вне форума   Ответить с цитированием Вверх
Старый 24.02.2012, 11:43   102
us5mch
Лазеростроитель
 
Регистрация: 23.02.2012
Последняя активность: 24.02.2012 11:43
Сообщений: 2
Сказал(а) спасибо: 0
Поблагодарили: 0 раз(а) в 0 сообщениях

По умолчанию

Да это всё понятно, в прерывании я выполняю одну-две команды, возвращаюсь в delay, как из него экстренно выйти, ждать 8000ms нельзя, нужен экстренный стоп ну или запуск чего либо, а программа в задержке сидит. Как тут быть?
us5mch вне форума   Ответить с цитированием Вверх
Старый 24.02.2012, 15:53   103
ECCOsea
Новичок
 
Аватар для ECCOsea
 
Регистрация: 14.02.2010
Последняя активность: 28.04.2016 12:07
Сообщений: 447
Сказал(а) спасибо: 0
Поблагодарили: 0 раз(а) в 0 сообщениях

По умолчанию

Вообще то вам правильно все объяснили. Если прерывание сработает, то у вас ТУТ ЖЕ программа ВЫЙДЕТ из той задержки. И начнет ВЫПОЛНЯТЬ ПРОГРАММУ ПРЕРЫВАНИЯ. А после выполнения вернется в задержку.
ECCOsea вне форума   Ответить с цитированием Вверх
Старый 24.02.2012, 16:25   104
ABA
Ветеран Фонарёвки
 
Аватар для ABA
 
Регистрация: 25.02.2010
Последняя активность: 11.09.2013 18:36
Сообщений: 1302
Сказал(а) спасибо: 0
Поблагодарили: 0 раз(а) в 0 сообщениях

По умолчанию

Цитата:
Посмотреть сообщение Сообщение от ECCOsea :
Вообще то вам правильно все объяснили. Если прерывание сработает, то у вас ТУТ ЖЕ программа ВЫЙДЕТ из той задержки. И начнет ВЫПОЛНЯТЬ ПРОГРАММУ ПРЕРЫВАНИЯ. А после выполнения вернется в задержку.
Хотел бы добавить: пока программа на прерывания не отработает - следующая не запустится (зависнит).

PS: если уровень ниже последующей.
ABA вне форума   Ответить с цитированием Вверх
Старый 25.02.2012, 18:14   105
lasers_Ryazanec
Ветеран Фонарёвки
 
Регистрация: 04.05.2010
Последняя активность: 15.11.2019 11:47
Сообщений: 1223
Сказал(а) спасибо: 0
Поблагодарили: 0 раз(а) в 0 сообщениях

Отправить сообщение для lasers_Ryazanec с помощью ICQ
По умолчанию

Цитата:
Посмотреть сообщение Сообщение от us5mch :
Да это всё понятно, в прерывании я выполняю одну-две команды, возвращаюсь в delay, как из него экстренно выйти, ждать 8000ms нельзя, нужен экстренный стоп ну или запуск чего либо, а программа в задержке сидит. Как тут быть?
Либо не использовать delay а писать свою функцию, на цыкле например, и в случае чего выполнять return из него, либо по таймеру проверять значение флагов, и если что то изменилось, то выполнять первостепенное дело не дожидясь завершения delay.
lasers_Ryazanec вне форума   Ответить с цитированием Вверх
Старый 25.02.2012, 19:37   106
SviMik
Завсегдатай Фонарёвки
 
Аватар для SviMik
 
Регистрация: 26.02.2010
Последняя активность: 18.08.2015 18:47
Сообщений: 748
Сказал(а) спасибо: 0
Поблагодарили: 0 раз(а) в 0 сообщениях

Отправить сообщение для SviMik с помощью ICQ Отправить сообщение для SviMik с помощью MSN
По умолчанию

Используй спящий режим и команду sleep. При любом прерывании он выйдет из спящего режима, и после выхода из прерывания уже не продолжит спать.
__________________
e-mail: euro@*********
jabber: shop@*********
Сообщение: http://forum.*********/sendm...
SviMik вне форума   Ответить с цитированием Вверх
Старый 25.02.2012, 21:06   107
lasers_Ryazanec
Ветеран Фонарёвки
 
Регистрация: 04.05.2010
Последняя активность: 15.11.2019 11:47
Сообщений: 1223
Сказал(а) спасибо: 0
Поблагодарили: 0 раз(а) в 0 сообщениях

Отправить сообщение для lasers_Ryazanec с помощью ICQ
По умолчанию

Цитата:
Посмотреть сообщение Сообщение от SviMik :
Используй спящий режим и команду sleep. При любом прерывании он выйдет из спящего режима, и после выхода из прерывания уже не продолжит спать.
Человеку как я понял нужна задержка, и если что то случилось, то прекратить эту задержку.
Из спячки он выйдет при любом прерывании, а задержку нужно прекратить не в любом случае.

Спячка идеальна, если нужно ждать какое то событие по прерыванию, тогда в обработчике прерывания можно вообще ничего не делать, просто будить контроллер.
lasers_Ryazanec вне форума   Ответить с цитированием Вверх
Старый 21.05.2012, 20:52   108
mib1
Лазеростроитель
 
Регистрация: 21.05.2012
Последняя активность: 23.05.2012 02:02
Сообщений: 2
Сказал(а) спасибо: 0
Поблагодарили: 0 раз(а) в 0 сообщениях

Smile

Доброго дня, опыта слишком мало, Си уже давненько не видел, прошу помощи в этом коде, вырезал из текста ...

Код:
 typedef unsigned char byte;
 struct lcdSymbol {
    byte val;
    byte row;
    byte line;
    byte nbValues;
    byte maxLen;
    byte* caption; // 0 if unused; e.g. "ID "
    byte** line1Values; // e.g. "Full", "1/2", "1/4"
    byte** line2Values; // 0 if unused
 };

 struct lcdSymbol** lcdSymbols = txSymbols
 struct lcdSymbol* rxSymbols[ ] = {&groupSym, &deviceSym, &powerRxSym, 
    &blSym, &idSym, &modeSym };
  // и дальше есть строки
 main {
    prevVal = lcdSymbols[cursorPos]->val;
    currVal = (prevVal+1) % (lcdSymbols[cursorPos]->nbValues);
 }
1) не пойму
byte*
byte** ... что означают звздочки в описании структуры lcdSymbol

2) как используется lcdSymbols и уже две "**" сразу
mib1 вне форума   Ответить с цитированием Вверх
Старый 21.05.2012, 22:30   109
lasers_Ryazanec
Ветеран Фонарёвки
 
Регистрация: 04.05.2010
Последняя активность: 15.11.2019 11:47
Сообщений: 1223
Сказал(а) спасибо: 0
Поблагодарили: 0 раз(а) в 0 сообщениях

Отправить сообщение для lasers_Ryazanec с помощью ICQ
По умолчанию

это функция такая запись в ней то что со звездочками это указатель на позицию или номер символа. сам возился когда строку в последовательность символов превращал.
lasers_Ryazanec вне форума   Ответить с цитированием Вверх
Старый 22.05.2012, 12:03   110
lasers_AVSel
Ветеран Фонарёвки
 
Аватар для lasers_AVSel
 
Регистрация: 15.02.2010
Последняя активность: 05.09.2022 18:18
Сообщений: 1034
Сказал(а) спасибо: 0
Поблагодарили: 0 раз(а) в 0 сообщениях

По умолчанию

byte* - указатель на байт (физически - адрес одиночного байта в памяти, или адрес первого элемента массива байт)
byte** - указатель на указатель на байт (физически - адрес указателя на байт в памяти, или адрес первого указателя массива указателей на байт)
__________________
Чем бы дитя не тешилось - лишь бы не лазером...
lasers_AVSel вне форума   Ответить с цитированием Вверх
Старый 23.05.2012, 02:02   111
mib1
Лазеростроитель
 
Регистрация: 21.05.2012
Последняя активность: 23.05.2012 02:02
Сообщений: 2
Сказал(а) спасибо: 0
Поблагодарили: 0 раз(а) в 0 сообщениях

По умолчанию

Спасибо Вам за подсказки. Полистал Кернигана и Ритчи, много полезного, но как-то скомканно, без примеров (....
вот это почитал ...
Указатели на структуры
Многоуровневая адресация

теперь код понимаю следующим образом
Код:
typedef unsigned char byte;
struct lcdSymbol {
    byte val;
    byte row;
    byte line;
    byte nbValues;
    byte maxLen;
    byte* caption; // 0 if unused; e.g. "ID "
    byte** line1Values; // e.g. "Full", "1/2", "1/4"
    byte** line2Values; // 0 if unused
 };

static byte* blValues1[]   = { lampOff1, lampOn1 };	// массив указателей
static byte* blValues2[]   = { lampOff2, lampOn2 };	// ссылающихся на массивы "символов"
static byte* modeValues[]  = { codeTx, codeRx };	// возможных режимов

struct lcdSymbol powerASym = { 0, 1, 1, 8, 4, codeA, powerValues, 0 }; // codeA - указатель на первый символ в массиве
struct lcdSymbol powerBSym = { 0, 1, 2, 8, 4, codeB, powerValues, 0 }; // создаём структуры с типом lcdSymbol
struct lcdSymbol powerCSym = { 0, 1, 3, 8, 4, codeC, powerValues, 0 }; // powerValues - двойной указатель на массив указателей, разных режимов

	// массив указателей на адреса структур, 2 режима работы с разным набором структур
struct lcdSymbol* txSymbols[] = {&powerASym, &powerBSym, &powerCSym, &powerDSym, &blSym, &idSym, &modeSym};
struct lcdSymbol* rxSymbols[] = {&groupSym, &deviceSym, &powerRxSym, &blSym, &idSym, &modeSym };

struct lcdSymbol** lcdSymbols = txSymbols; // двойной указатель **lcdSymbols на первый указатель  в массиве txSymbols
					   // а тот в свою очередь на конкретную структуру 

  // и дальше есть строки
 main {
   .
   . 
   .
    prevVal = lcdSymbols[cursorPos]->val;
    currVal = (prevVal+1) % (lcdSymbols[cursorPos]->nbValues);
 }
если cursorPos = 0, то ссылка на первый адрес структуры &powerASym, элемент val
Вроде понял))
mib1 вне форума   Ответить с цитированием Вверх
Старый 09.06.2012, 01:46   112
lasers_Lum1noFor
Увлеченный
 
Регистрация: 14.02.2010
Последняя активность: 25.11.2018 13:03
Сообщений: 437
Сказал(а) спасибо: 0
Поблагодарили: 0 раз(а) в 0 сообщениях

Отправить сообщение для lasers_Lum1noFor с помощью ICQ
По умолчанию

Ребят, расскажите, пожалуйста, как использовать АЦП, что такое разрядность, и, хотелось бы, пример. Что-то совсем не вкуриваю. И какое значение возвращает функция ADC_Read? Спасибо!
__________________
Внимание! Это сообщение сгенерировано автоматически, отвечать на него не нужно.
lasers_Lum1noFor вне форума   Ответить с цитированием Вверх
Старый 09.06.2012, 08:42   113
lasers_Ryazanec
Ветеран Фонарёвки
 
Регистрация: 04.05.2010
Последняя активность: 15.11.2019 11:47
Сообщений: 1223
Сказал(а) спасибо: 0
Поблагодарили: 0 раз(а) в 0 сообщениях

Отправить сообщение для lasers_Ryazanec с помощью ICQ
По умолчанию

Разрядность- точность его. допустим он 10 разрядный тогда эта функция возвращает значения от 0 до 1024. расчитывается оно относительно опорного напряжения. допустим опорное напряжение формируется внутренним источником. допустим это 2.55 вольта тогда мк делит это значение на разрядность - 2.56/1024=0,0025 вольта на 1 значение, иными словами АЦП может измерить напряжение с точностью в 0,0025 вольта. При замере напряжения мк сравнивает их и на выходе выдает значение . нужно учитывать что разрядность так же зависит от скорости ацп. чем медленнее тем точнее это в даташите есть.

Расчитывается напряжение так:
при источнике опорного напряжения 2,56 вольта имеем 1 значение в 0,0025 вольта.
Если входное напряжение у нас выше чем 2,56 то его нужно поделить резистивным делителем, что бы попасть в пределв 0-2,56, а при расчетах еще и умножать на коэффициент деления резистивного делителя. допустим мы меряем напряжение до 12 вольт, тогда резистивным делителем можно поделить его напрмиер на 5 - получим максимум 2,4 вольта.

в итоге расчет напряжения будет такой.

0,0025 * [значение которое вернула функция]*5

допустим получили на выходе функции 524, тогда
0,0025*524=1,31 вольта это на входе АЦП а 1,31*5=6,55 это напряжение до резистивного делителя.
lasers_Ryazanec вне форума   Ответить с цитированием Вверх
Старый 09.06.2012, 13:35   114
lasers_Lum1noFor
Увлеченный
 
Регистрация: 14.02.2010
Последняя активность: 25.11.2018 13:03
Сообщений: 437
Сказал(а) спасибо: 0
Поблагодарили: 0 раз(а) в 0 сообщениях

Отправить сообщение для lasers_Lum1noFor с помощью ICQ
По умолчанию

Цитата:
Посмотреть сообщение Сообщение от Ryazanec :
Разрядность- точность его. допустим он 10 разрядный тогда эта функция возвращает значения от 0 до 1024. расчитывается оно относительно опорного напряжения. допустим опорное напряжение формируется внутренним источником. допустим это 2.55 вольта тогда мк делит это значение на разрядность - 2.56/1024=0,0025 вольта на 1 значение, иными словами АЦП может измерить напряжение с точностью в 0,0025 вольта. При замере напряжения мк сравнивает их и на выходе выдает значение . нужно учитывать что разрядность так же зависит от скорости ацп. чем медленнее тем точнее это в даташите есть.

Расчитывается напряжение так:
при источнике опорного напряжения 2,56 вольта имеем 1 значение в 0,0025 вольта.
Если входное напряжение у нас выше чем 2,56 то его нужно поделить резистивным делителем, что бы попасть в пределв 0-2,56, а при расчетах еще и умножать на коэффициент деления резистивного делителя. допустим мы меряем напряжение до 12 вольт, тогда резистивным делителем можно поделить его напрмиер на 5 - получим максимум 2,4 вольта.

в итоге расчет напряжения будет такой.

0,0025 * [значение которое вернула функция]*5

допустим получили на выходе функции 524, тогда
0,0025*524=1,31 вольта это на входе АЦП а 1,31*5=6,55 это напряжение до резистивного делителя.

Спасибо, с этим понятно. Буду пробовать!
lasers_Lum1noFor вне форума   Ответить с цитированием Вверх
Старый 09.06.2012, 17:45   115
lasers_INFERION
Ветеран Фонарёвки
 
Аватар для lasers_INFERION
 
Регистрация: 15.02.2010
Последняя активность: 24.08.2019 11:36
Сообщений: 1342
Сказал(а) спасибо: 0
Поблагодарили: 0 раз(а) в 0 сообщениях

По умолчанию

На первый взгляд всё просто, но у АЦП столько нюансов, что точность можно поднять на порядок, если подходить к этому делу с умом. Вообще вики в помощь: АЦП. Полезно ещё почитать за оверсемплинг. Чем выше скорость АЦП, тем он точнее (при равной разрядности), до поры до времени. Но чтоб пользоваться этим - недостаточно в лоб считывать данные, нужно проводить коррекцию, усреднять, подмешивать шум в измеряемый сигнал и т.п. К примеру у AVR (АЦП последовательного приближения) у меня более менее нормально считать в лоб получается на скорости всего лишь 9 килосемплов, это если пользуешься мультиплексором (каждый раз меряешь что-то новое). На более высоких скоростях устройство выборки-хранения не успевает полностью перезарядится до значения резко изменившегося уровня сигнала. Поведение похожее на RC-фильтр, этот эффект нужно учитывать и писать дополнительные корректирующие алгоритмы. Он так же и на АЧХ влияет, в некоторых задачах это может быть критичным (крутит амплитуду и фазу в зависимости от частоты). На более высоких скоростях растёт шум, да, но усреднение позволит получать разрядность и выше 10-ти бит, а со снижением частоты измеряемого сигнала - разрядность будет продолжать расти. Тут шум наоборот помогает. Особенно это актуально для сигма-дельта АЦП, они изначально за счёт шума квантования и работают...
В общем запас по частоте дискретизации позволяет получить более годный (мягкий) для многих задач сигнал. И на резкие изменения можно среагировать быстрее, и более точно померить на более длительных периодах, причём одновременно. Алиасинг тоже существенно меньше (из-за него желательно входной сигнал фильтровать, хотя бы простым RC-фильтром).
lasers_INFERION вне форума   Ответить с цитированием Вверх
Старый 09.06.2012, 18:43   116
lasers_Ryazanec
Ветеран Фонарёвки
 
Регистрация: 04.05.2010
Последняя активность: 15.11.2019 11:47
Сообщений: 1223
Сказал(а) спасибо: 0
Поблагодарили: 0 раз(а) в 0 сообщениях

Отправить сообщение для lasers_Ryazanec с помощью ICQ
По умолчанию

Пришел Инф и распугал всех новичков
lasers_Ryazanec вне форума   Ответить с цитированием Вверх
Старый 09.06.2012, 19:18   117
lasers_INFERION
Ветеран Фонарёвки
 
Аватар для lasers_INFERION
 
Регистрация: 15.02.2010
Последняя активность: 24.08.2019 11:36
Сообщений: 1342
Сказал(а) спасибо: 0
Поблагодарили: 0 раз(а) в 0 сообщениях

По умолчанию

А что тут страшного? Я ведь не говорю что без всех этих моментов АЦП юзать невозможно? Возможно, просто тогда круг задач, или качество их выполнения, которые с его помощью можно решить, сужается. А новичку и не надо относится к этому настолько серьёзно, задачи у него, как правило, достаточно примитивные. Это я просто забегая на перёд описал некоторые моменты, которые в будущем могут пригодится, как пригодились мне...

Раньше я, к примеру, не верил что на AVR можно собрать достаточно качественный преобразователь, чтоб питать им такие нежные вещи как ЛД. А сейчас собираюсь собрать бек-буст на 4 ампера, на тиньке. И рассчитываю получить довольно высокую скорость реакции на помехи и довольно высокую точность установки заданного режима. Просто используя передискретизацию, коррекцию АЧХ, и сигма-дельта модуляцию слишком грубой ШИМ...
lasers_INFERION вне форума   Ответить с цитированием Вверх
Старый 09.06.2012, 19:38   118
SviMik
Завсегдатай Фонарёвки
 
Аватар для SviMik
 
Регистрация: 26.02.2010
Последняя активность: 18.08.2015 18:47
Сообщений: 748
Сказал(а) спасибо: 0
Поблагодарили: 0 раз(а) в 0 сообщениях

Отправить сообщение для SviMik с помощью ICQ Отправить сообщение для SviMik с помощью MSN
По умолчанию

Инф уже сам как ходячая википедия (если кто обратил внимание на ссылки на википедию в тексте).
SviMik вне форума   Ответить с цитированием Вверх
Старый 09.06.2012, 23:46   119
ABA
Ветеран Фонарёвки
 
Аватар для ABA
 
Регистрация: 25.02.2010
Последняя активность: 11.09.2013 18:36
Сообщений: 1302
Сказал(а) спасибо: 0
Поблагодарили: 0 раз(а) в 0 сообщениях

По умолчанию

Цитата:
Посмотреть сообщение Сообщение от INFERION :
........ А сейчас собираюсь собрать бек-буст на 4 ампера, на тиньке. ...
Желаю тебе удачи с драйвером!
ABA вне форума   Ответить с цитированием Вверх
Старый 25.08.2015, 11:41   120
lasers_AVSel
Ветеран Фонарёвки
 
Аватар для lasers_AVSel
 
Регистрация: 15.02.2010
Последняя активность: 05.09.2022 18:18
Сообщений: 1034
Сказал(а) спасибо: 0
Поблагодарили: 0 раз(а) в 0 сообщениях

По умолчанию Re: Основы программирования контроллеров AVR на Си

Эту тему бы в "важные" поднять...
lasers_AVSel вне форума   Ответить с цитированием Вверх
Ответ  Создать новую тему





Copyright ©2007 - 2024, FONAREVKA.RU

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

Правила форума | Отказ от ответственности

Время генерации страницы 0.15927 секунды с 19 запросами