|
|
  |
Хочу попробовать ARM, подскажите, что для этого нужно?, Какой проц выбрать, отлад. платку и какой софт? |
|
|
|
Jan 30 2007, 16:13
|
Частый гость
 
Группа: Новичок
Сообщений: 79
Регистрация: 1-11-06
Пользователь №: 21 868

|
Цитата(sonycman @ Jan 30 2007, 13:32)  По IrDA понял, спасибо  Жаль, что не совместимы  А не все так плохо и ужасьно. На самом деле IrDA и Remote Control пересекаются по крайней мере в двух случаях. Первый - некоторые люди заметили что 115200 = 38400*3, а 38400 Гц очень похоже на 38 кГц, которые используются в дистанционках. И написали проги, которые передают по протоколу IrDA (те самые 3/16 импульсы) некие байты - специально подобранные битовые маски типа 00100100, из которых полосовой фильтр на 38 кГц в ИК приемнике управляемого аппарата выделяет модулированную посылку, аналогичную той что передает родной передатчик. В программе LIRC точно есть такой модуль. Второй - CIR (Consumer IR). Это просто условно говоря светодиод, подвешенный на ножку порта, а фотоприемник (без демодулятора) на другую ножку. Обычно это один из режимов ирда-интерфейса. И можно передавать и принимать что угодно. Хошь ирду, хошь код rc5 для дистанционок. Это уже должно быть в железе, но говорят что реально встречается на материнках и КПК. Сам не видел.
|
|
|
|
|
Jan 30 2007, 16:24
|

Любитель
    
Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695

|
Цитата(boez @ Jan 30 2007, 17:13)  А не все так плохо и ужасьно. Пока не знакомился с проектами, использующими RC5 (так, вроде, называется протокол ИК пультов бытовой техники?). Интересует только приём комманд с пульта. Значит, модулятор для передачи можно, таки?  А демодулятор для приёма? Цитата(SpiritDance @ Jan 30 2007, 17:17)  Использовать compare. Перед/после определенного события загружать регистр сравнения на определенную величину и ждать срабатывания. Уже думал над этим. Но может потребоваться одновременное использование нескольких таймеров. Аппаратных таймеров не хватит.
Сообщение отредактировал sonycman - Jan 30 2007, 16:30
|
|
|
|
|
Jan 30 2007, 16:39
|
Частый гость
 
Группа: Новичок
Сообщений: 79
Регистрация: 1-11-06
Пользователь №: 21 868

|
Цитата(sonycman @ Jan 30 2007, 15:24)  Пока не знакомился с проектами, использующими RC5 (так, вроде, называется протокол ИК пультов бытовой техники?). Интересует только приём комманд с пульта. Значит, модулятор для передачи можно, таки?  А демодулятор для приёма? А демодулятор наверное нельзя (первым методом) - потому как простая посылка 38 кГц ну никак не похожа на IrDA-сигнал с его стартовыми-стоповыми битами и строго определенной формой. RC5 это для примера, главное 38 кГц заполнение.
|
|
|
|
|
Jan 30 2007, 16:48
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(sonycman @ Jan 30 2007, 14:54)  Допустим, задаче требуется n-ное количество независимых таймеров для задания больших (десятки/сотни миллисекунд) задержек перед/после определённых событий. Для этого я использовал n-ное кол-во переменных tmr, куда заносил значения задержек. Один аппаратный периодический таймер обрабатывал на прерывании все эти переменные - в сторону уменьшения до нуля. Программа опрашивала их, и при обнулении считалось, что пауза выдержана. А какие есть альтернативные решения этой проблемы? Одно из решений, применяемое в "больших" ОСях - создается сортированный список таймеров. При этом каждый следующий таймер инициализируется разницей требуемого времени и времени предыдущего. Таким образом в прерывании декрементируется только один таймер. Когда он досчитывает до нуля - генерится сигнал, элемент из списка удаляется. В следующем прерывании будет декрементироваться следующий таймер, отсчитывая оставшееся время. Метод дает выигрыш для большого количества таймеров. Но требует накладных расходов - использование динамической памяти, прцедуры поиска по списку и вставки в середину списка. Больше вариантов не знаю. Тоже интересно узнать про другие реализации.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jan 30 2007, 16:50
|

Любитель
    
Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695

|
Цитата(boez @ Jan 30 2007, 17:39)  А демодулятор наверное нельзя (первым методом) - потому как простая посылка 38 кГц ну никак не похожа на IrDA-сигнал с его стартовыми-стоповыми битами и строго определенной формой. RC5 это для примера, главное 38 кГц заполнение. Понятно. А пульты бывают, в основном, именно с модуляцией 38 кГц? Тогда демодулятор надо делать внешний, или софтовый, может? Цитата(Сергей Борщ @ Jan 30 2007, 17:48)  Одно из решений, применяемое в "больших" ОСях - создается сортированный список таймеров. Хм, интересное решение. Спасибо. Буду знать
Сообщение отредактировал sonycman - Jan 30 2007, 16:53
|
|
|
|
|
Jan 30 2007, 17:03
|
Частый гость
 
