Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Tiny 2313
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Menen
Только взялся за BASCOM-AVR. Подскажите как организовать измерение напряжения на встроенном АЦП? Заранее благодарен.
aai_m
В ATiny2313 встроенного ADC отродясь не водилось.
AVR
Цитата(Menen @ Apr 17 2007, 17:01) *
Только взялся за BASCOM-AVR. Подскажите как организовать измерение напряжения на встроенном АЦП? Заранее благодарен.

Скачал даташит на ATtiny2313: про встроенный АЦП там не упоминается...
Menen
Понял. Спасибо. А какой МК пойдет? С наименьшей ценой?
aai_m
Цитата(Menen @ Apr 17 2007, 16:22) *
Понял. Спасибо. А какой МК пойдет? С наименьшей ценой?


Вопрос не полный. Какой частотный диапазон измеряемого сигнала? Какой требуется динамический диапазон? Часто бывает что встроенный ADC проблемы не решает. К сожалению. Что вы собираетесь измерять?
Menen
Необходимо мерять напряжение на аккумуляторе, и в зависимости от напряжение моргать 3 светодиодами.... Т. е. требования минимальны, а вот подходящего кода нийти не мог...
aai_m
Цитата(Menen @ Apr 17 2007, 17:13) *
Необходимо мерять напряжение на аккумуляторе, и в зависимости от напряжение моргать 3 светодиодами.... Т. е. требования минимальны, а вот подходящего кода нийти не мог...


Тогда пожалуй Tiny13 или Tiny26. Они выпускаются и доступны по цене.

Уважаемый Mener, напишите в личное письмо. Попытаюсь помочь
Menen
А как включить АЦП, и получать данные о напряжении?
rumit2000
Цитата(Menen @ Apr 17 2007, 18:13) *
Необходимо мерять напряжение ....


А насколько дискретен посчёт напряжения? Если 3 светодиода - это типа уровень напряжения... может 3 компаратора на ОУ дешёвеньких поставить? Типо напряжение в диапазоне 0-12В если 10-12 - все три горят если 7-10 - два если 4-7 - один если 0-4 - ни один не горит - тогда и МК не нужён wink.gif
sadat
Человек хочет AVR освоить, а вы ему вернуться на аналоговую базу....
Вот код инициализации АЦП для Tiny13:
Измеряемое напряжение на вход PB2 (DDR=0)
;блок включения АЦП
ldi R16, 0b00000100; выключили цифровой вход PB2 (ADC1)
out DIDR0,R16;

ldi R16,0b00100001 ; привязка к 5 в питания, выравнивание "меньше", MUX = 01 - PB2 ввод
; ADLAR=1 - т.е. выравнивание "влево" по ADCH-ADCL (ADCH - 0-255).
out ADMUX,R16;
ldi R16, 0b11001110; разрешили прерывание, режим одиночного с делением тактовой на 64
out ADCSRA, R16;

И по выполнению преобразования выполнится прерывание от АЦП (внимательно читать даташит - т.е. RTFM).

В обработчике прерывания считываешь ADCH - 0-0вольт, 255 - Vdd на входе.
in R16, ADCL;
nop
nop
in R16, ADCH;
Обязательно при считывании сначала младший (он нам не нужен), затем - старший....
Считывать данные можно и по флагу окончания преобразования,ИМХО, ждать как-то нехорошо простаивать ресурсы...
singlskv
Цитата(sadat @ Apr 18 2007, 00:01) *
ldi R16,0b00100001 ; привязка к 5 в питания, выравнивание "меньше", MUX = 01 - PB2 ввод
; ADLAR=1 - т.е. выравнивание "влево" по ADCH-ADCL (ADCH - 0-255).
..........................................
В обработчике прерывания считываешь ADCH - 0-0вольт, 255 - Vdd на входе.
in R16, ADCL;
nop
nop
in R16, ADCH;
Обязательно при считывании сначала младший (он нам не нужен), затем - старший....
Считывать данные можно и по флагу окончания преобразования,ИМХО, ждать как-то нехорошо простаивать ресурсы...

