Hallo Leute, arbeite derzeit an einem Projekt für die Schule und habe leider ein kleines Problem. Ich schicke mir eine Binäre Zahl z.B 1001 0011 auf den RPI und lese diese Zahl aus. Wie kann ich die Zahl dann so auslesen dass jede Zahl davon ein Wert ist. Beispiel 0001 0011 -> Sensor 1,2 & 5 geben ein Signal if "Uart auslesen"(0000 0001): LED1 leuchtet if "Uart auslesen"(0000 0010): LED2 leuchtet usw... jetzt sollten beide LEDs blinken,das geht ja nicht weil ich ansonsten alle Möglicheiten aufschreiben müsste.(bin bei 128 eingelesenen Ports) Gibt es hier eine einfache Funktion um das umgehen dass die LEDs immer blinken wenn eine 1 steht? SG Darth-Vader
Ich würde mir **PIGPIO serial** ansehen: https://abyz.me.uk/rpi/pigpio/python.html falls es dir um die UART Behandlung geht. Um was es dir bei der Decodierung geht solltest du verständlicher beschreiben.
:
Bearbeitet durch User
Ich glaub ich versuch dein Problem mal umzuschreiben, weil man es sonst nicht versteht: Du meinst wenn z.b. die Bitfolge 0000 0011 übertragen wird, brauchst du dafür eine extra if-Abfrage, die dann LED1 und LED2 einschalten würde. Somit bräuchtest du 2^8 if-Abfragen was natürlich Quatsch ist. Du willst aber dafür keine extra if-Abfrage jeden Fall, dass mehrere LEDs gleichzeitig angesteuert werden sollen. Du willst nur für jede der 7-8? LEDs eine einzige if-Abfrage. Das geht über https://www.mikrocontroller.net/articles/Bitmanipulation Im Grunde musst du die Eingangsbitfolge 0000 0011 mit z.b. 0000 0001 für LED1 und mit 000 0010 für LED2 logisch verknüpfen (logisches AND bzw. UND). Das heißt bei 0000 0011 & 0000 0001 kommt 0000 0001 raus. Bei 0000 0010 & 0000 0001 kommt 0000 0000 raus. Auf das überprüfst du in deiner if-Abfrage. Immer wenn dieser Wert rauskommt, so wird bei jeder Eingangsbitfolge LED1 eingeschaltet, wenn das Bit an der Stelle 1 = 1 ist. Auf 0 überprüfen ist bisschen komplizierter, geht aber auch und steht auch in dem Artikel. Das brauchst du aber nicht, da du mit "else" ja dann immer die LED ausschalten kannst, wenn die obere Abfrage nicht zutrifft. Eventuell habe ich
> > Das heißt bei 0000 0011 & 0000 0001 kommt 0000 0001 raus. > Bei 0000 0010 & 0000 0001 kommt 0000 0000 raus. > Zuerst Danke für deine Antwort, also das Problem hast du richtig erkannt dass ich nicht alle If Abfragen schreibe... nur ist es möglich die If Abfrage so zu kürzen dass bei 1111 1111 alle 8 LEDs ZUSAMMEN leuchten? oder funktioniert das nur einzeln?
Entweder ich habe was überlesen, oder ich sehe nirgends wie der Frame aufgebaut ist. Ist das ASCII oder sind das Bytes?
Warum nicht alle 8 LEDs mit einer Adresse ansteuern?
1 | LED 1 = P0 |
2 | LED 2 = P1 |
3 | LED 3 = P2 |
4 | .....
|
5 | LED 8 = P7 |
Dann bräuchte man das empfangene Byte nur auf das Port schreiben.
> Warum nicht alle 8 LEDs mit einer Adresse ansteuern? leider zu Lange, wir haben 128 Leds und 128 Ports zum auslesen und ausgeben, die Ports werden mittels Expander auf einen µC geschickt und an meinem RPI weitergegeben. Ich sollte jetzt den Binären Wert auslesen (Bsp.0000 1101) und will somit nur die LEDs leuchten lassen auf denen die Sensoren 1 geben. Jede einzelner Fall als IF Abfragen zu schreiben ist einfach Quatsch. Darum will ich es anders versuchen.
Darth V. schrieb: >> Warum nicht alle 8 LEDs mit einer Adresse ansteuern? > > leider zu Lange, wir haben 128 Leds und 128 Ports zum auslesen und > ausgeben, > die Ports werden mittels Expander auf einen µC geschickt und an meinem > RPI weitergegeben. > Ich sollte jetzt den Binären Wert auslesen (Bsp.0000 1101) und will > somit nur die LEDs leuchten lassen auf denen die Sensoren 1 geben. Jede > einzelner Fall als IF Abfragen zu schreiben ist einfach Quatsch. Darum > will ich es anders versuchen. Das Vorgeschlagene ist ja keine IF Abfrage mehr sondern eine Zuordnung als Adresse und soweit ich weiß die schnellste u gängige Variante. Alternative wäre noch eine FOR Schleife. Besser lesbar aber wahrscheinlich langsamer.
> Das Vorgeschlagene ist ja keine IF Abfrage mehr sondern eine Zuordnung > als Adresse und soweit ich weiß die schnellste u gängige Variante. > Alternative wäre noch eine FOR Schleife. Besser lesbar aber > wahrscheinlich langsamer. Es gibt ja mehrere Möglichkeiten. Und wie willst du das mit einer FOR Schleife lösen
Darth V. schrieb: > Und wie willst du das mit einer FOR Schleife lösen Ich rekapituliere mal. Du hast eine Kette von 128 Bit, und möchtest für jede Bitstelle, die 1 ist, eine Funktion aufrufen die als Parameter den Index der Bitstelle übergeben bekommt, ohne 128 IF-Abfragen schreiben zu müssen? Wenn die Bitkette in 16 Bytes a 8 Bit gespeichert ist, dann würde ich zwei FOR-Schleifen verwenden. Die äussere würde die Bytes aufzählen, und die innere würde ein Bit von Stelle zu Stelle schieben und mit dem Byte der Bitkette verunden (&-Operator). Den Index der aktuellen Bitstelle führst du entweder mit oder berechnest ihn aus den zwei Laufvariablen. LG, Sebastian
Nein, ich glaub er TO sollte mal ne Zeichnung von seinem Aufbau machen und genauer beschreiben was er will. Ich verstehe jetzt z.b. nicht ob er Port-Expander für die Eingänge (Sensoren?) hat oder für die LED. Wie viele LEDs sind es denn und wie viele Sensoren? Wo kommt denn nun das UART und der Bitstream ins Spiel. So wie ich es oben beschrieben habe kann er bei 8 LEDs mit 8 if-Abfragen bei jedem Wert von einem 8Bit-Wert jede Möglichkeit an LEDs an/ausschalten. Auch gleichzeitig. D.h. bei 0000 0001 wird nur LED1 eingeschaltet und bei 0100 0001 LED 1 und LED 7.
Gerald K. schrieb: > Warum nicht alle 8 LEDs mit einer Adresse ansteuern? > LED 1 = P0 > LED 2 = P1 > LED 3 = P2 > ..... > LED 8 = P7 > > Dann bräuchte man das empfangene Byte nur auf das Port schreiben. War genau auch mein erster Gedanke. Das Byte mit den Sensordaten auf den LED-Port schreiben, nach der halben Blinkperiode 0x00 auf den Port schreiben und nach wieder ein halben Periode erneut die Sensordaten. Kaum Aufwand, nur sollten die LEDs idealerweise am selben Port hängen. Man muss gar nichts abfragen. Nicht mal ein 'if', ob die Ein- oder Ausschaltphase dran ist - einfach verUNDen mit eine volatile Maske, die zwischen 0 und 0xFF in der Timer-ISR gewechselt wird. Ob das so einfach in Python geht, weiß ich nicht. In C sind es ein paar Zeilen:
1 | volatile uint8_t maske; |
2 | |
3 | // an PORTC sind die LEDs; Aufruf in der Endlosschleife der main()
|
4 | PORTC = datenbyte & maske; |
5 | .
|
6 | .
|
7 | |
8 | // und in der Timer-ISR für die Blinkfrequenz steht
|
9 | maske ^= 0xFF; |
HildeK schrieb: > Gerald K. schrieb: >> Warum nicht alle 8 LEDs mit einer Adresse ansteuern? >> LED 1 = P0 >> LED 2 = P1 >> LED 3 = P2 >> ..... >> LED 8 = P7 >> >> Dann bräuchte man das empfangene Byte nur auf das Port schreiben. > > War genau auch mein erster Gedanke. > Das Byte mit den Sensordaten auf den LED-Port schreiben, nach der halben > Blinkperiode 0x00 auf den Port schreiben und nach wieder ein halben > Periode erneut die Sensordaten. Kaum Aufwand, nur sollten die LEDs > idealerweise am selben Port hängen. > Man muss gar nichts abfragen. Nicht mal ein 'if', ob die Ein- oder > Ausschaltphase dran ist - einfach verUNDen mit eine volatile Maske, die > zwischen 0 und 0xFF in der Timer-ISR gewechselt wird. > > Ob das so einfach in Python geht, weiß ich nicht. In C sind es ein paar die Frage stellt sich eher nicht denn der TO schreibt ja das das auf einem RPi läuft. Sascha
> Ich würde mir PIGPIO serial ansehen
Wozu? Auf einem Raspi mit Linux sollte Uart doch ein ganz normales
Device sein, das du als Datei lesen kannst. Musst dich "nur" mit den
stty Parametern rumärgern.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.