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

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

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

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



ADC

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

1

ADC работает, проверил канал 0, 10 и 11
НО. Ощущение, что какая-то подтяжка внутри, на любом входе. Порты настроены согласно документации и примеру.
Вычитываю 8 старшие биты (из 10)
Соединяю вход ADC с минусом питания - 34, соединяю с +5в - 245

Попробовал вычитать данные канала 15 (опорное напряжение) - или я неверно считаю, или - но разница колоссальная!

Установил тактовую не 8, а 11 МГц - без разницы.

Код:
$regfile = "STC_8H.DAT"       ' STC registers list
$crystal = 11059200           ' CPU clock frequence
$ramsize = 512
$romstart = &H0               ' code starting address

Dim Dat_w As Word , Temp As Byte

My_led Alias P1.2

'-----------------------------------------
P1ie = &B1111_1111            ' 1: Enable digital pins
P1pu = &B0000_0000            ' 1: pull-up resistor
P1m0 = &B_1010_0110 : P1m1 = &B_0000_0000       ' output mode

P3ie = &B1111_1011            ' 1: Enable digital pins
P3pu = &B0000_0000            ' 1: pull-up resistor
P3m0 = &B_0000_0000 : P3m1 = &B0000_1000       ' output mode

'-----------------------------------------
'UART1
P_sw1 = &H00                  'RXD/P3.0, TXD/P3.1
'P_sw1 = &H40                              'RXD_2/P3.6, TXD_2/P3.7
'P_sw1 = &H80                              'RXD_3/P1.6, TXD_3/P1.7

Scon = &H52                   ' 8-Bits And Variable Baudrate
Auxr = &H54                   'Timer is 1T mode, use Timer1 as baudrate generator
Tmod = 2                      'Set timer work mode

Tl1 = &HE8 : Th1 = &HFF       'Initial timer - 115200 / 11059200
'Tl1 = &HE0 : Th1 = &HFE                   'Initial timer - 9600 / 11059200
'Tl1 = &HF3 : Th1 = &HFF                   'Initial timer - 19200 / 1MHz
'Tl1 = &HF3 : Th1 = &HFF                   'Initial timer - 38400 / 2MHz
'Tl1 = &HCC : Th1 = &HFF                   'Initial timer - 38400 / 8MHz

Et1 = 0                       'Disable Timer interrupt
Tr1 = 1                       'Timer1 start run
Sbuf = 0                      ' Magic ...

'-----------------------------------------
'ADC
Adccfg = &B0000_1111          '/2/16
Adc_contr = &B1000_1011       ' ADC_Power, Channel=11 P3.3

'P_sw2.7 = 1
'Adctim = &H3F                             ' 0011_1111
'P_sw2.7 = 0

'-----------------------------------------------------------------------------

Do
  Adc_contr.6 = 1             ' ADC start 1=On
  While Adc_contr.5 = 0 : Wend  ' ADC Flag  
  Temp = Adc_res
  Temp = Temp - 33
  Print "ADC: " ; Temp
  Adc_contr.5 = 0
  Waitms 200
Loop

0

2

Измерение температуры NTC 10K B3950
табличный метод. Значения температуры 0-99С

Код:

$regfile = "8H1K28.DAT"              ' STC registers list
$crystal = 5529600                   ' на самом деле 8.0 МГц
$ramsize = 1024                      ' External RAM memory - XRAM

Dim Temp As Byte : Dim Temp_w As Word
Dim Adc_dat As Byte
Dim Gradus As Byte

'-----------------------------------------
P3ie = &B1111_1011                   ' 1: Enable digital pins
P3pu = &B0000_0000                   ' 1: pull-up resistor
P3m0 = &B_0000_0000 : P3m1 = &B0000_1000       ' output mode

'-----------------------------------------
'UART1
P_sw1 = &H00                         'RXD/P3.0, TXD/P3.1
'P_sw1 = &H40                              'RXD_2/P3.6, TXD_2/P3.7
'P_sw1 = &H80                              'RXD_3/P1.6, TXD_3/P1.7

Scon = &H52                          ' 8-Bits And Variable Baudrate
Auxr = &H54                          'Timer is 1T mode, use Timer1 as baudrate generator
Tmod = 2                             'Set timer work mode

'65536-(8000000/19200)/4 =  65431 FF97
Th1 = &HFF : Tl1 = &H97

Et1 = 0                              'Disable Timer interrupt
Tr1 = 1                              'Timer1 start run
Sbuf = 0                             ' Magic ...

'-----------------------------------------
'ADC
Adccfg = &B0000_1111                 'Данные АЦП СЛЕВА /2/16
Adc_contr = &B1000_1010              ' ADC_Power, Channel=10 P0.2


'-----------------------------------------------------------------------------
  Print " Start!"

Do
  Adc_contr.6 = 1                    ' ADC start 1=On
  While Adc_contr.5 = 0 : Wend  ' ADC Flag  
  Adc_dat = Adc_resh
  Print "ADC: " ; Adc_dat
  Adc_contr.5 = 0

 Restore Tabl_adc
 For Gradus = 0 To 99
  Read Temp
  If Adc_dat >= Temp Then Exit For
 Next
 Print Temp
 Print "Температура: " ; Gradus
 Print

 Waitms 255
