Перейти к содержанию
    

Только взялся за BASCOM-AVR. Подскажите как организовать измерение напряжения на встроенном АЦП? Заранее благодарен.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Только взялся за BASCOM-AVR. Подскажите как организовать измерение напряжения на встроенном АЦП? Заранее благодарен.

Скачал даташит на ATtiny2313: про встроенный АЦП там не упоминается...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Понял. Спасибо. А какой МК пойдет? С наименьшей ценой?

 

Вопрос не полный. Какой частотный диапазон измеряемого сигнала? Какой требуется динамический диапазон? Часто бывает что встроенный ADC проблемы не решает. К сожалению. Что вы собираетесь измерять?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Необходимо мерять напряжение на аккумуляторе, и в зависимости от напряжение моргать 3 светодиодами.... Т. е. требования минимальны, а вот подходящего кода нийти не мог...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Необходимо мерять напряжение на аккумуляторе, и в зависимости от напряжение моргать 3 светодиодами.... Т. е. требования минимальны, а вот подходящего кода нийти не мог...

 

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

 

Уважаемый Mener, напишите в личное письмо. Попытаюсь помочь

Изменено пользователем aai_m

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Необходимо мерять напряжение ....

 

А насколько дискретен посчёт напряжения? Если 3 светодиода - это типа уровень напряжения... может 3 компаратора на ОУ дешёвеньких поставить? Типо напряжение в диапазоне 0-12В если 10-12 - все три горят если 7-10 - два если 4-7 - один если 0-4 - ни один не горит - тогда и МК не нужён ;)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Человек хочет 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;

Обязательно при считывании сначала младший (он нам не нужен), затем - старший....

Считывать данные можно и по флагу окончания преобразования,ИМХО, ждать как-то нехорошо простаивать ресурсы...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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;

Обязательно при считывании сначала младший (он нам не нужен), затем - старший....

Считывать данные можно и по флагу окончания преобразования,ИМХО, ждать как-то нехорошо простаивать ресурсы...

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

 

В моем даташите написано вот так :)

 

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.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Человек хочет 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...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Желаю удачи!

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Огромное спасибо буду разбираться!!! :cheers:

 

Описался На одну букву там, должно быть ДЛЯ..... Прикладываю небольшую статью про описки...

______.txt

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Еще раз спасибо. Разбираюсь... Чет немогу отредактировать сообщение с ругательством.... :unsure:

Изменено пользователем Menen

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...