Группа: Новичок
Сообщений: 79
Регистрация: 1-11-06
Пользователь №: 21 868

|
Цитата(sonycman @ Jan 30 2007, 15:50)  Понятно. А пульты бывают, в основном, именно с модуляцией 38 кГц? Тогда демодулятор надо делать внешний, или софтовый, может? Очень часто. Бывают и другие - но тоже около 40, далеко они намного реже забираются. Есть готовые ИК ДУ - приемники, деталька на трех ножках с глазком черным. Земля, питание и выход ТТЛ-уровня. Внутри приемник, усилитель, полосовой фильтр и демодулятор. Сразу на нужную частоту - при покупке нужно узнавать какой на какую. Маркировку конечно не помню, мож кто подскажет.
|
|
|
|
|
Jan 30 2007, 17:09
|

Любитель
    
Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695

|
Цитата(boez @ Jan 30 2007, 18:03)  Очень часто. Бывают и другие - но тоже около 40, далеко они намного реже забираются. Есть готовые ИК ДУ - приемники, деталька на трех ножках с глазком черным. Земля, питание и выход ТТЛ-уровня. Внутри приемник, усилитель, полосовой фильтр и демодулятор. Сразу на нужную частоту - при покупке нужно узнавать какой на какую. Маркировку конечно не помню, мож кто подскажет. Замечательно! Значит - тут всё просто! Дело только за софтом. Спасибо.
|
|
|
|
|
Jan 30 2007, 17:45
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(boez @ Jan 30 2007, 18:03)  Есть готовые ИК ДУ - приемники, деталька на трех ножках с глазком черным. Земля, питание и выход ТТЛ-уровня. Они хороши против примитивного решения еще и тем, что содержат схему АРУ, позволяющую исключить влияние внешней засветки. Цитата(sonycman @ Jan 30 2007, 16:09)  Замечательно! Значит - тут всё просто! Дело только за софтом. Для полноты картины глянь проект Леонида Ивановича: Применение кода RC-5
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jan 30 2007, 17:52
|
Участник

Группа: Новичок
Сообщений: 54
Регистрация: 25-01-07
Пользователь №: 24 744

|
Hello All. Я опять на форуме. Нужда вынудила. Ирония типа: “Возвращение блудного сына” или “Явление Христа народу” попрошу оставить при себе. Настоятельно прошу! Прежде всего, хочу сказать, что я писал только правду. Кого-то обманывать? Зачем? Какая выгода? Если б, хотел обмануть, то я вам такую сказку тут наплёл бы… Поверти, красноречия у мне хватает (думаю заметили уже). Выкладывание отсканированных дипломов? А что это решит? 100 проектов вас смущает? Я же не говорил, что я OS пишу (хотя было желание как-то написать GSM модем, но хорошие люди отговорили). Большинство моих проектов 4-8 кБ (AVR). Ну, например, приходит друг, говорит надо такую “Приблуду” для телефона. Пожалуйста – час придумывания схемы, час делание платы, час писание пороги, 3 часа отладки и девай-с готов. Вот вам и проект за день. И таких проектов была целая куча. Погорячились и хватит.  Просто не надо поливать помоями чужие старания. Кто та над ними сидел, корпел, вымучивал. Надо быть дипломатичнее. Я пытался обсудить, как использовать ARM (например, периферию как задействовать), а не стили писания. Я долгое время работал чисто на asm. По этому и стиль этот применяю в С. По поводу обсуждения bin, я для себя решил так, никто не был на 100% прав, истина находилась как всегда по середине. Например, регистры GPIO я однозначно буду инициализировать в виде bin(x,x,x,x), ну а UART там можно и (1<<x). Замечания по поводу, правописания, скажу, я не на экзамене по русскому языку, и вообще я не в России живу и язык у меня родной другой. Хотя я почти всегда, посты свои в WORD на ошибки проверял. Теперь по существу. Выкладываю проект заготовку. Не могу понять одну вещь. Почему в Startup в блоке “Configure and Enable PLL” вдруг в регистре VICRavIntr появляется число 0x1000. А потом порога неожиданно срывается в SWI. Все места на которые нужно обратить внимание я пометил brickpoint и написал краткий комментарий.
Прикрепленные файлы
1.rar ( 28.87 килобайт )
Кол-во скачиваний: 36
|
|
|
|
|
Jan 30 2007, 18:07
|
Местный
  
Группа: Свой
Сообщений: 359
Регистрация: 9-12-05
Пользователь №: 12 034

