Hallo ich bin David und neu hier im Forum. Bin gerade ein wenig am Basteln und mir stellt sich ein Problem mit meinem Uart. Zunächst: AVR-GCC ATMEGA 328p Also mein Uart läuft soweit debugen senden von Befehlen etc. tue ich über den PC ich benutze die Baudrate 9600. Nun möchte ich auf der TX Leitung einfach die Bewegung "beobachten"(diese läuft mit verschiedenen Baudraten) um dann falls bewegungen auf der TX sowie auf einer anderen Leitung ist z.B. eine LED blinken lassen. Gleichzeitig möchte ich noch eine weitere Bewegung "beobachten". Das ganze sollte nicht in der dauerschleife dauernd abgefragt werden oder doch?und wie? Viele Grüße und schon mal Danke David
Das Programm des uC hat einen Zustand, in dem es weiss, das der UART aktiv ist. Z.B. wird ja an einer Stelle ein Zeichen in das Ausgangsregister geschrieben. Wenn die zweite Leitung >...falls bewegungen auf der TX sowie auf einer anderen Leitung... auch von dem uC gesteuert wird, dann hat die Software dafür auch einen Zustand. Eben den bei dem der Pegel der Ausgangsleitung geändert wird. Dies kannst Du nutzen um eine LED anzusteuern. Definitorisch schwierig ist nur das Wort "Bewegung" in Deiner Beschreibung. Du müsstest mal genauer beschreiben was Du darunter verstehst. Bei der UART ist das einigermaßen einfach, aber nicht bei der zusätzlichen Leitung. Ein Ansatzpunkt wäre, die Anzahl der Veränderungen pro Zeiteinheit. Am besten mal beschreiben, wozu das Ganze dienen soll, was also die Überwachung genau anzeigen soll und zu welchen Maßnahmen das führt.
Also zunächst zur "Bewegung" Es ist eine Datenleitung die zu einem Modul führt diese will ich abgreifen und nur feststellen, ob sie aktiv ist, also ob dauernde high low signale über sie fließen. Das gleiche will ich mit einer zweiten Leitung machen. Um nochmal zur ersten zu kommen... über diese Leitung kommt aber auch irgendwann mit einer bestimmten Baudrate bestimmte Befehle für mich. Vielen Dank schon mal für die Tips !
Schicke Sache, doch es soll auf jeden Fall Software sein. Wie gesagt ich will sozusagen nur wissen ob eine Eingangsleitung bei meinem 328 togglen tut oder nicht.
Dann brauchst Du auf Deinem µC keine serielle Schnittstelle, sondern musst nur einen I/O-Pin verwenden, den Du zyklisch pollst, um ihn auf Zustandsänderungen abzufragen. Wenn das zu viel Rechenleistung verbraucht, könntest Du, so Dein µC das unterstützt, auch den I/O-Pin als Takteingang eines Zählers verwenden, und den Wert dieses Zählers gelegentlich abfragen. Ändert sich der Wert, wackelt was am I/O-Pin, und Du weißt, daß da irgendwelche Aktivität herrscht.
Ich werde mich morgen dann gleich darüber belesen und melde mich dann ob es so funktioniert hat. Schönen Abend
Eine Frage habe ich noch dazu. Der Interrupt lässt ja meinen Programablauf "stoppen" und führt erstmal die routine aus. Was das Porblem sein wird, ist dass mein Programm dann dauernd in die Routine springen wird durch den häufigen Flankenwechsel richtig?
Hmm ich habe mir das jetzt so überlegt... Falls ein Interrupt ausgelöst wird deaktiviere ich nur diesen(geht das?) warte ob der zweite interrupt auslöst von der 2. Leitung und deaktiviere diesen und falls dieser nicht in einer bestimmten zeit auslöst(wie kann ich das zählen?) weiß ich das keine Bewegung auf einer der beiden Leitungen da ist.
David M. schrieb: > Was das Porblem sein wird, ist dass mein Programm dann > dauernd in die Routine springen wird durch den häufigen Flankenwechsel > richtig? Warum ist das ein Problem?
David M. schrieb: > Was das Porblem sein wird, ist dass mein Programm dann > dauernd in die Routine springen wird durch den häufigen Flankenwechsel > richtig? Wenn der Flankenwechsel sehr häufig ist, und Dein Programm durch die ständigen Interrupts nicht mehr dazu kommt, seine eigentlichen Aufgaben abzuarbeiten, dann ist das in der Tat ein Problem. Je höher die Baudrate der so überwachten seriellen Schnittstelle ist, desto höher ist die Interruptrate. Aus genau diesem Grund schlug ich auch vor, einen der Zählerbausteine zu verwenden, und dessen Takt aus dem zu prüfenden Signal zu gewinnen. Der Zähler ist als einfacher Aufwärtszähler zu konfigurieren, und durch einen Vergleich zweier zu unterschiedlichen Zeitpunkten bestimmter Zählerstände lässt sich die Anzahl der Flanken ermitteln, die in der Zwischenzeit stattgefunden haben - ganz ohne Interrupts, ganz ohne Rechenzeitverluste. Die Chance, bei dieser Methode Flanken zu verpassen, ist recht gering; zwischen den beiden Abfragen des Zählerstandes müssten genau 65536 Flanken aufgetreten sein (einen 16-Bit-Zähler angenommen) - bei einer Baudrate von 115200 dauert das immerhin gut eine halbe Sekunde. Was ist eigentlich der Sinn der Übung? Ich mag mir nicht so recht vorstellen, daß hier nur die Information "Gewackel da" bestimmt werden soll.
@David M. (gentleman1408) >Falls ein Interrupt ausgelöst wird deaktiviere ich nur diesen(geht das?) Ja. >warte ob der zweite interrupt auslöst von der 2. Leitung Muss man nicht. Es reicht, wenn man nach Ablauf des Timers nach xx ms den Interrupt wieder anschaltet. Damit hat man maximal alle xx ms einen Interrupt. Das ist ein nicht retriggerbares Monolop in Software.
Rufus Τ. Firefly schrieb: > David M. schrieb: >> Was das Porblem sein wird, ist dass mein Programm dann >> dauernd in die Routine springen wird durch den häufigen Flankenwechsel >> richtig? > > Wenn der Flankenwechsel sehr häufig ist, und Dein Programm durch die > ständigen Interrupts nicht mehr dazu kommt, seine eigentlichen Aufgaben > abzuarbeiten, dann ist das in der Tat ein Problem. Genau genommen muss man aber auch nicht in die ISR springen. Es reicht doch auch aus, wenn man regelmässig nachsieht, ob das enstprechende Interrupt Flag von der Hardware gesetzt wurde.
Das dürfte vom verwendeten µC abhängen; ich gestehe offen ein, mich mit AVRs nur auf recht theoretischer Ebene zu beschäftigen.
Naja diese beiden Leitungen gehen zu einem anderen Modul und sind deren TX RX Leitung. Und will halt gucken ob auf den beiden Leitungen etwas geschieht. Falls z.B. nur die TX Leitung etwas zu diesem modul sendet muss irgendwann mal was auf der RX eine Antowort kommen, falls nicht weiß ich das sich das Modul aufgehangen hat. Ich bin nun soweit das ich Uart mit RX Interrupt programmiert habe damit er aufjedenfall befehle für sich registriert. Nun wollte ich noch 2 Pinchange Interrupts ... Mal sehen wie es klappt.
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.