Forum: PC-Programmierung Unterschiede in der Python Ausgabe


von Ben S. (patersigmund)


Lesenswert?

Hallo Allerseits.

Habe aktuell ein paar Probleme bei der Ausgabe von Werten.

Hintergrund ist dieser, dass ich aus einem ADC128 von Ti gerne Werte 
auslesen würde. Was soweit auch gar nicht mal so schlecht funktioniert. 
Aber, ich bekomme wenn ich den entsprechenden Code in einem Programm 
festhalten will, funktioniert es nicht mehr. Das Ganze läuft auf nem 
Raspberry Pie.

In einer Python Instanz setze ich den Befehl ab und bekomme folgendes 
zurück
1
>>> print adc.read_word_data(0x1d, 0x20)
2
61590

Setze ich den gleichen Befehl in einer *.py ab, so bekomme ich eine 0 
als Rückgabewert
1
  1 import smbus
2
  2 import time
3
  3 import struct
4
  4 
5
  5 # Legit addresses for ADC128D818
6
  6 address = [0x1d, 0x1e, 0x1f, 0x2d, 0x2e, 0x2f, 0x35, 0x36, 0x37]
7
  7 
8
  8 # Support Values
9
  9 READ = 0
10
 10 WRITE = 1
11
 11 
12
 12 # Register
13
 13 reg_config = 0x00
14
 14 reg_interrupt = 0x01
15
 15 reg_interrupt_mask = 0x03
16
 16 reg_conv_rate = 0x07
17
 17 reg_ch_disable = 0x08
18
 18 reg_one_shot = 0x09
19
 19 reg_deep_shutdown = 0x0a
20
 20 reg_adv_config = 0x0b
21
 21 reg_status = 0x0c
22
 22 reg_ch_read = [0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27]
23
 23 reg_limit = [0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39]
24
 24 reg_manu = 0x3e
25
 25 reg_rev = 0x3f
26
 26 
27
 27 # Create I2C Session
28
 28 adc128 = smbus.SMBus(1)
29
 29 
30
 30 while True:
31
 31     if adc128.read_byte_data(0x1d, 0x0c) == 0:
32
 32         ready = True
33
 33         break
34
 34 
35
 35 if ready == True:
36
 36     adc128.write_byte_data(0x1d, reg_adv_config, 0b00000011)
37
 37     print "Adv. config: " + str(bin(adc128.read_byte_data(0x1d, reg_adv_config)    ))
38
 38 
39
 39     adc128.write_byte_data(0x1d, reg_config, 0b00000001)
40
 40     print "Config: " + str(bin(adc128.read_byte_data(0x1d, 0x00)))
41
 41 
42
 42     for i in reg_ch_read:
43
 43         print "Ch " + str(hex(i)) + ": " + str(bin(adc128.read_word_data(0x1d,     i )))
44
 44     adc128.read_word_data(0x1d,0x20)

Ausgabe von dem Programm
1
Adv. config: 0b11
2
Config: 0b1
3
Ch 0x20: 0b0
4
Ch 0x21: 0b0
5
Ch 0x22: 0b0
6
Ch 0x23: 0b0
7
Ch 0x24: 0b0
8
Ch 0x25: 0b0
9
Ch 0x26: 0b0
10
Ch 0x27: 0b0

Hat jemand eine Idee warum das so unterschiedliche Werte liefert? Habe 
schon gedacht, dass es an einem fehlenden Root Zugriff liegt. Aber mit 
Root gibt es den gleichen Fehler.

Gruß,
  me

: Verschoben durch Moderator
von Ben S. (patersigmund)


Lesenswert?

OK. Fehler gefunden. Das Problem war nicht der Code, sondern eher die 
Auswirkung von dem Schreiben eines Registers.

Denn durch das schreiben des Registers 0x0b, welches alle Register wo 
der AD Wandler seine Werte speichert einfach mal löscht. Soweit nicht 
schlimm. Nur fällt das halt nicht auf, wenn man die Register 0x20 bis 
0x27 nur einmal liest. Liest man diese in einer Schleife, so erkennt 
man, dass sich die Register langsam füllen.

von Thomas S. (doschi_)


Lesenswert?

Danke für den Beitrag.
Wie hast Du Dein Programm nun geändert, oder welche Anpassungen 
vorgenommen?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.