[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
mcp3201 и SPI интерфейс
marss70Дата: Среда, 08.05.2013, 23:18 | Сообщение # 1
Группа: Проверенные
Сообщений: 80

Статус: Offline
На днях баловался с SPI интерфейсом и нашёл ему применение для работы с АЦП mcp 3201. В проте вроде как работает. Вот код, если кому интересно:

'mcp3201 example
$regfile = "m8def.dat"
$crystal = 4000000
$hwstack = 40
$swstack = 16
$framesize = 32
$baud = 9600
Dim A As Byte                                               'hold each bit coming from the ADC
Dim Temp As Byte                                            'each tick of the clock
Dim T As Long
Dim T1 As Single
                                            'var that will hold result
Config Portb.0 = Input
Config Portb.2 = Output
Config Portb.3 = Output

Clk Alias Portb.2
Cs Alias Portb.3

Set Cs                                                      'begin with high

Config Lcdpin = Pin , Rs = Portc.0 , E = Portc.1 , Db4 = Portc.2 , Db5 = Portc.3 , Db6 = Portc.4 , Db7 = Portc.5
Config Lcd = 16 * 1
Cursor Off
Cls
Lcd "Volt"
Waitms 200

Do

 Reset Clk
 Reset Cs                                                   'select chip

Gosub Pulse
Gosub Pulse                                                 'extra clock for sync

 A = 0 : T = 0

 For Temp = 1 To 15                                         'start a new measure

 T = T * 2                                                  'send the bit (i) one place to left

 Gosub Pulse                                                'send a clock pulse

 T = T + A                                                  'grab the last bit

 If Pinb.0 = 1 Then                                         'read a new bit
 A = 1
 Else
 A = 0
 End If

 Next

 Set Cs

 Printbin T
 T1 = T * 1.0
 T1 = T1 / 4000

  Cls
 Lcd Fusing(t1 , "##.###" )

 Waitms 200

Loop

End

Pulse:
 Set Clk
 Waitus 10                                                  ' 10 us wait
 Reset Clk
Return
Прикрепления: mcp3201_atmega8.dsn (158.5 Kb)


 
KolesikNNДата: Среда, 03.07.2013, 10:37 | Сообщение # 2
Группа: Пользователи
Сообщений: 14

Статус: Offline
Жесть код, я такого еще не видел. Если он работает по SPI, почему его не настроил. Или оператор shiftin, чем не понравился? Есть пример, корявенький правда, но рабочий.
Прикрепления: Shiftin.bas (1.6 Kb)


 
marss70Дата: Среда, 03.07.2013, 22:54 | Сообщение # 3
Группа: Проверенные
Сообщений: 80

Статус: Offline
Ну судя по буржуйским коментам, код не совсем мой. Некоторые допилы мои. Кстати, на таком же принципе считывания у меня в железе и mcp3551 работает.

 
pchela5Дата: Суббота, 22.11.2014, 13:46 | Сообщение # 4
Группа: Свой человек
Сообщений: 85

Статус: Offline
'******* Управление ADC *******
Cs Alias Portc.2
D_in Alias Pinc.3
Clk Alias Portc.4
Set Cs

Dim Counter_cicle As Byte 'Счетчик цикла
Dim Adcvolume As Word     'Выходное значение MCP3201 за цикл
 
Dim Adc_mcp3201 As Word    'Итоговые данные с MCP3201

Declare Sub Metering  

'*********** Metering ADC ***********
Sub Metering
' обнуление переменных
Adcvolume = 0 : Adc_mcp3201 = 0

For Counter_cicle = 0 To 15

  Reset Cs : Waitms 5 : Bitwait D_in , Reset     ' выбор кристалла - старт MCP3201
Set Clk : Waitms 2 : Reset Clk : Waitms 2    '
Set Clk : Waitms 2 : Reset Clk : Waitms 2     ' отправка начальных импульсов для инициализации MCP3201
Set Clk : Waitms 2 : Reset Clk : Waitms 2     '

Shiftin D_in , Clk , Adcvolume , 0     ' получение 16-ти разрядного слова
Shift Adcvolume , Right , 4    ' сдвиг вправо для 12-ти разрядного числа
Set Cs     ' выбор кристталла - стоп MCP3201
Adc_mcp3201 = Adc_mcp3201 + Adcvolume     ' накопление данных

Next Counter_cicle

Shift Adc_mcp3201 , Right , 4     'сдвиг вправо на 4 разряда - делим на 16 для усреднения результатов
End Sub


 
pchela5Дата: Суббота, 22.11.2014, 21:32 | Сообщение # 5
Группа: Свой человек
Сообщений: 85

Статус: Offline
Ну и до кучи, что бы не потерялось у меня:

'* * * конфигурируем scl и sda пины
Config Sda = Portc.4 ' I2C Data
Config Scl = Portc.5 ' I2C Clock
Const Mcp3221 = &H9B ' I2C Address
Dim Reg1 As Byte ' 1' register
Dim Reg2 As Byte ' 2' register
Dim Result_1 As Word ' result of the conversion
Dim Adc_out As Single 'Измеренное значение напряжения
Dim Adc_string As String * 5 'Измеренное значение напряжения
Declare Sub Conversion
Multiplier = 0.001  

'*********** Conversion ADC ***********
Sub Conversion

I2cstart
I2cwbyte Mcp3221 ' send the I2C address of the adc
Waitms 1
I2crbyte Reg1 , Ack ' MSB of the conversion
I2crbyte Reg2 , Nack ' LSB of the conversion
I2Cstop

Result_1 = Reg1 ' Fist part of the conversion
Shift Result_1 , Left , 8
Result_1 = Result_1 + Reg2 ' Add the lowest part of the conversion
' Shift Result_1 , right , 8
Adc_out = Multiplier * Result_1
Adc_string = Fusing(adc_out , "#.###")

End Sub
Прикрепления: _2.dsn (85.7 Kb)




Сообщение отредактировал pchela5 - Суббота, 22.11.2014, 21:37
 
  • Страница 1 из 1
  • 1
Поиск: