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

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

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

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



ADC

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

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