Администрация форума не несёт ответственности за достоверность информации и оставляет за собой право редактировать или в особых случаях даже удалять посты без предупреждения. Спасибо за понимание.

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » ADC в восьмибитном режиме.


ADC в восьмибитном режиме.

Сообщений 1 страница 23 из 23

1

Друзья кто-нибудь в курсе как считывать только 8 бит ацп? Пробую устанавливать бит ADLAR регистра ADMUX (ADMUX.5 = 1 или ADMUX = &b00100000)  и считывать ADCH, результат не меняется, в симуляторе значение ADMUX меняется на 0x20, вроде так и должно быть а толку нет. Пробовал мегу8 и тини13 в симуляторе. Ощень хочется. Версия 2.0.5.0.

0

2

Вот это

Код:
$regfile = "m8def.dat"
$Crystal=4000000
$hwstack=32
$swstack=8
$framesize=50

Config Adc = Single , Prescaler = Auto
Admux.5 = 1


Do
Print Adch
Print Adcl
Print Bin(admux)
Waitms 10

Loop

и вот это

Код:
$regfile = "m8def.dat"
$Crystal=4000000
$hwstack=32
$swstack=8
$framesize=50

Config Adc = Single , Prescaler = Auto
Admux.5 = 0


Do
Print Adch
Print Adcl
Print Bin(admux)
Waitms 10

Loop

абсолютно одинаковые цифры шлют в терминал, при этом ADMUX переключается как надо, это лыжи не едут?

0

3

Тот же код в протеусе ADCH & ADCL показывает 0 при любом раскладе. ADMUX нормально показывает.

0

4

Именно под Atmega8 ?

0

5

На тиньке13 тоже самое.

0

6

Показать где искать, или показать, как настроить?

0

7

И то и другое если можно.

0

8

Atmega8A - документация

стр. 190-191

23.8.1 ADMUX – ADC Multiplexer Selection Register – ADMUX

Вам нужен этот бит в регистре:

Bit 5 – ADLAR: ADC Left Adjust Result



У Вас не настроен источник, относительно которого АЦП будет мерять!


Отредактировано sasha_1973 (2015-06-28 20:21:25)

0

9

В Вашем случае

  Config Adc = Single , Prescaler = Auto ,  Reference = Avcc

  Admux.5 = 1

 

  ну и дальше на измерение, когда нужно.

0

10

Не в этом счастье, Aref настроено при REFS1 & REFS0 = 0 куда у меня подключено 5в. Это работает нормально в 10-битном режиме, нормально читается через Getadc(0), приспичило меня читать восемь бит, в железе проверить не могу, железка уже уехала.

0

11

Скинул Вам на mail

Симуляция + исходник

Исходник

$map       ' Получаем карту распределения памяти компилятором Bascom
  $regfile = "m8def.dat"
  $crystal = 1000000       ' 18.432 МГц
  $framesize = 64       ' Размер области используемой и необходимой для преобразований
  $hwstack = 64       ' Размер аппаратного стека
  $swstack = 64       ' Размер программного стека
  $baud = 4800
  Ucsra.u2x = 1       ' Baud = Baud * 2

'===============================================================================
'                      Н А С Т Р О Й К А     АЦП
'===============================================================================
  Config Adc = Single , Prescaler = 128 , Reference = Avcc
  Admux.adlar = 1

  On Adc Обработка_прерывания_adc Nosave

  Dim Данные_ацп_byte As Byte

'--------------  Разрешаем работу необходимых прерываний  ----------------------
  Enable Adc
'-------------  Разрешаем работу всех включенных прерываний  -------------------
  Enable Interrupts       ' Разрешаем работу прерываний
'===============================================================================
'                   Г Л А В Н Ы Й         Ц И К Л
  Главный_цикл:
'===============================================================================

   Print Данные_ацп_byte

   Waitms 500

   !in R16 , Admux
   !andi R16 , &B_1111_0000
   !ori R16 , 0       ' 0...5 - номер канала АЦП
   !out admux , R16
   Start Adc       ' Старт измерения
   Power Adcnoise       ' Ждём измерения

'===============================================================================
  Goto Главный_цикл
End
'===============================================================================

'===============================================================================
  Обработка_прерывания_adc:
'-------------------------------------------------------------------------------
    !push R16
   'стр. 193
   '23.8.3.2 ADLAR = 1
   'Consequently, if the result is left adjusted and no more than 8-bit precision is required, it is sufficient to read ADCH
    !in R16 , Adch
    !sts {Данные_ацп_byte} , R16
    !pop R16
    !reti
'-------------------------------------------------------------------------------
  Return
'===============================================================================

http://sh.uploads.ru/t/YK0Sh.jpg

