Ich brauche ein paar Ideen, es fällt mir sehr schwer, bei diesem
schwülen Wetter brauchbare Gedanken aufs Papier zu bekommen.
Ich habe auf einem Board zwei Controller, die eigentlich unabhängig
Aufgaben erledigen. Es findet untereinander keine Kommunikation statt,
war bisher nicht nötig und ist HW-seitig auch nicht vorgesehen.
Aber beide Controller haben Zugriff auf einen Treiber, der eine LED
ansteuert. Im Prinzip sind beide Kontroller über jeweils einen Port-Pin
direkt miteinander verbunden. An dieser direkten Verbindung hängt ein
Widerstand, der wiederum am Treiber hängt.
Die Idee war:
Wenn der eine Controller den Treiber ansteuert, kann der zweite
"mitlesen". Und umgekehrt. ==> Hat auch funktioniert bzw. funktioniert
auch weiterhin.
Die neue Herausforderung ist aber allerdings:
Am zweiten Controller hängt ein Taster, der, wenn er betätigt wird, den
ersten Controller beeinflussen soll.
Heißt:
Der erste Controller (ATmega) steuert den Treiber für die LED im 4Hz
Takt.
Wenn der Taster am zweiten Controller (AT90CAN) betätigt wird, soll der
erste Controller mit 10Hz blinken.
Mein Grundgedanke ist:
Während der taktgebende Controller in der Low-Phase ist, soll der
"mitlesende" Controller, den Input auf Output wechseln und ein
High-Impuls(Peak) senden, der z.B. beim taktgebenden Controller per
Interrupt empfangen wird.
Kommt also in der Low-Phase ein Impuls (aus Sicht des taktgebenden
Controllers), wird die Frequenz gewechselt.
Was mich gerade stört, ist die Umschaltung der Ports bzw. der Wechsel
zwischen Output und Input auf beiden Seiten.
Gibt es da fertige Routinen?
Ist eine Umschaltung erforderlich? Kann man in der Low-Phase trotzdem
etwas abfragen?
Die HW kann nicht geändert werden - sie existiert schon. Es ist auch
kein externer Pull-up/Pull-down Widerstand vorhanden.
Könnt ihr mir mit Ideen auf die Sprünge helfen?
Schwitzige Grüße
Warum lässt du nicht einfach den 2. Controller (der mit dem Taster) die
LED in Abhängigkeit der Tasterinformation blinken, und der erste
Controller liest die Frequenz mit?
Dann benötigst du überhaupt keine Umschaltung.
Controller 2: Output
Controller 1: Input
> der Wechsel zwischen Output und Input auf beiden Seiten.> Gibt es da fertige Routinen?
Das soll ein Scherz sein, oder? Zur Umschaltung der Richtung ändert man
ein Bit (jedenfalls bei den meisten Mikrocontrollern). Brauchst du eine
vorgefertigte Routine, die ein Bit ändert?
Wenn ja, was machst du, wenn mal mehr als diese kleinste denkbare
Operation gemacht werden soll? Beauftragst du dann einen Spezialisten?
Ich empfehle Dir, ein Programmier-Tutorial durchzuarbeiten. Vorzugsweise
nicht von Arduino.
Gib nächstes mal an, um welche Bauteile es konkret geht. Bei
"Controller" könnte man (wenn man spitzfindig ist) auch an etwas ganz
anderes denken, zum Beispiel einen Beruf oder ein Eingabegerät für
Videospiele. Und bei "Treiber" fallen mir spontan die Ägypter beim
Pyramidenbau ein, die haben Sklaven getrieben.
Ich bin mit 41 zwar schon alt, aber ich denke, dass sich die
Fachbegriffe in den letzten 20 Jahren nich so plötzlich geändert haben,
dass ich es nicht mitbekommen habe.
Ansonsten lass uns mal eben schnell die Amper für den Exiter Slayer
hochskillen damit der Joule Thief nicht dein Smartphone zockt. :-)
Sorry, das musste mal raus.
Mike schrieb:> Die HW kann nicht geändert werden - sie existiert schon.
Ist kein Argument.
Du glaubst gar nicht, was man mit einem scharfen Messer und mit dünnem
Draht (Fädeldraht) an einer bereits 'fertigen' Platine noch alles ändern
kann.
> Könnt ihr mir mit Ideen auf die Sprünge helfen?
Sorg für eine ordentliche eindeutige Verbindung vom 2.ten Controller zum
ersten. Deine Idee ist eine Schnapsidee.
Zum einen dürfen niemals 2 Ausgänge gegeneinander treiben. Zum anderen
sind Interrupts kein Allheilmittel für einen verkorksten Ansatz.
Also entweder die Ansteuerung der LED auf den 2.ten Controller verlagern
und im 1.ten Controller die Blinkfrequenz (mit einer gewissen
Verzögerung) feststellen und darauf reagieren oder die Hardware
entsprechend umbauen, wenn noch Pins frei sind.
Joe F. schrieb:> Warum lässt du nicht einfach den 2. Controller (der mit dem Taster) die> LED in Abhängigkeit der Tasterinformation blinken, und der erste> Controller liest die Frequenz mit?> Dann benötigst du überhaupt keine Umschaltung.
Der erste Controller wertet analoge Messungen an diversen Sensoren aus
und treibt entsprechend die Ausgänge. An diesem ist kein weiterer Pin
mehr frei.
Der zweite Controller hat bereits einen Taster. Und dieser soll nach
Betätigen, Einfluss auf die Blinkfrequenz nehmen bzw. den Ausgang
dauerhaft einschalten.
Stefan U. schrieb:> Das soll ein Scherz sein, oder? Zur Umschaltung der Richtung ändert man> ein Bit (jedenfalls bei den meisten Mikrocontrollern). Brauchst du eine> vorgefertigte Routine, die ein Bit ändert?
Das bekomme ich noch so gerade hin...
Wenn du richtig lesen kannst, bemerkst du, dass die Portpin direkt
miteinander verbunden sind. Und wenn der eine Ausgang auf Low ist und
ich beim zweiten Controller die Richtung ändere (Input --> Output) und
einen Peak darauf gebe, was glaubst du was passiert???
> Gib nächstes mal an, um welche Bauteile es konkret geht. Bei> "Controller" könnte man (wenn man spitzfindig ist) auch an etwas ganz> anderes denken, zum Beispiel einen Beruf oder ein Eingabegerät für> Videospiele. Und bei "Treiber" fallen mir spontan die Ägypter beim> Pyramidenbau ein, die haben Sklaven getrieben.
Wer lesen kann ist klar im Vorteil (ATmega und AT90CAN)
> Ich bin mit 41 zwar schon alt, aber ich denke, dass sich die> Fachbegriffe in den letzten 20 Jahren nich so plötzlich geändert haben,> dass ich es nicht mitbekommen habe.>> Ansonsten lass uns mal eben schnell die Amper für den Exiter Slayer> hochskillen damit der Joule Thief nicht dein Smartphone zockt. :-)
Meine Empfehlung:
Wenn man einen Troll-Beitrag abgeben möchte und nicht konkret zur Lösung
beiträgt, lässt man den Beitrag besser weg. Er hilft nicht weiter!
Alternative Empfehlung:
Beitrag lesen und VERSTEHEN und dann einen Beitrag zur Lösung geben.
Du hast mir jedenfalls nicht geholfen :(
Karl H. schrieb:>> Die HW kann nicht geändert werden - sie existiert schon.>> Ist kein Argument.> Du glaubst gar nicht, was man mit einem scharfen Messer und mit dünnem> Draht (Fädeldraht) an einer bereits 'fertigen' Platine noch alles ändern> kann.
Das stimmt, aber es sind mehrere Platinen, die bereits eingebaut sind
(und vergossen). Ein SW-update ist aber - dank Bootloader - relativ
einfach möglich
Alles es du in der Richtung machst ist in meinen Augen pfusch.
Aber du könntest es so machen das UC 1, der die LED ansteuert in einer
lowhigh Phase erst eine Zeit lang auf Eingang mit Pullup geht. Also low,
Eingang+Pullup, high.
In der Phase trigger er zärtlich auf eine fallende Flanke.
Der 2. Controller reagiert immer auf die steigende Flanke (durch den
Pullup) mit einem interrupt.
Tritt er auf und es soll eine Umschaltung auf 10Hz erfolgen, zieht der
2.UC den Pullup nach unten über ein low. Der UC 1 erfasst diese fallende
Flanke durch den interrupt und schaltet beim nächsten Zyklus auf die
höhere Frequenz.
Oder du sendet gleich ein Protokoll in der Eingangsphase.
Also eine Art "Led Ansteuerung mit überlagerter UART".
Mit Symbolbreite 1-x.
P.S. Ja ich habe selbst die Schreibfehler gesehen. Verdammte Korrektur
:-)
Mike schrieb:> kein externer Pull-up/Pull-down Widerstand
Ist nicht tragisch, Der ATmega hat interne Pullups.
Frank hat die Lösung skizziert:
Du machst die "Datenübertragung" von MCU2 nach MCU1 in der LED-AN-Phase:
LED-AN = MCU1 ist auf INPUT mit PULLUP
LED-AUS = MCU1 ist auf OUTPUT mit LOW
MCU2 kann dann in der LED-AN Phase das Signal (kurz) auf LOW ziehen.
Die Triggerung kann man so machen, wie es Frank skizziert hat.
Das hat auch den Benutzer-Vorteil, dass bei eingeschalteter LED ein
kurzer "Aussetzer" vom Auge nicht so störend wahrgenommen wird, wie
umgekehrt.
Fertige Routinen gibts dafür natürlich nicht. Die tricksige Lösung musst
Du selbst implementieren.
Viel Erfolg.
Matz.
Stefan U. schrieb:> Ich bin mit 41 zwar schon alt...
Da hast Du aber was falsch gemacht, wenn Du Dich mit diesen jungen
Jahren schon so alt fühlst. Lass Dir das aus Erfahrung sagen... ;-)