Обсуждаем контроллеры компании Atmel.
Ответить

ATtiny25 и встроенный термодатчик

Вт янв 16, 2018 09:53:09

"Фсё ребят, берупомощьзнатоков". :)
1) ATtiny25, на ADC заведён внутренний термодатчик.
2) Раз в секунду поднимаю "Start Conversion" бит. (В прерывании от таймера).
3) Прерывания от ADC случаются.
4) Младшие биты из ADC сливаются в порт на светодиоды. (Проверка работоспособности).

При прогреве корпуса МК - данные не обновляются динамически. Но обновляются каждый раз при подаче питания (единожды). В чём подвох?

Re: ATtiny25 и встроенный термодатчик

Вт янв 16, 2018 11:42:55

в коде...?

Добавлено after 2 minutes 7 seconds:
Серый_ писал(а): берупомощьзнатоков
пока, вижу, вам нужна помощь не знатоков а медиумов :) ...

Re: ATtiny25 и встроенный термодатчик

Вт янв 16, 2018 12:08:04

Или анализ даташитов нескольких подряд выпусков да со всеми имевшими публикацию ерратами...
:?

Re: ATtiny25 и встроенный термодатчик

Вт янв 16, 2018 12:29:05

А что код даст? Тут аппаратное что-то. Может из за-того, что порт VS Reset как-то "не того"...
Спойлер.include "tn25def.inc"
.def ter = r19 ;хранение значение ADC температуры
.equ fleg = 244 ;флегмирование процессов 244 = неточная секунда
.cseg

;ВЕКТОРЫ ПРЕРЫВАНИЙ
rjmp reset
.org 0x0003 ;таймер 1 канал A [48]
rjmp int_timer1A
.org 0x0008 ;от ADC (результат готов)
rjmp int_adc

;ПРЕДКОНФИГ КОНТРОЛЛЕРА
reset: ldi r16,RAMEND ;стек на весь RAM [16]
out spl,r16
ldi r16,0b10000000 ;отключение аналогового компаратора [120]
out ACSR,r16
ldi r16,0b00011111 ;нужные электроды на вывод [64]
out ddrB,r16
;настройка таймера 1
ldi r16,fleg ;коэффициент флегмирования процессов канал A [91]
out ocr1A,r16
ldi r16,0b01000000 ;прерывание по совпадению в канале A [92]
out TIMSK,r16
ldi r16,0b10001101 ;режим CTC, клок таймера /4096 [89,90]
out tccr1,r16 ;таймер пошёл
;настройка ADC
ldi r16,0b10001111 ;опорка 1V1, >R-результат, ADC4-термосенсор [134]
out ADMUX,r16
ldi r16,0b10001111 ;ADC-вкл, Start-выкл, прерывание вкл, клок /128 [136]
out ADCSRA,r16

;---- ОСНОВНАЯ ПРОГРАММА ----
sei ;разрешить прерывания глобально
start: rjmp start ;вертеться здесь

;================= ПРЕРЫВАНИЕ ТАЙМЕР 1 СОВПАДЕНИЕ С КАНАЛОМ A
int_timer1A: brtc clea ;T сброшен = к зажжению светодиода
clt ;иначе сбросить T
;cbi portB,3 ;погасить светодиод (на заюзано)
rjmp next ;и к выходу
clea: set ;установить T
;sbi portB,3 ;зажечь светодиод (не заюзано)
next: sbi ADCSRA,6 ;запускать ADC
reti ;выход
;================= ПРЕРЫВАНИЕ ОТ ADC (РЕЗУЛЬТАТ ГОТОВ)
int_adc: in ter,ADCL ;забрать значение ADC в ter
cbr ter,0b11110000 ;обнулить старший полубайт
out portB,ter ;выдать в порт B (1=зажжение)
reti ;выход

Re: ATtiny25 и встроенный термодатчик

Вт янв 16, 2018 12:52:59

А что код даст?

Насколько я понял из кода, регистр ADCH не читается… если так, то это неправильно…

Re: ATtiny25 и встроенный термодатчик

Вт янв 16, 2018 13:20:23

точно - при чтении обязательно прочитать сначала младший байт, потом старший, т.е. сначала ADCL, потом ADCH, если он не нужен - читай его в какой нибудь темп регистр и забудь там...

Re: ATtiny25 и встроенный термодатчик

Вт янв 16, 2018 14:39:26

:))) Спс, код таки = что-то дал. Заработало. Прокол был в том, что спутал "процедуру забора" с чем-то, где надо обрабатывать вначале High, потом Low. Как результат пробовал так:

in ter,ADCH ;верх забрать впустую
in ter,ADCL ;туда же налепить низ и... этот вариант нерабочий (тем не менее при включении оно почему-то прокатывало)

И того, ваш рабочий вариант:

in ter,ADCL ;забрать Low
in r16,ADCH ;забрать High куда-либо (процедура забора обязательна)

Re: ATtiny25 и встроенный термодатчик

Вт янв 16, 2018 17:19:16

сам шпаргалкой пользуюсь :) при записи в одном порядке, при чтении наоборот...