Отредактировано sasha_1973 (2015-06-28 21:13:31)

0

12

Круто, попробую разобраться, в ассемблере вообще дятел.
Спасибо!

0

13

Если номер канала АЦП менять не нужно, этот фрагмент кода

   !in R16 , Admux
   !andi R16 , &B_1111_0000
   !ori R16 , 0       ' 0...5 - номер канала АЦП
   !out admux , R16

можно удалить.

Т.к., обработка прерывания написана на ASM AVR, не забывайте про инструкцию "Nosave", в противном случае сорвёте стек!

Отредактировано sasha_1973 (2015-06-28 21:16:47)

0

14

Если не нравится ассемблер, тогда вот:

Чистый Bascom

$map       ' Получаем карту распределения памяти компилятором Bascom
  $regfile = "m8def.dat"
  $crystal = 1000000       ' 18.432 МГц
  $framesize = 64       ' Размер области используемой и необходимой для преобразований
  $hwstack = 64       ' Размер аппаратного стека
  $swstack = 64       ' Размер программного стека
  $baud = 4800
  Ucsra.u2x = 1       ' Baud = Baud * 2

'===============================================================================
'                      Н А С Т Р О Й К А     АЦП
'===============================================================================
  Config Adc = Single , Prescaler = 128 , Reference = Avcc
  Admux.adlar = 1

  Dim Данные_ацп_byte As Byte

'--------------  Разрешаем работу необходимых прерываний  ----------------------
  Enable Adc
'-------------  Разрешаем работу всех включенных прерываний  -------------------
  Enable Interrupts       ' Разрешаем работу прерываний
'===============================================================================
'                   Г Л А В Н Ы Й         Ц И К Л
  Главный_цикл:
'===============================================================================

   Print Данные_ацп_byte

   Waitms 500

   Start Adc       ' Старт измерения
   Power Adcnoise       ' Ждём измерения
   Данные_ацп_byte = Adch       ' Забираем данные

'===============================================================================
  Goto Главный_цикл
End
'===============================================================================

0

15

Если не нравятся прерывания и тихий час, тогда вот:

Без прерываний и спящих режимов

$map       ' Получаем карту распределения памяти компилятором Bascom
  $regfile = "m8def.dat"
  $crystal = 1000000       ' 18.432 МГц
  $framesize = 64       ' Размер области используемой и необходимой для преобразований
  $hwstack = 64       ' Размер аппаратного стека
  $swstack = 64       ' Размер программного стека
  $baud = 4800
  Ucsra.u2x = 1       ' Baud = Baud * 2

'===============================================================================
'                      Н А С Т Р О Й К А     АЦП
'===============================================================================
  Config Adc = Single , Prescaler = 128 , Reference = Avcc
  Admux.adlar = 1

  Dim Данные_ацп_byte As Byte
'===============================================================================
'                   Г Л А В Н Ы Й         Ц И К Л
  Главный_цикл:
'===============================================================================

   Print Данные_ацп_byte

   Waitms 500

   Adcsra.adsc = 1       ' Старт измерения
  Ждем_измерения:
   If Adcsra.adif = 0 Then
       Goto Ждем_измерения
   End If

   Данные_ацп_byte = Adch       ' Забираем данные

'===============================================================================
  Goto Главный_цикл
End
'===============================================================================

0

16

Реализация задачи, зависит от конкретных потребностей.

Здесь  ещё варианты реализаций измерений АЦП.

Отредактировано sasha_1973 (2015-06-28 21:52:05)

+1

17

Спасибо огромное, в моём варианте заработало вот так

Код:
$regfile = "m8def.dat"
$Crystal=4000000
$hwstack=32
$swstack=8
$framesize=50

Config Adc = Single , Prescaler = Auto
Admux.5 = 1

Enable Interrupts
Enable Adc


Do

Power Adcnoise
Print Adch
Waitms 500


Loop

Power Adcnoise не хватало и включения прерываний и ацп, в десятибитном же режиме и без этого работает

Отредактировано aleksey (2015-06-28 22:18:54)

0

18

Зачем Вам вообще 8-ми битный режим, неужели так нужна скорость, тогда почему Prescaler = Auto?

0

19

Для того чтобы напрямую переводить ADC -> PWM без дополнительной математики и для общего развития.

0

20

Общее развитие - двигатель прогресса!

0

21

aleksey написал(а):

Для того чтобы напрямую переводить ADC -> PWM без дополнительной математики и для общего развития.

там же примитивная математика, используйте просто команду сдвига "SHIFT" на два бита

+1

22

ну я то не математик и не программист, спасибо, буду знать

0

23

если значения на выходе всегда получаются больше 255 - значит крутите не в ту сторону шифтом :)

0


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » ADC в восьмибитном режиме.