![]() |
|
Модераторы: 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 секунд И кстати говоря - в твоём случае (когда термодатчик цепляется к одной-единственной ноге и никуда не перетыкается) эту переменную можно объявить константой. |
|||
|
||||
![]()
|
| Правила форума "Микроконтроллеры (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. |