(Raspberry Pi) Interrupt funktioniert nicht bei hohen Frequenzen

OP #6342661
Lesenswert?
• ▲
▼
Hallo,

ich möchte ein PWM Signal mit einer Interrupt-routine am Raserry Pi 
mittels python auslesen.
Bei dem einfach Versuch einen Taster an Pin 10 auszulesen funktioniert 
das Programm:

high
low
high
low
high
low

Schließe ich den Ausgang des NE555 (siehe Anhang [R_a=150; R_b=150; C=1u 
-> f=2.5kHz; duty_cycle=50%) an Pin 10 an, bekomme ich folgendes:

low
high
high
high
low
high
low
low

Nach meiner Logik müsste er aber die gleichen Signale ausgeben wie beim 
Taster, nur halt viel schneller.

der Python-Code:
1
import RPi.GPIO as GPIO
2
from pynput.keyboard import Controller
3

4
keyboard = Controller()  # Create the controller
5
signal_pin = 10
6

7
def button_callback(channel):
8
    if GPIO.input(signal_pin):
9
        #keyboard.type("1")
10
        print("high")
11
    else:
12
        #keyboard.type("0")
13
        print("low")
14

15
GPIO.setwarnings(False)  #ignore warnings
16
GPIO.setmode(GPIO.BOARD) #use physical pin-numbering
17
GPIO.setup(signal_pin, GPIO.IN, pull_up_down = GPIO.PUD_DOWN) # set pin 10 to input and and pull down initial value
18

19
GPIO.add_event_detect(signal_pin,GPIO.BOTH,callback=button_callback) # setup event on pin 10 when change
20

21
message = input("Press enter to quit\n\n") # run until someone presses enter
22
GPIO.cleanup() #Cleaning up

Ziel ist es später, die Ausgangs-Signale einer Tastatur mit 
ps/2-Anschluss an den GPIO-Pins des Rasperry pi's auszulesen. Dort sind 
um die 12.5kHz auzulesen.

Was mache ich falsch?
Angehängte Dateien:
Gast #6342667
Lesenswert?
• ▲
▼
M. S. schrieb:
> Nach meiner Logik müsste er aber die gleichen Signale ausgeben wie beim
> Taster, nur halt viel schneller.

So schnell kann er halt nicht - der RasPi ist ein Linux-Computer, kein 
Mikrokontroller.

Du kannst ja die Frequenz langsam steigern von z.B. 5 Hz an, du wirst 
dich wundern wie schnell der RasPi schlapp macht. Für solche Zwecke ist 
er einfach ungeeignet.

Georg
Gast #6342671
Lesenswert?
• ▲
▼
> [..] Interrupt-routine am Raserry Pi mittels python auslesen [..]

Naja..

> [..] f=2.5kHz [..]

mach das mal 4 bis 5 Größenordnungen(!) langsamer..

> Nach meiner Logik müsste er aber die gleichen Signale ausgeben wie beim
> Taster, nur halt viel schneller.

Nach meiner nicht.

HTH
Gast #6342672
Lesenswert?
• ▲
▼
Bei einem Standard-Kernel kann ein GPIO Interrupt bis zu 75 µs dauern,
das wären grob so 13 kHz. Jetzt verwendest du Python, und das dürfte 
locker nochmal den Faktor 10 - 100 (Interpreter) drauf packen. Du 
könntest C nehmen
und ggfs. auch den Kernel mit niedriger Latenz neu kompilieren.

Hier wird es gezeigt, was du tun könntest:

https://sites.google.com/site/hamlinhomeprojects/projects/raspberry-pi-isr
Gast #6342681
Lesenswert?
• ▲
▼
> Ziel ist es später, die Ausgangs-Signale einer Tastatur mit
> ps/2-Anschluss an den GPIO-Pins des Rasperry pi's auszulesen. Dort sind
> um die 12.5kHz auzulesen.

Für solche Aufgaben setze ich einen Controller (z. B. ATTiny) ein und 
sende die Daten über eine geeignete Schnittstelle (RS22, SPI, I2C, etc.) 
an den Raspberry Pi.
Gast #6342698
Lesenswert?
• ▲
▼
Unabhängig davon, dass Martin mit dem seperatem Controller recht hat: 
Dein Hauptproblem dürfte dein 'print "high"' bzw. 'print "low"' sein.
Das kostet richtig Zeit! Gebe doch mal die aktuelle Zeit mit aus, also
print (time.time())

Du könntest statt "high" und "low" auszugeben jeweils in ein Array einen 
Zeitstempel schreiben, und nach 100 Interrupts den Array ausgeben.
Dann siehst du, in welchen Abständen der RPi in Kompination mit Python 
einen Interrupt schafft. Wobei auch hier die dynamische 
Speicherverwaltung von Python Zeit braucht. Besser wäre, das ganze in C 
in ein statisches Array zu speichern, würde sicher deutlich schneller 
gehen.
OP #6342810
Lesenswert?
• ▲
▼
vielen lieben Dank für die hilfreichen Antworten !

ich denke es lohnt sich doch eher eine USB-Tastatur sich anzulegen. 
Dachte ich könnte ein paar Mäuse sparen. aber das ist der Aufwand leider 
nicht Wert.

Trotzdem habe ich wieder mal dazu gelernt. Dankeschön!

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.