Re: ATtiny25 и встроенный термодатчик

Вт янв 16, 2018 17:23:30

Если Вам нужен 8битный АЦП , то можно включить бит ADLAR (выравнивание по левому краю) и считывать данные только с ADCH. Если конечно ИОН подойдет для входного сигнала.

Re: ATtiny25 и встроенный термодатчик

Вт янв 16, 2018 19:21:29

Тоже близко к "варианту". Показания меж светодиодами задуманы в 5°C. Но без 2-х младших битов это будет шаг = 4,64°C. (Правда, "планую" для промежуточных значений - "светодиод мигает"). В общем при любом сдвиге, "шаго-коэффициент" = 1,16°C, если приспичит поточнее - числа после запятой всё равно мутить.

P. s. тоже просчитался :))) Шаг ADC составляет 0,85°C. Соответственно при L-результате 0,85 х 4 = шаг 3,4°C
Последний раз редактировалось Серый_ Ср янв 17, 2018 10:34:17, всего редактировалось 1 раз.

Re: ATtiny25 и встроенный термодатчик

Вт янв 16, 2018 21:06:24

И того, ваш рабочий вариант:

in ter,ADCL ;забрать Low
in r16,ADCH ;забрать High куда-либо (процедура забора обязательна)

Лично я копирую сразу весь регистр ADC в двухбайтный регистр Y или Z или W, и никогда не было танцев с бубном.

Re: ATtiny25 и встроенный термодатчик

Ср янв 17, 2018 02:43:48

Лично я копирую сразу весь регистр ADC в двухбайтный регистр Y или Z или W, и никогда не было танцев с бубном.

Да? Ваш пример в студию, плиз.

Re: ATtiny25 и встроенный термодатчик

Ср янв 17, 2018 19:24:09

Ваш пример в студию

1.png
(1.8 KiB) Скачиваний: 457

Re: ATtiny25 и встроенный термодатчик

Ср янв 17, 2018 20:17:04

удобно, если откомпилить, а потом ничего не меняя наводить мышку, то высвечивается из чего какая операция состоит...
например это копирование состоит из 2х, и тут сам АБ следит за очерёдностью.

Re: ATtiny25 и встроенный термодатчик

Ср янв 17, 2018 21:50:44

например это копирование состоит из 2х, и тут сам АБ следит за очерёдностью.

Компилятор Си предполагаю поступает аналогично… а вообще данный нюанс хорошо расписан у Евстифеева.
Обращение к регистрам ADCH и ADCL для получения результата преобразования должно выполняться в определенной последовательности: сначала необходимо прочитать регистр ADCL, а затем ADCH. Это требование связано с тем, что после обращения к регистру ADCL процессор блокирует доступ к регистрам данных со стороны АЦП до тех пор, пока не будет прочитан регистр ADCH. Благодаря этому можно быть уверенным, что при чтении регистров в них будут находиться составляющие одного и того же результата. Соответственно, если очередное преобразование завершится до обращения к регистру ADCH, результат преобразования будет потерян.

Re: ATtiny25 и встроенный термодатчик

Чт янв 18, 2018 03:43:21

1.png

Ггг. А теперь откройте в дизассемблере ваш пример и посмотрите, как это будет выглядеть в командах. МК 8 битный. И есть только одна команда копирования сразу из двух регистров в два - movw. И то, только с рабочими регистрами.

Re: ATtiny25 и встроенный термодатчик

Чт янв 18, 2018 06:25:22

Так тут всё норм - копирует поочереди, но он этого и не скрывает, а вот пару регистров в пару регистров - за раз. также за раз выполнятся операции вида "RR-const" => SBIW RWl,K "RR+const" => ADIW RWl,K. в справке это всё тоже описано

Добавлено after 28 minutes 8 seconds:
Главная то мысль в том, что, правильное чтение регистров - в АБ не проблема программиста

Re: ATtiny25 и встроенный термодатчик

Чт янв 18, 2018 07:31:28

Мне за ассемблер можно не объяснять. И речь шла о командах пересылки данных. Я потому и сказал, пусть покажет пример копирования регистра ADC в рабочие регистры ЗА РАЗ. А это как раз и невозможно в случае регистров периферии и рабочих регистров.

Re: ATtiny25 и встроенный термодатчик

Чт янв 18, 2018 14:48:08

Ггг. А теперь откройте в дизассемблере ваш пример и посмотрите, как это будет выглядеть в командах.

Я прекрасно знаю как выполняются действия компилятором то что я пишу. :wink: При чём здесь компилятор!? Речь шла обо мне, а не о компиляторе. :)))

Re: ATtiny25 и встроенный термодатчик

Чт янв 18, 2018 15:20:17

Ггг. А теперь откройте в дизассемблере ваш пример и посмотрите, как это будет выглядеть в командах.

Я прекрасно знаю как выполняются действия компилятором то что я пишу. :wink: При чём здесь компилятор!? Речь шла обо мне, а не о компиляторе. :)))

Вы написали, что копируете ADC сразу в регистры XYZ, а речь шла о порядке записи-чтения регистров ADCL и ADCH.
Ответить