![]() |
|
Модераторы: PILOT, ManiaK, Mazzi |
![]()
|
|
| kray20 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 8.11.2010 Репутация: нет Всего: нет |
Нужно запрограммировать термодатчик TMP03/TMP04 в среде IAR так, чтобы он измерял температуру в каждый момент времени , а потом определял среднее значение температуры . Датчик подключается к плате atmel используется вывод PB23 Temperature (вывод указан в pdf файле). В вопросе разбираюсь плохо , поэтому буду благодарен любой инф-ии: тексты аналогичных программ, советы , книги, сайты и т.п.
Присоединённый файл ( Кол-во скачиваний: 16 )
Laboratory_Board_4.pdf 3,83 Kb |
|||
|
||||
| UniBomb |
|
|||
|
Новичок ![]() ![]() ![]() Награды: 1 Профиль Группа: Завсегдатай Сообщений: 1754 Регистрация: 24.10.2006 Где: Санкт-Петербург Репутация: 9 Всего: 97 |
Я так подозреваю, что надо запрогроммировать всё же не термодатчик, а эту самую "плату atmel". Но вот что за мк - я так и не смог идентифицировать. Может быть это вымершая серия "классик"?
|
|||
|
||||
| Mazzi |
|
|||
|
Правильный ![]() ![]() Профиль Группа: Комодератор Сообщений: 825 Регистрация: 3.4.2003 Репутация: 9 Всего: 21 |
Похоже на АРМ.
Есть документация на плату? -------------------- Мне нужны помощники. |
|||
|
||||
| kray20 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 8.11.2010 Репутация: нет Всего: нет |
Да , согласен, нужно запрограммировать именно плату Atmel ! Микроконтроллер: AT91SAM7X128
Это сообщение отредактировал(а) kray20 - 14.11.2010, 23:16 |
|||
|
||||
| UniBomb |
|
|||
|
Новичок ![]() ![]() ![]() Награды: 1 Профиль Группа: Завсегдатай Сообщений: 1754 Регистрация: 24.10.2006 Где: Санкт-Петербург Репутация: 9 Всего: 97 |
||||
|
||||
| kray20 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 8.11.2010 Репутация: нет Всего: нет |
Спасибо, UniBomb ,но в даташите на датчик пример на asm , а не на си ,к сожалению !
|
|||
|
||||
| UniBomb |
|
|||
|
Новичок ![]() ![]() ![]() Награды: 1 Профиль Группа: Завсегдатай Сообщений: 1754 Регистрация: 24.10.2006 Где: Санкт-Петербург Репутация: 9 Всего: 97 |
kray20, опечатался
|
|||
|
||||
| kray20 |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 8.11.2010 Репутация: нет Всего: нет |
На одном из иностранных форумов нашел код на си по этому датчику(TMP03). Выкладываю вместе с комментарием автора этого кода :
I was looking for something else, when I discovered this black small thing lost in the middle of the components from the "A trier" (“to be tidy up”) box. TMP03 is its name. Among the numerous temperature sensors, this one has something different: instead of generating a voltage, or changing its impedance, it produces a variable pulse width ratio depending upon the temperature. Advantages: The sensor can read temperature meters far from the controller without impedance adaptator. Its provides very accurate reading without costy A/D converter. It comes in convenient TO92 package or in a flat SOT 8 pins chip; and its cheap. I decided to give him a try. First idea was to use interrupts. Quick and easy, I simply (not to say basically) used the attachInterrupt command. It worked fine. Until the time I decided to switch from one sensor to an other. Brrrm, not so clean. And finally, I decided to use a timeout in order to prevent infinite loops in case of signal failure. Arrrrgl. The attachInterrupt is not a good friend of timers. I then decided to go for a pretty ackward routine made of “wait until level changes”. Which proved to work like a charm. In addition, it is very easy to initialize and to switch from one channel to an other (as many channels as digital inputs…). The timing accuracy is 4µs, which is good enough to achieve .05 °C (Who cares about better?). Here is the code:
Что можно сказать по этому коду ?! может он подойти под мои задачи ?!
Это сообщение отредактировал(а) UniBomb - 15.11.2010, 13:01 |
||||
|
|||||
| UniBomb |
|
|||
|
Новичок ![]() ![]() ![]() Награды: 1 Профиль Группа: Завсегдатай Сообщений: 1754 Регистрация: 24.10.2006 Где: Санкт-Петербург Репутация: 9 Всего: 97 |
kray20, на вид можно сказать, что код рабочий. Смущает только число 508150 в 28 строчке, ибо судя по даташиту там должно стоять 235000. И конечно когда будете переносить код не забудьте изменить регистры (вернее даже соответствующие выводы) под свою схему.
|
|||
|
||||
| kray20 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 8.11.2010 Репутация: нет Всего: нет |
Спасибо большое, UniBomb , замечание насчет кода учту !
Укажите ,плиз, строчки, в которых нужно поменять вывод в соответствии со своей платой ! что нужно задавать в переменной selectedChannel ? Это сообщение отредактировал(а) kray20 - 15.11.2010, 23:42 |
|||
|
||||
| UniBomb |
|
|||
|
Новичок ![]() ![]() ![]() Награды: 1 Профиль Группа: Завсегдатай Сообщений: 1754 Регистрация: 24.10.2006 Где: Санкт-Петербург Репутация: 9 Всего: 97 |
Подозреваю что 24. Остальное в принципе без изменений. |
|||
|
||||
| kray20 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 8.11.2010 Репутация: нет Всего: нет |
Ни совсем понял почему 24, нельзя ли пояснить, за что конкретно отвечает переменная selectedChannel?! В чем различие между: while (PINB & signalPinMask) и while (~PINB & signalPinMask) ?! судя по комментарием ,это ожидание среза выходного сигнала термодатчика и ожидание его фронта во втором случае ! |
|||
|
||||
| UniBomb |
|
|||
|
Новичок ![]() ![]() ![]() Награды: 1 Профиль Группа: Завсегдатай Сообщений: 1754 Регистрация: 24.10.2006 Где: Санкт-Петербург Репутация: 9 Всего: 97 |
24 потому, что это вывод, (судя по таблице) к которому подключается датчик, по счёту двадцать четвёртый. Т.к. нумерация с нуля, то номер 23 (потому там и декремент). Переменная же эта задаёт маску. Первый цикл работает "пока установлен", а второй "пока не установлен". Разница в операции "~", которая инвертирует значение порта. Ну например в данном случае: PINB: 01011010010110100101101001011010 маска: 00000000100000000000000000000000 результат операции &: 00000000000000000000000000000000 А если PINB имеет следующее значение: 01011010110110100101101001011010 то результат будет: 00000000100000000000000000000000 Таким образом благодаря маске можно отслеживать какие-то конкретные выводы. |
|||
|
||||
| kray20 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 8.11.2010 Репутация: нет Всего: нет |
Большое спасибо ,UniBomb ! Теперь стало яснее !
В строке не совсем понятен побитовый сдвиг влево после декрементации: byte signalPinMask = (1<<(selectedChannel-1)); допустим в моем случае : selectedChannel=24 затем декрементируем selectedChannel=23 в двоичном коде 23 : 10111 сдвигаем 1<< : 01110 что дает побитовый сдвиг в итоге ?! |
|||
|
||||
| UniBomb |
|
|||
|
Новичок ![]() ![]() ![]() Награды: 1 Профиль Группа: Завсегдатай Сообщений: 1754 Регистрация: 24.10.2006 Где: Санкт-Петербург Репутация: 9 Всего: 97 |
Побитовый сдвиг указывает на какое место нужно поставить исходные биты. Ну например "1 << 5" можно читать как "единичный бит поставить на место пятого бита". Так и тут: 1 << 23 = 100000000000000000000000. Т.е. не нужно 23 приводить к двоичному виду, оно к тому же и не изменяется. Добавлено через 13 минут и 25 секунд И кстати говоря - в твоём случае (когда термодатчик цепляется к одной-единственной ноге и никуда не перетыкается) эту переменную можно объявить константой. |
|||
|
||||
| kray20 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 8.11.2010 Репутация: нет Всего: нет |
Спасибо большое, теперь все стало понятнее !
Начал разбираться с переменной PINB. Вы писали(в посте выше) , что в моем случае PINB это: 01011010010110100101101001011010 В моей таблице выводов в столбце pin записано 69 , если теперь 69 перевести в двоичный код это будет : 1000101 Почему это число в двоичном коде не совпадает с числом 01011010010110100101101001011010 ?! |
|||
|
||||
| UniBomb |
|
|||
|
Новичок ![]() ![]() ![]() Награды: 1 Профиль Группа: Завсегдатай Сообщений: 1754 Регистрация: 24.10.2006 Где: Санкт-Петербург Репутация: 9 Всего: 97 |
kray20, я написал "например"
|
|||
|
||||
| kray20 |
|
||||||||
|
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 8.11.2010 Репутация: нет Всего: нет |
извините, UniBomb, невнимательно прочитал ваш пост !
Я ни совсем понял тогда смысл конструкции while (PINB & signalPinMask) и while (~PINB & signalPinMask) Получается, что PINB содержит некий массив выводов и ,использую переменную signalPinMask, я могу контролировать нужный мне вывод, т.е. 23 , в цикле while . А можно заменить данную часть кода :
на
и
на
Будет ли такая замена корректной ?! Это сообщение отредактировал(а) kray20 - 23.11.2010, 11:21 |
||||||||
|
|||||||||
| UniBomb |
|
|||
|
Новичок ![]() ![]() ![]() Награды: 1 Профиль Группа: Завсегдатай Сообщений: 1754 Регистрация: 24.10.2006 Где: Санкт-Петербург Репутация: 9 Всего: 97 |
нет. Во-первых строчка "int PINB=selectedChannel-1;" вызовет ошибку из-за того, что PINB уже определена. Во-вторых не ясен смысл присвоения ему правой части
Если уж сокращать, то как-то так:
Добавлено через 2 минуты и 57 секунд И тогда в этом случае переменные signalPinMask и selectedChannel будут не нужны. Это сообщение отредактировал(а) UniBomb - 23.11.2010, 13:00 |
|||
|
||||
| kray20 |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 8.11.2010 Репутация: нет Всего: нет |
Спасибо большое, UniBomb, с сокращением теперь все ясно !
Смысл присвоения в том ,что я думал PINB нужно присвоить номер вывода термодатчика, т.е. 23 , но тут понятно ,что я ошибся ! а что в таком случае содержит переменная PINB ?! Предполагаю , что PINB=69 ,если учесть, что в таблице выводов для термодатчика в столбце: Port стоит PB24 ,а в столбце Pin стоит число 69 Это сообщение отредактировал(а) kray20 - 23.11.2010, 22:40 |
||||
|
|||||
| UniBomb |
|
|||
|
Новичок ![]() ![]() ![]() Награды: 1 Профиль Группа: Завсегдатай Сообщений: 1754 Регистрация: 24.10.2006 Где: Санкт-Петербург Репутация: 9 Всего: 97 |
kray20, я с архитектурой arm плохо знаком. Поэтому не уверен что там как устроено. Посему мои дальнейшие слова стоит проверить в документации.
Во многих контроллерах на управление портами ввода/вывода отводятся несколько регистров. В зависимости от архитектуры это количество может изменяться. Например в простом случае есть регистр направления, указывающий является вывод входом или выходом, есть регистр, который задаёт значение на выходе контроллера. PINx - это регистр, который отображает фактическое состояние выводов вне зависимости от настроек порта. Т.е. есть несколько выводов, объединённых в регистр B. Некоторые выводы настроены на вход, некоторые на выход. Но на каждом выводе в любой момент времени висит логический уровень "1" или "0". Так вот PINB покажет на каком выводе что находится. Этот регистр как правило доступен только для чтения. Т.е. нельзя изменить его содержимое. В данном микроконтроллере этот регистр называется вроде как PIO_PDSR. |
|||
|
||||
| kray20 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 8.11.2010 Репутация: нет Всего: нет |
Спасибо большое, за обстоятельное разъяснение вопроса ! Буду изучать ! Получается , что PINB мне ,скорее всего, придется переименовать на подходящий для моего контроллера регистр состояния ?!
|
|||
|
||||
| UniBomb |
|
|||
|
Новичок ![]() ![]() ![]() Награды: 1 Профиль Группа: Завсегдатай Сообщений: 1754 Регистрация: 24.10.2006 Где: Санкт-Петербург Репутация: 9 Всего: 97 |
||||
|
||||
| kray20 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 8.11.2010 Репутация: нет Всего: нет |
Спасибо, UniBomb !
открыл руководство пользователя П.П.Редькина там написано: PIO_PDSR - регистр состояния данных на ножке доступ: только для чтения Благодарю за подсказку ! |
|||
|
||||
![]()
|
| Правила форума "Микроконтроллеры (MCU) и микропроцессоры (MPU)" | |
|
|
На данный раздел помимо Правил форума распространяются текже следующие правила:
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, PILOT, ManiaK, UniBomb, Mazzi. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Микроконтроллеры (MCU) и микропроцессоры (MPU) | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |