Forum: Compiler & IDEs Leitung "beobachten" UART


von David M. (gentleman1408)


Lesenswert?

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

von David M. (gentleman1408)


Lesenswert?

Falls mehr Informationen gebraucht werden bitte Bescheid sagen :)

von Hmm (Gast)


Lesenswert?

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.

von Falk B. (falk)


Lesenswert?

Bahnhof.

von Peter D. (peda)


Lesenswert?

Pin-Change Interrupt: LED einschalten
Timer Interrupt: LED nach ~200ms ausschalten


Peter

von David M. (gentleman1408)


Lesenswert?

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 !

von Falk B. (falk)


Lesenswert?

Vielleicht suchst du einen Logiktester

von David M. (gentleman1408)


Lesenswert?

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.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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.

von Falk B. (falk)


Lesenswert?


von David M. (gentleman1408)


Lesenswert?

Ich werde mich morgen dann gleich darüber belesen und melde mich dann ob 
es so funktioniert hat.

Schönen Abend

von David M. (gentleman1408)


Lesenswert?

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?

von Falk B. (falk)


Lesenswert?

JA

von David M. (gentleman1408)


Lesenswert?

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.

von Klaus Dieter (Gast)


Lesenswert?

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?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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.

von Falk B. (falk)


Lesenswert?

@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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Das dürfte vom verwendeten µC abhängen; ich gestehe offen ein, mich mit 
AVRs nur auf recht theoretischer Ebene zu beschäftigen.

von David M. (gentleman1408)


Lesenswert?

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
Noch kein Account? Hier anmelden.