no to lecimy...
... zaczynamy od wykrycia układu:
Code: Select all
root@ctdev:~/pcf8591T# i2cdetect -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- 48 -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- --                         
root@ctdev:~/pcf8591T# 
Teraz prościutki program. Tym razem wykorzystamy gotową bibliotekę ułatwiającą korzystanie z SMbus pod Pythonem. Znajdziesz ją w załącznikach. Zaletą biblioteki test to, że mamy zunifikowane komendy do operacji na pojedynczych bajtach, słowach i rejestrach bez zastanawiania się czego w danej chwili powinniśmy użyć...
Code: Select all
from I2C import Device
import time
# PCF8591 has one control register:
#MSB 7 6 5 4 3 2 1 0 LSB
#    0 X X X 0 X X X
#      | | |   | | |
#      |  |    |  |
#      |  |    |  |--- A/D Channel Number:
#      |  |    |        00 channel 0 
#      |  |    |        01 channel 1
#      |  |    |        10 channel 2
#      |  |    |        11 channel 3
#      |  |    |
#      |  |    |--- Auto-increment flag (active if 1) 
#      |  |
#      |  |--- Analog input programing:
#      |        00 - four single-ended inputs
#      |        01 - three differential inputs  
#      |        10 - two single ended (AIN0, AIN1) and one differential 
#      |        11 - two independent differential unputs
#      |
#      |--- ANALOG OUTPUT ENABLE FLAG (D/A): output enable if 1 
#
# PCF8591 Address:
ADDRESS = 0x48
# I2C BUS:
BUS = 1
# Register details
#Analog inputs:
AIN0	=	0x40 
AIN1	=	0x41 
AIN2	=	0x42 
AIN3	=	0x43 
AOUT	=	0x40
AUTOINCREMENT	=	0x04
#Initialize	
pcf=Device(ADDRESS, BUS)
def read_AIN0 ():
	""" Function doc """
	pcf.writeRaw8(AIN0)
	ain0 = pcf.readRaw8()
	return ain0
def read_AIN1 ():
	""" Function doc """
	pcf.writeRaw8(AIN1)
	ain1 = pcf.readRaw8()
	return ain1
	
def read_AIN2 ():
	""" Function doc """
	pcf.writeRaw8(AIN2)
	ain2 = pcf.readRaw8()
	return ain2
	
def read_AIN3 ():
	""" Function doc """
	pcf.writeRaw8(AIN3)
	ain3 = pcf.readRaw8()
	return ain3
def write_AOUT (data):
	""" Function doc """
	pcf.write8(AOUT, data)
		
while 1:
	for x in range (0,255):
		write_AOUT(x)
		print read_AIN0(), read_AIN1(), read_AIN2(), read_AIN3(), "AOUT=",x
Program będzie w pętli pokazywał nam wartości zmierzone na poszczególnych wejściach analogowych jak również ustalał poziom na wyjściu AOUT (w prezentowanym module na wyjściu mamy diodę LED, która pulsuje w takt zapisywanych zmian):
Code: Select all
root@ctdev:~/pcf8591T# python pcf8591Tdemo.py 
129 165 212 100 AOUT= 0
128 168 212 94 AOUT= 1
128 164 212 98 AOUT= 2
128 165 212 96 AOUT= 3
128 168 212 98 AOUT= 4
128 164 212 100 AOUT= 5
128 164 212 99 AOUT= 6
128 167 212 99 AOUT= 7
128 165 212 101 AOUT= 8
128 167 212 106 AOUT= 9
128 165 212 106 AOUT= 10
128 164 212 104 AOUT= 11
128 167 212 104 AOUT= 12
128 166 212 106 AOUT= 13
128 164 212 107 AOUT= 14
128 166 212 111 AOUT= 15
128 167 213 110 AOUT= 16
128 164 212 113 AOUT= 17
128 165 212 109 AOUT= 18
 
			
