| 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
 
 
 |  
 |  |  |  | 
| 
| KolesikNN | Дата: Среда, 03.07.2013, 10:37 | Сообщение # 2 |  | Группа: Пользователи Сообщений: 14 
 Статус: Offline | Жесть код, я такого еще не видел. Если он работает по SPI, почему его не настроил. Или оператор shiftin, чем не понравился? Есть пример, корявенький правда, но рабочий. 
 
 |  
 |  |  |  | 
| 
| marss70 | Дата: Среда, 03.07.2013, 22:54 | Сообщение # 3 |  | Группа: Проверенные Сообщений: 80 
 Статус: Offline | Ну судя по буржуйским коментам, код не совсем мой. Некоторые допилы мои. Кстати, на таком же принципе считывания у меня в железе и mcp3551 работает. 
 
 |  
 |  |  |  | 
| 
| pchela5 | Дата: Суббота, 22.11.2014, 13:46 | Сообщение # 4 |  | Группа: Свой человек Сообщений: 84 
 Статус: 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 |  | Группа: Свой человек Сообщений: 84 
 Статус: 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 |  
 |  |  |  |