|
Цитата(Сергей Борщ @ Jan 30 2007, 18:48)  Цитата(sonycman @ Jan 30 2007, 14:54)  Допустим, задаче требуется n-ное количество независимых таймеров для задания больших (десятки/сотни миллисекунд) задержек перед/после определённых событий. Для этого я использовал n-ное кол-во переменных tmr, куда заносил значения задержек. Один аппаратный периодический таймер обрабатывал на прерывании все эти переменные - в сторону уменьшения до нуля. Программа опрашивала их, и при обнулении считалось, что пауза выдержана. А какие есть альтернативные решения этой проблемы?
Одно из решений, применяемое в "больших" ОСях - создается сортированный список таймеров. При этом каждый следующий таймер инициализируется разницей требуемого времени и времени предыдущего. Таким образом в прерывании декрементируется только один таймер. Когда он досчитывает до нуля - генерится сигнал, элемент из списка удаляется. В следующем прерывании будет декрементироваться следующий таймер, отсчитывая оставшееся время. Метод дает выигрыш для большого количества таймеров. Но требует накладных расходов - использование динамической памяти, прцедуры поиска по списку и вставки в середину списка. Больше вариантов не знаю. Тоже интересно узнать про другие реализации. Если у Вас максимальное количество "таймеров" заранее известно то не обязательно использование динамической памяти. Тут тоже путей несколько: 1. использование глобальных структурок которые при "засовывании в таймер" включаются в сортированный список 2. Использование массива в модуле таймера, в котором тоже сортируются "записи". Помимо декремента можно использовать просто "таймерную инкрементируемую переменную" с достаточным коэффициентом пересчёта. Например в обработчике прерывания каждую мс инкрементируется переменная nTime с некоей разрядностью которой достаточно для максимально-возможного таймаута. Допустим когда nTime==12345 ктото захотел запустить таймер на 234мс., тогда в всё тотже список засовывается значение 12345+234=12579, т.е. то значение которое должно быть по истечении таймера. Минусы - небольшой контроль переполнения. Плюсы - перезапуск таймера в любой момент без привязки к текущему времени. Ну а если надо не события из обработчика таймера генерить (с запуском задач или вызовом калбэков), а основные части проги опрашивают "таймауты" сами, то всё гораздо проще: Код static uint uiTimer0Count; static void timer0ISR() { ... uiTimer0Count++; ... }
uint getTimer() { return uiTimer0Count; }
#define VerifyTimer(s,t) ((t) <= (getTimer()-(s)))
.... // Старт таймера uint nStartTimerVal = getTimer(); .... // Проверка таймаута в 1234мс if(VerifyTimer(nStartTimerVal, 1234)) { ... } .... Тут переменных типа nStartTimerVal м.б. сколько угодно, и проверять одну засечку времени можно на несколько значений таймаута (иногда я и такое пользую  ). Разрядность таймерной переменной можно понятно любую, но в timer0ISR() и getTimer() необходимо обеспечить атомарность модификации и чтения переменной.
|
|
|
|
|
Jan 30 2007, 18:30
|

Любитель
    
Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695

|
Цитата(Alex03 @ Jan 30 2007, 19:07)  Тут переменных типа nStartTimerVal м.б. сколько угодно, и проверять одну засечку времени можно на несколько значений таймаута (иногда я и такое пользую  ). Разрядность таймерной переменной можно понятно любую, но в timer0ISR() и getTimer() необходимо обеспечить атомарность модификации и чтения переменной. Здесь смущает только ситуация, когда uiTimer0Count переполнится: 0xffffffff -> 0x0. При этом вычисления для текущих таймеров будут неверными. Как этого избежать? И, извиняюсь, я не знаю, что значит "обеспечить атомарность"...  А - вспомнил - одновременное действие? 2 Alex_inventorПривет! А ты действительно из Бреста?
Сообщение отредактировал sonycman - Jan 30 2007, 18:35
|
|
|
|
|
Jan 30 2007, 18:36
|
Участник

Группа: Новичок
Сообщений: 54
Регистрация: 25-01-07
Пользователь №: 24 744

|
2 zltigo Немного offtopic: А как насчёт белорусов в Латвии? Их тоже не любят, как и русских? По теме: Так как насчёт проекта. Для меня ответ на поверхности не лежит. Например: регистр VICRaw сигнализирует что, есть “необработанное прерывание”. Как он может это делать, если VicIntSelect и VicIntEnabled равны 0. И почему происходит прерывание? И что произойдет, если находится в режиме User и использовать BX. Вроде ничего не должно, но в проекте идёт срыв в SWI.
2sonycman Ну да. А ты что тоже?
|
|
|
|
|
Jan 30 2007, 18:42
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(sonycman @ Jan 30 2007, 17:30)  Здесь смущает только ситуация, когда uiTimer0Count переполнится: 0xffffffff -> 0x0. При этом вычисления для текущих таймеров будут неверными. Как этого избежать? Элементарно, на самом организуются две очереди - одна до переполнения, другая после. При переполнении счетчика меняется указатель на очередь. При ограничении диапазона половиной счетчика можно навернуь и логику обработки переполнения на старшем бите.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
  |
6 чел. читают эту тему (гостей: 6, скрытых пользователей: 0)
Пользователей: 0
|
|
|