Раскажите пожалуйста откуда Вы взяли это "Обязательно при считывании сначала младший"

В моем даташите написано вот так smile.gif

If the result is left adjusted and no more than 8-bit precision is required, it is sufficient to
read ADCH. Otherwise, ADCL must be read first, then ADCH, to ensure that the content
of the Data Registers belongs to the same conversion. Once ADCL is read, ADC access
to Data Registers is blocked. This means that if ADCL has been read, and a conversion
completes before ADCH is read, neither register is updated and the result from the conversion
is lost. When ADCH is read, ADC access to the ADCH and ADCL Registers is
re-enabled.
Menen
Цитата(sadat @ Apr 18 2007, 00:01) *
Человек хочет AVR освоить, а вы ему вернуться на аналоговую базу....
Вот код инициализации АЦП для Tiny13:
Измеряемое напряжение на вход PB2 (DDR=0)
;блок включения АЦП
ldi R16, 0b00000100; выключили цифровой вход PB2 (ADC1)
out DIDR0,R16;

ldi R16,0b00100001 ; привязка к 5 в питания, выравнивание "меньше", MUX = 01 - PB2 ввод
; ADLAR=1 - т.е. выравнивание "влево" по ADCH-ADCL (ADCH - 0-255).
out ADMUX,R16;
ldi R16, 0b11001110; разрешили прерывание, режим одиночного с делением тактовой на 64
out ADCSRA, R16;

И по выполнению преобразования выполнится прерывание от АЦП (внимательно читать даташит - т.е. RTFM).

В обработчике прерывания считываешь ADCH - 0-0вольт, 255 - Vdd на входе.
in R16, ADCL;
nop
nop
in R16, ADCH;
Обязательно при считывании сначала младший (он нам не нужен), затем - старший....
Считывать данные можно и по флагу окончания преобразования,ИМХО, ждать как-то нехорошо простаивать ресурсы...

Это код бля Баском? Побегу за тини 13...
sadat
MENEN-у - чистый асм - это основа, без которой более "интеллектуальные" языки программирования - фикция (ИМХО).
singlskv - считывать младший байт перед считыванием старшего - будь то ADC или 16-ти разрядный таймер - это универсально и стоит использовать всегда (тоже ИМХО) - чтобы не наступать на грабли, когда захочется использовать сдвоенный регистр полностью, а по привычке "сначала старший, затем младший..."

Менен-у - извини, просмотрел, что ты хотел BASCOM - а на BASIC (т.е. основа). Но, если быть честным, у меня ушло 5 минут, чтобы найти нужный тебе код в инете...

But the ATTiny can do more. It has a 10-bit ADC on pins 1, 2, 3 and 7. An example program to read one ADC channel:
readadc.bas
'The ATTiny13 is used.
$regfile = "ATtiny13.dat"
$crystal = 1200000

Config Portb.2 = Output
Led Alias Portb.2
Config Adc = Single , Prescaler = Auto , Reference = Internal

Dim Adcin As Word

Open "comb.1:9600,8,n,1" For Output As #1
Open "comb.0:9600,8,n,1" For Input As #2
Start Adc

Do
Set Led
Waitms 500

'get adc reading on channel 3 (pin 2 on attiny13)
Adcin = Getadc(3)
Print #1 , "adc ch#3: " ; Adcin
Reset Led
Waitms 500
Loop

End

Ссылка на примеры в BASC-е.
http://www.qsl.net/pa3ckr/

Откуда часть
http://www.qsl.net/pa3ckr/bascom%20and%20a...avrs/index.html

Желаю удачи!

+ Менен-у - вроде как мат на этом форуме не используется (см. посл. сообщение). Аккуратнее...
Menen
Огромное спасибо буду разбираться!!! cheers.gif

