PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [ERLEDIGT] Python genaue Möglichkeit für µs Sleep



Kampi
12.02.2013, 18:23
Hallo Forum,

heute sind endlich meine DS1820 1Wire Sensoren Muster angekommen (Muster sind schon was feines....spart man super viel Geld mit ^.^).
Nun wollte ich 1Wire per Python realisieren und habe dafür folgenden Code:



import RPi.GPIO as GPIO
import time
import os
from pizypwm import *


# Kommandos
Convert = 0x44
Read = 0xBE
Write = 0x4E
Copy = 0x48
Recall = 0xB8
Read_Power = 0xB4


# Datenpin
Data_Out = 7


# Pin 4 als Ausgang deklarieren
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BOARD)
GPIO.setup(Data_Out, GPIO.OUT)
GPIO.output(Data_Out, True)


def Send_Data(Daten):

# Umwandeln in einen Binaerstring
Dual = bin(Daten)
Dual = Dual[2:10]

# Binaerstring ausgeben
for Stelle in range(len(Dual)):
if Dual[Stelle] == "1":
GPIO.output(Data_Out, False)
time.sleep(1.0/1000000.0)
GPIO.output(Data_Out, True)
else:
GPIO.output(Data_Out, False)
time.sleep(60.0/1000000.0)
GPIO.output(Data_Out, True)



while True:
Send_Data(Read_Power)
time.sleep(1)


Allerdings zeigt mir mein Oszi zwischen den High Pegeln eine Zeit zwischen 150µs - 200µs an (was vieeeeeeeeel zu viel ist).....die Zeit zwischen High Pegeln soll bei einer "1" 1-15µs und bei einer "0" 60-120µs betragen...
Kennt jemand eine Möglichkeit dies vernünftig zu realisieren?
Danke schon mal!

TheDarkRose
12.02.2013, 21:15
Nicht mit Phyton. Die Sprache ist halt nicht Hardwarenahe. Du könntest mal versuchen den Kernel mit dem PREEMPT Flag zu kompilieren, ansonsten musst du auf sowas wie Xenomai (http://www.armadeus.com/wiki/index.php?title=Xenomai) und C zurückgreifen. Weiß nicht, ob sich für Raspian(?) da Unterstützung da ist, einzukompilieren.

Kampi
12.02.2013, 21:24
Hab eventuell eine andere Möglichkeit gefunden...muss ich mal probieren :)
Und ja C-Code einkompilieren soll gehen.

TheDarkRose
13.02.2013, 02:16
Naja mit einkompilieren meinte ich den Kernel selbst und mglw. teile des RootFS selbst zu kompilieren.

Defiant
13.02.2013, 08:48
Jetzt ist der richtige Zeitpunkt gekommen, einen kleinen µC hinter den RPi zu schalten :)

Und im ernst, du kannst im Userspace nicht exakt ein paar µs warten, du wirst immer "mindestens" die Zeitspanne warten. Selbst wenn dein sleep exakt [1] solange ausgeführt wird, dann wird dir der Scheduler ein Strich durch die Rechnung machen. Nach meinen Beobachtungen liegen realistische Wartezeiten, auch im Kernel, eher im Millisekundenbereich.

[1] http://www.kernel.org/doc/Documentation/timers/hrtimers.txt

- - - Aktualisiert - - -

Jetzt ist der richtige Zeitpunkt gekommen, einen kleinen µC hinter den RPi zu schalten :)

Und im ernst, du kannst im Userspace nicht exakt ein paar µs warten, du wirst immer "mindestens" die Zeitspanne warten. Selbst wenn dein sleep exakt [1] solange ausgeführt wird, dann wird dir der Scheduler ein Strich durch die Rechnung machen. Nach meinen Beobachtungen liegen realistische Wartezeiten, auch im Kernel, eher im Millisekundenbereich.

[1] http://www.kernel.org/doc/Documentation/timers/hrtimers.txt

Kampi
13.02.2013, 08:54
Hey,

ich habe gesehen, dass es sowieso ein Update für einen 1Wire Treiber gibt, den man dann wohl einfach mit "file" etc. benutzen kann....
Aber da muss ich mal schauen wie das geht....im Moment klappt das noch nicht so ganz.
Ansonsten lagere ich die Kommunikation mittels 1Wire auf einen PSoC aus.....
Wollte da heute eh noch eine einstellbare Hardware-PWM + ADC und evtl. DAC an mein Pi anschließen und testen (werde es dann auch hier ins Forum / auf meine HP schreiben).
Hatte halt gehofft ich könnte schnell mal einen 1Wire Sensor anschließen und testen aber da gibt es leider doch das ein oder andere Problem ;)