Модераторы: PILOT, ManiaK, Mazzi

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [arm] Термодатчик TMP03/TMP04, Как запрограммировать ? 
:(
    Опции темы
kray20
Дата 8.11.2010, 23:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 8.11.2010

Репутация: нет
Всего: нет



Нужно запрограммировать термодатчик TMP03/TMP04 в среде IAR  так, чтобы он измерял температуру в каждый момент времени , а потом определял среднее значение температуры . Датчик подключается к плате atmel  используется вывод PB23 Temperature (вывод указан в pdf файле). В вопросе разбираюсь плохо , поэтому буду благодарен любой инф-ии: тексты аналогичных программ, советы , книги, сайты и т.п. 

Присоединённый файл ( Кол-во скачиваний: 16 )
Присоединённый файл  Laboratory_Board_4.pdf 3,83 Kb
PM MAIL   Вверх
UniBomb
Дата 9.11.2010, 08:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
***
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 1754
Регистрация: 24.10.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 97



Я так подозреваю, что надо запрогроммировать всё же не термодатчик, а эту самую "плату atmel". Но вот что за мк - я так и не смог идентифицировать. Может быть это вымершая серия "классик"?
PM MAIL ICQ Skype   Вверх
Mazzi
Дата 9.11.2010, 10:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Правильный
**


Профиль
Группа: Комодератор
Сообщений: 825
Регистрация: 3.4.2003

Репутация: 9
Всего: 21



Похоже на АРМ. 
Есть документация на плату?


--------------------
Мне нужны помощники.
PM MAIL WWW   Вверх
kray20
Дата 14.11.2010, 23:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 8.11.2010

Репутация: нет
Всего: нет



Да , согласен, нужно запрограммировать именно плату Atmel ! Микроконтроллер: AT91SAM7X128  

Это сообщение отредактировал(а) kray20 - 14.11.2010, 23:16
PM MAIL   Вверх
UniBomb
Дата 15.11.2010, 08:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
***
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 1754
Регистрация: 24.10.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 97



Ок. Вот тебе ссылки:

Страничка со списком справочной информации о мк.
Страничка с даташитом на температурный датчик. В даташите к тому же есть пример работы с датчиком на Си.
PM MAIL ICQ Skype   Вверх
kray20
Дата 15.11.2010, 10:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 8.11.2010

Репутация: нет
Всего: нет



Спасибо, UniBomb  ,но в даташите на датчик пример на asm , а не на си ,к сожалению  ! 
PM MAIL   Вверх
UniBomb
Дата 15.11.2010, 10:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
***
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 1754
Регистрация: 24.10.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 97



kray20, опечатался  smile
PM MAIL ICQ Skype   Вверх
kray20
Дата 15.11.2010, 12:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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:


Код

// Get actual temperature
void getTemperature(int selectedChannel){
  PORTB |=  (1<<PINB5); // Turn status led off
  long timeOut = (micros()+50000); // 50 ms
  byte signalPinMask = (1<<(selectedChannel-1));
  while (PINB & signalPinMask) { // Wait for low state on signal pin
    if (micros() > timeOut) break;
  }
  while (~PINB & signalPinMask) { // Wait for high state on signal pin
   if (micros() > timeOut) break;
  }
  long T1Start = micros();  // T1 starts now
  while (PINB & signalPinMask) { // While T1 is on
    if (micros() > timeOut) break;
  }
  long T2Start = micros();   
  long T1Duration = (T2Start - T1Start);
  while (~PINB & signalPinMask) { // While T2 is on
    if (micros() > timeOut) break;
  }
  if (micros() > timeOut) {
    errorCode = ERR_MIS_SIGNAL; // Set global variable error code
    temperature = 0;
  }
  else {
    long T2Duration = micros() - T2Start;
    errorCode = ERR_NONE; // Set global variable error code
    temperature = 508150 - long((400000.00F * T1Duration) / T2Duration);
  }
  PORTB &= ~(1<<PINB5); // Turn status led off
}


Что можно сказать по этому коду ?! может он подойти под мои задачи ?! 


M
UniBomb
Для форматирования кода не забываем использовать соответствующую кнопку




Это сообщение отредактировал(а) UniBomb - 15.11.2010, 13:01
PM MAIL   Вверх
UniBomb
Дата 15.11.2010, 13:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
***
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 1754
Регистрация: 24.10.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 97



kray20, на вид можно сказать, что код рабочий. Смущает только число 508150 в 28 строчке, ибо судя по даташиту там должно стоять 235000. И конечно когда будете переносить код не забудьте изменить регистры (вернее даже соответствующие выводы) под свою схему.
PM MAIL ICQ Skype   Вверх
kray20
Дата 15.11.2010, 22:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 8.11.2010

Репутация: нет
Всего: нет



Спасибо большое, UniBomb , замечание насчет кода учту ! 
Укажите ,плиз,  строчки, в которых нужно поменять вывод в соответствии со своей платой !
что нужно задавать в переменной selectedChannel ?

Это сообщение отредактировал(а) kray20 - 15.11.2010, 23:42
PM MAIL   Вверх
UniBomb
Дата 16.11.2010, 00:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
***
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 1754
Регистрация: 24.10.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 97



Цитата(kray20 @  15.11.2010,  22:57 Найти цитируемый пост)
что нужно задавать в переменной selectedChannel ?

Подозреваю что 24. Остальное в принципе без изменений.
PM MAIL ICQ Skype   Вверх
kray20
Дата 16.11.2010, 20:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 8.11.2010

Репутация: нет
Всего: нет



Цитата(UniBomb @ 16.11.2010,  00:06)
Цитата(kray20 @  15.11.2010,  22:57 Найти цитируемый пост)
что нужно задавать в переменной selectedChannel ?

Подозреваю что 24. Остальное в принципе без изменений.

Ни совсем понял почему 24, нельзя ли пояснить, за что конкретно отвечает переменная  selectedChannel?!


В чем различие между:  while (PINB & signalPinMask) и  while (~PINB & signalPinMask) ?!
судя по комментарием ,это ожидание среза выходного сигнала термодатчика и ожидание его фронта во втором случае ! 
                                     
PM MAIL   Вверх
UniBomb
Дата 17.11.2010, 10:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
***
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 1754
Регистрация: 24.10.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 97



Цитата(kray20 @  16.11.2010,  20:29 Найти цитируемый пост)
Ни совсем понял почему 24, нельзя ли пояснить, за что конкретно отвечает переменная  selectedChannel?!

24 потому, что это вывод, (судя по таблице) к которому подключается датчик, по счёту двадцать четвёртый. Т.к. нумерация с нуля, то номер 23 (потому там и декремент). Переменная же эта задаёт маску. 


Цитата(kray20 @  16.11.2010,  20:29 Найти цитируемый пост)
while (PINB & signalPinMask) и  while (~PINB & signalPinMask) 

Первый цикл работает "пока установлен", а второй "пока не установлен". Разница в операции "~", которая инвертирует значение порта. Ну например в данном случае:

PINB:
01011010010110100101101001011010

маска:
00000000100000000000000000000000

результат операции &:
00000000000000000000000000000000

А если PINB имеет следующее значение:
01011010110110100101101001011010

то результат будет:
00000000100000000000000000000000

Таким образом благодаря маске можно отслеживать какие-то конкретные выводы.
PM MAIL ICQ Skype   Вверх
kray20
Дата 19.11.2010, 23:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 8.11.2010

Репутация: нет
Всего: нет



Большое спасибо ,UniBomb ! Теперь стало яснее ! 
 В строке не совсем понятен побитовый сдвиг влево после декрементации:  byte signalPinMask = (1<<(selectedChannel-1));
допустим в моем случае : selectedChannel=24
затем декрементируем selectedChannel=23
в двоичном коде 23 : 10111
сдвигаем 1<< :           01110
что дает побитовый сдвиг в итоге ?! 
PM MAIL   Вверх
UniBomb
Дата 22.11.2010, 10:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
***
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 1754
Регистрация: 24.10.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 97



Цитата(kray20 @  19.11.2010,  23:40 Найти цитируемый пост)
что дает побитовый сдвиг в итоге ?! 

Побитовый сдвиг указывает на какое место нужно поставить исходные биты. Ну например "1 << 5" можно читать как "единичный бит поставить на место пятого бита". Так и тут:

1 << 23 = 100000000000000000000000.

Т.е. не нужно 23 приводить к двоичному виду, оно к тому же и не изменяется.

Добавлено через 13 минут и 25 секунд
И кстати говоря - в твоём случае (когда термодатчик цепляется к одной-единственной ноге и никуда не перетыкается) эту переменную можно объявить константой. 
PM MAIL ICQ Skype   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Микроконтроллеры (MCU) и микропроцессоры (MPU)"
PILOT ManiaK
UniBomb Mazzi

На данный раздел помимо Правил форума распространяются текже следующие правила:


  • Прежде чем создать тему воспользуйтесь поиском или посмотрите в faq. Возможно на форуме уже есть ответ на ваш или близкий к вашему вопрос.
  • В заголовке темы в квадратных скобках обозначьте используемое семейство микроконтроллера: [avr],[pic],[arm].
  • При создании темы с вопросом указывайте участок кода с ошибкой, версию компилятора, схемы подключения, fuse биты и прочие данные, которые помогут найти правильный ответ. Для форматирования текста программ используйте кнопку код.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Для флуда, просьб выполнить задание, поиска партнёров или исполнителей существуют свои разделы.
  • Если вы заметили несовместимое с правилами сообщение, то можете уведомить об этом модератора раздела нажав кнопку Репорт у соответствующего сообщения.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, PILOT, ManiaK, UniBomb, Mazzi.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Микроконтроллеры (MCU) и микропроцессоры (MPU) | Следующая тема »


 




[ Время генерации скрипта: 0.0924 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.