Описался На одну букву там, должно быть ДЛЯ..... Прикладываю небольшую статью про описки...
Menen
Еще раз спасибо. Разбираюсь... Чет немогу отредактировать сообщение с ругательством.... unsure.gif
sadat
Да, есть еще и русский форум по BASCOM-у:
http://bascomavr.3bb.ru
Чем мог, тем помог. Удачи.
Menen
Цитата(sadat @ Apr 18 2007, 11:39) *
MENEN-у - чистый асм - это основа, без которой более "интеллектуальные" языки программирования - фикция (ИМХО).
singlskv - считывать младший байт перед считыванием старшего - будь то ADC или 16-ти разрядный таймер - это универсально и стоит использовать всегда (тоже ИМХО) - чтобы не наступать на грабли, когда захочется использовать сдвоенный регистр полностью, а по привычке "сначала старший, затем младший..."

Менен-у - извини, просмотрел, что ты хотел BASCOM - а на BASIC (т.е. основа). Но, если быть честным, у меня ушло 5 минут, чтобы найти нужный тебе код в инете...

But the ATTiny can do more. It has a 10-bit ADC on pins 1, 2, 3 and 7. An example program to read one ADC channel:
readadc.bas
'The ATTiny13 is used.
$regfile = "ATtiny13.dat"
$crystal = 1200000

Config Portb.2 = Output
Led Alias Portb.2
Config Adc = Single , Prescaler = Auto , Reference = Internal

Dim Adcin As Word

Open "comb.1:9600,8,n,1" For Output As #1
Open "comb.0:9600,8,n,1" For Input As #2
Start Adc

Do
Set Led
Waitms 500

'get adc reading on channel 3 (pin 2 on attiny13)
Adcin = Getadc(3)
Print #1 , "adc ch#3: " ; Adcin
Reset Led
Waitms 500
Loop

End

Ссылка на примеры в BASC-е.
http://www.qsl.net/pa3ckr/

Откуда часть
http://www.qsl.net/pa3ckr/bascom%20and%20a...avrs/index.html

Желаю удачи!

+ Менен-у - вроде как мат на этом форуме не используется (см. посл. сообщение). Аккуратнее...


Использовал примерно такой код (под рукой нет, на домашнем компе). С подключеным программатором работает, отключаю программатор (Пять проводков) измерение напряжения не работает? Незнаю в чем дело (Может фьюзы нужно запрограммировать? Контроллер тини 13, Каково значение может принимать переменная Adcin?)
PraNkiSh
Цитата(Menen @ Apr 17 2007, 17:22) *
Понял. Спасибо. А какой МК пойдет? С наименьшей ценой?


тини 2313 и мега8 в одну цену примерно.
в меге ацп есть
Menen
Цитата(PraNkiSh @ Apr 28 2007, 13:38) *
тини 2313 и мега8 в одну цену примерно.
в меге ацп есть

Чип куплен. Тини 13. АЦП работает, с включеным программатором?
Duhas
как вариант косяки в цепи питания\земли, тактирование, я думаю в любом случае, у вас от внутреннего генератора или кварца... так что если с подкл программатором работает что-то где то в науке о контактах не так ... или нету или лишний.. имхо.
Menen
Генератор внутренний 1мгц. Вход АЦП не связвн с программатором...
Amper25
Посмотри что у тебя на выводе RESET.
Для работы MCU, необходимо чтобы он был подтянут к +питания.

Может программатор его подтягивает и все работает, а когда отключаеш программатор, то MCU постоянно в состоянии reset.
Menen
стоит резистор 3.3 Ком. Много ? Поставить 1 Ком?
Amper25
Нормально 1 - 10К, подтянутый к +питания.
Должен стоять в самой схеме, а не в программаторе.
sadat
Без хотя бы словестного описания схемы помощь похожа на гадание на кофейной гуще - хотя, конечно, телепатию никто не отменял....
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.