Loop


Tabl_adc:
' Таблица суммарного значения АЦП в зависимости от температуры.
' От большего значения температуры - к меньшему: 0-99'C
' Для построения таблицы использованы следующие парамертры:
' R1(T1): 10кОм(25°С)
' Таблица R/T характеристик:  B25/100:3950K
' R(верхний): 10кОм
' Напряжения U0/Uref: 5В/5В
Data 195 , 193 , 190 , 188 , 185 , 183 , 180 , 178
Data 175 , 172 , 170 , 167 , 164 , 162 , 159 , 156
Data 153 , 150 , 148 , 145 , 142 , 139 , 136 , 134
Data 131 , 128 , 125 , 122 , 120 , 117 , 114 , 111
Data 109 , 106 , 104 , 101 , 99 , 96 , 94 , 91
Data 89 , 87 , 85 , 82 , 80 , 78 , 76 , 74
Data 72 , 70 , 68 , 66 , 65 , 63 , 61 , 59
Data 58 , 56 , 55 , 53 , 52 , 50 , 49 , 47
Data 46 , 45 , 43 , 42 , 41 , 40 , 39 , 38
Data 37 , 36 , 35 , 34 , 33 , 32 , 31 , 30
Data 29 , 28 , 28 , 27 , 26 , 25 , 25 , 24
Data 23 , 23 , 22 , 21 , 21 , 20 , 20 , 19
Data 19 , 18 , 18 , 17

0

3

Вместо цикла лучше применить LOOKDOWN (если конечно график линеаризирован).
В ADC_dat можно разместить оверлеем ADC_dat_lb (работа с байтом быстрее)

Отредактировано Кот Обормот (2024-11-24 11:32:17)

0

4

у меня иной алгоритм, ровно обратный ))

0

5

Убил кучу времени, нашел особенность. В Документации каких-то указаний не встречал. Конечно, мог упустить...

При изменении канала АЦП, после сброса флага Завершения преобразования в АЦП
ПЕРЕД считыванием данных из регистров сделать паузу больше 500 uS (я делал waitms 1).
Банальное повторное считывание не прокатывает! Именно пауза требуется!
Замечено как в stc8h1k28, так и stc81h8k64u

PS
отмена предыдущего заявления ))
Судя по дальнейшим тестам, не работает Bitwait
Никогда её не любил, но тут применил. И зря!
Заменил на While Adc_contr.5 = 0 : Wend  и всё заработало без паузы!

0

6

Александр Д. написал(а):

Заменил на While Adc_contr.5 = 0 : Wend  и всё заработало без паузы!

А "BitWait Adc_contr.5, Reset" не прокатит?

Отредактировано sva-don (2025-01-10 21:07:52)

0

7

не-а, код получается тот же и не рабочий.
Везде, где были проблемы в коде - все были с bitwait.
Замена на while/wend их решила, хотя и увеличением размера кода.

Да, странно, но таких ляпов я нашел в Bascom-51 много )) Особенно в документации.

ps
Кстати, замена While/wend командой  Do/Loop Until экономит память программы.
Прямо таки интересно потом посмотреть разницу в ассме ))

+1

8

Эта разница (while\do) и в AVR-версии имеется.

0

9

Входное сопротивление АЦП исследовалось? Если да, то какой разброс между каналами?

0

10

Получаем немножко случайное число. В некоторых применениях достаточный способ. Цикл для экономии можно совместить с другими операциями.

Код:
'Данные АЦП справа \ МИН скорость
Adccfg = &B0010_1111

'ADC_Power, Channel=15 (TEST)
Adc_contr = &B1000_1111

Dim Pix_idx As Byte : Dim Rand As Byte

Pix_idx = 0
Do

   'ЗАПУСК АЦП
   Adc_contr.6 = 1

   'ЖДЁМ РЕЗУЛЬТАТ АЦП
   Do : Loop Until Adc_contr.5 = 1

   Rand = Rand + Adc_resl

   'ДЕЛАЕМ МЛАДШИЙ БИТ СТАРШИМ
   'ЗАВИСИТ ОТ ЧИСЛА ИТЕРАЦИЙ В ЦИКЛЕ
   'ПРИ ОТНОСИТЕЛЬНО БОЛЬШОМ ЧИСЛЕ ИТЕРАЦИЙ
   'МОЖНО НЕ ПРИМЕНЯТЬ
   Rotate Rand , Right , 1

   Incr Pix_idx
Loop Until Pix_idx = 240

Отредактировано Кот Обормот (2025-10-19 14:25:08)

0

11

playing around today some tests

i think resftm (bit 5) in adccfg must set to 1 (correct order of bits)

Adccfg = &B0010_1111       '/2/16
also take care of both Adc_res (top 2 /4 bits) and Adc_resl  (low 8bits)

Код:
   Adc_contr.6 = 1       ' ADC start 1=On
   While Adc_contr.5 = 0 : Wend       ' ADC Flag
   Adc_value = Adc_res
   Shift Adc_value , Left , 8
   Adc_value = Adc_resl + Adc_value
   Print "ADC: " ; Adc_value 

this gives me values from 3 (inside error) to 4095 , (4096 = 12 bit) which all sound correct

Отредактировано plouf (2026-03-30 02:16:43)

0