mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik USART Polling


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Ingo L. (corrtexx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe eine kleine Frage zum USART-Polling auf einem STM32.
Ich habe folgenden Code, der in einer ISR (10kHz) läuft:
  if (USART_GetFlagStatus(USART3, USART_FLAG_RXNE) == SET){
    RS_232.Recieve[RS_232.Index] = USART_Recieve();

    if ( RS_232.Recieve[RS_232.Index] == '#' ){// End of String
      RS_232.Index = 0;
      RS_232.RecieveCompleteFlag = 1;
    }else{
      RS_232.Index++;
      if ( RS_232.Index > (STRINGSIZE-1) ) RS_232.Index = 0; // Indexoverrun
    }
  }
Ich polle das USART_FLAG_RXNE mit 10kHz. Die Baudrate beträgt 1200Bd. 
Wenn ich garantieren kann, dass das Flag und damit das verbundene 
Auslesen kein Zeichen verpasst kann ich das doch so machen oder? 
Zusätzlich könnte man noch das Overrun-Flag auslesen, damit man auch 
erkennt falls man ein Symbol "verpennt" hat.

Habe ich einen Fallstrick vergessen?

Autor: Wolfgang (Gast)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Ingo L. schrieb:
> Ich polle das USART_FLAG_RXNE mit 10kHz. Die Baudrate beträgt 1200Bd.

Bei 1200Bd braucht ein Zeichen (8,1,n) über 8ms. Warum pollst du dafür 
in 0.1ms Abstand, i.e. über 80 Mal pro Zeichen.

Findest du das nicht "etwas" übertrieben?

> USART_Recieve()
> ...
> RS_232.RecieveCompleteFlag = 1;

Wenigstens bist du konsequent bei deiner Namenswahl :-(

Autor: H.Joachim S. (crazyhorse)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und warum pollst du überhaupt?

Autor: Ingo L. (corrtexx)
Datum:

Bewertung
-1 lesenswert
nicht lesenswert
Wolfgang schrieb:
> Findest du das nicht "etwas" übertrieben?
Der Interrupt läuft nunmal so schnell, natürlich könnte man das noch 
ausbremsen...

Wolfgang schrieb:
> Wenigstens bist du konsequent bei deiner Namenswahl :-(
Stimmt :(

H.Joachim S. schrieb:
> Und warum pollst du überhaupt?
Ja ich weiß. Aber ich habe den DMA anderweitig verwendet und einen 
Interrupt zu nehmen sehe ich nicht als notwendig bei der "immensen" 
Übertragrungsrate...

Autor: Wolfgang (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ingo L. schrieb:
> Wolfgang schrieb:
>> Findest du das nicht "etwas" übertrieben?
> Der Interrupt läuft nunmal so schnell, natürlich könnte man das noch
> ausbremsen...

Kann dein UART keinen Interrupt bei Empfang eines Zeichens auslösen? ;-)
Dann bräuchtest du dir überhaupt keine Sorgen machen, ob du irgendetwas 
verpasst, solange du in deinem Programm nicht irgendwo das Timing so 
verhunzt hast, dass ein Interrupt (maximal) alle 8ms nicht durchkommt.

Autor: Jim M. (turboj)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Übrigens:
Wenn man für RS_232.Index eine lokale Variable einführt und benutzt, 
dampft der Optimizer dieses Codestück auf ungefähr 50% ein.

Denn das müsste ja volatile sein, was heisst das überall Lesezugriffe 
auf Speicher und an mehreren Stellen Read-Modify-Write Zyklen gefahren 
werden müsen. Die lokale Variable ist ein Register.

Autor: Ingo L. (corrtexx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jim M. schrieb:
> Wenn man für RS_232.Index eine lokale Variable einführt und benutzt,
> dampft der Optimizer dieses Codestück auf ungefähr 50% ein.
Fluch und Segen wenn man versucht sein Programm von Anfang an sauber zu 
strukturieren. Wobei hier wäre es tatsächlich möglich...

Autor: W.S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ingo L. schrieb:
> Fluch und Segen wenn man versucht sein Programm von Anfang an sauber zu
> strukturieren.

Na, dieser Versuch ist aber ziemlich grandios in die Hose gegangen.
Hast du Angst vor Interrupts?
Oder schaffst du es nicht, sowas wie Lowlevel-Treiber zu schreiben, die 
deine I/O-Ströme sinnvollerweise zwischenpuffern, damit du nicht an 
jeder Ecke auf das Leerwerden eines Sendepuffers warten mußt?

W.S.

Autor: Dirk B. (dirkb)
Datum:

Bewertung
-3 lesenswert
nicht lesenswert
W.S. schrieb:
> Ingo L. schrieb:
>> Fluch und Segen wenn man versucht sein Programm von Anfang an sauber zu
>> strukturieren.
>
> Na, dieser Versuch ist aber ziemlich grandios in die Hose gegangen.
Der ("dieser") Versuch auf einen kopierten Text zu reagieren ist 
sicherlich in das Kleidungsstück gegangen, aber wenn so ein Versuch so 
eine hilflose Frage:
> Hast du Angst vor Interrupts?
produziert, dann schaffst du es wohl nicht, sowas wie 
Lowlevel-Texterkennung mit ganzen Wörtern zu benutzen.

Die Angst,dass im beiläufigen Programm ein Zeichen (maximal) alle 8ms 
nicht durchkommt und deswegen einen Angst-Interrupt benötigt sitzt wohl 
sehr tief.

NB.: wenn im 10kHz Interrupt 'sauber' genug Zeit zur Bearbeitung 
eingeplant ist, dann ist das natürlich auch problemlos.
Wenn die Implementierung so unsauber passiert ist, dass nur über das 
verschmutze Kleidungsstück berichtet werden kann und wegen der 
verschmutzen Hose hilflos fremde Menschen befragt werden müssen, dann 
liegt häufig ein ernsteres Problem vor.

Autor: Wolfgang (Gast)
Datum:

Bewertung
2 lesenswert
nicht lesenswert
Dirk B. schrieb:
> NB.: wenn im 10kHz Interrupt 'sauber' genug Zeit zur Bearbeitung
> eingeplant ist, dann ist das natürlich auch problemlos.

Wenn in einer 10kHz Interruptroutine genug Zeit eingeplant ist, um einen 
Interrupt abzuarbeiten, der maximal alle 8ms aufläuft, hat man in 79 von 
80 Fällen Zeit vorgehalten, die gar nicht benöigt wird und 
möglicherweise dann für andere Dinge fehlt.
Soweit zur sauberen Planung.

Autor: Dirk B. (dirkb)
Datum:

Bewertung
-5 lesenswert
nicht lesenswert
Wolfgang schrieb:
> Wenn in einer 10kHz Interruptroutine genug Zeit eingeplant ist, um einen
> Interrupt abzuarbeiten, der maximal alle 8ms aufläuft, hat man in 79 von
> 80 Fällen Zeit vorgehalten, die gar nicht benöigt wird und
> möglicherweise dann für andere Dinge fehlt.
Nein, die kindliche Folgerung dass Zeit für unbekannt "andere Dinge" 
fehlt wenn in 79 von 80 Fällen 'unnötig' Zeit vorgehalten wird passiert 
nur wenn die 'Planung' so verworren ist, dass "andere Dinge" 
möglicherweise ohne Planung Zeit benötigen. Wenn du einen barrierefreien 
Zugang zu deinen anderen Dingen hättest und den Programmierer fragen 
könntest ob den 'anderen' Dinge auch in dem einen von 80 Fällen die 
Zeit fehlen würde, dann müsstest du nicht deine Absage:
Wolfgang schrieb:
> Soweit zur sauberen Planung.
bekanntgeben und könntest anfangen deine matschigen "möglicherweise"/ 
[unbekannt] 'andere' / [unbekannt] Dinge durch 'saubere'/definierte 
Planung/Beschreibung durch bewusste Programmierung zu ergänzen.

Autor: m.n. (Gast)
Datum:

Bewertung
3 lesenswert
nicht lesenswert
Dirk B. schrieb:
> Wenn die Implementierung so unsauber passiert ist, dass nur über das
> verschmutze Kleidungsstück berichtet werden kann und wegen der
> verschmutzen Hose hilflos fremde Menschen befragt werden müssen, dann
> liegt häufig ein ernsteres Problem vor.

Viele Worte, aber was willst Du uns sagen?
Könntest Du vielleicht in einfachen Worten schreiben, wie der TO sein 
Problem lösen sollte?

Autor: Dirk B. (dirkb)
Datum:

Bewertung
-4 lesenswert
nicht lesenswert
m.n. schrieb:
> Viele Worte, aber was willst Du uns sagen?
ich will euch gar nichts sagen, aber warum kann m.n. kein 
geschriebenes Wort beantworten und ist gezwungen für eure Gruppe einen 
Willen zu einer mündlichen Aussage zu vermuten, obwohl im Forum nur 
Texte möglich sind?

> Könntest Du vielleicht in einfachen Worten schreiben, wie der TO sein
> Problem lösen sollte?
wenn euer Betreuer einem von euch die Erlaubnis gibt einfache 
geschriebene Wörter zu nennen, dann könnte derjenige euer 
Unverständnis aufklären. Ihr seht sicherlich viele Worte die in eurer 
Vielzahl sicherlich etwas schwierig zu nennen sind, aber die 
Hilflosigkeit wenn keiner von euch ein einziges geschriebenes Wort 
nennen kann und deswegen eurer Presseschreiber auf fremde Hilfe 
angewiesen ist, könnte ein ähnlicher Effekt sein wie "dieser"(eine) 
berichtete Versuch der zur Verschmutzung der Hose geführt hat.

NB.: kann einer von euch die Substanz nennen die dazu führt, dass euer 
PR-Schreiber fragen muss ob jemand etwas in einem Text basierten Forum 
"sagen" will?

Autor: Ingo L. (corrtexx)
Datum:

Bewertung
-2 lesenswert
nicht lesenswert
Leute Leute Leute...

W.S. schrieb:
> Na, dieser Versuch ist aber ziemlich grandios in die Hose gegangen.
Und warum dies? Nur weil ich meine ganzen USART/RS-232 Variablen global 
in einer struct , die natürlich volatile ist, aufgesetzt habe? Sehe ich 
nicht als so mega schlimm

W.S. schrieb:
> Hast du Angst vor Interrupts?
Nein, aber warum zum Henker soll ich einen Interrupt dafür benutzen, 
wenn neine Zeitbasis viel schneller ist, als Symbole auftauchen können?

W.S. schrieb:
> damit du nicht an
> jeder Ecke auf das Leerwerden eines Sendepuffers warten mußt?
Ich warte halt nicht,
 if (USART_GetFlagStatus(USART3, USART_FLAG_RXNE) == SET){ 
ich frage es zyklisch ab. Übrigens ist es der Empfangspuffer...

Dirk B. schrieb:
> wenn im 10kHz Interrupt 'sauber' genug Zeit zur Bearbeitung
> eingeplant ist
Dafür ist gesorgt

m.n. schrieb:
> wie der TO sein
> Problem lösen sollte?
Ich sehe derzeit keinen vernünftigen Grund, einen Interrupt oder gar DMA 
zu verwenden. Ich habe hier lediglich gefragt, ob ich etwas damit 
verkehrt mache. Wenn dann wieder Leute kommen und fragen "wieso kein 
Interrupt" und "warum mit 10kHz" dann kann ich nur sagen: Ein Interrupt 
scheint nicht nötig und so schnell weil ich ohne Probleme sogar 10x 
schneller könnte...

: Bearbeitet durch User
Autor: Ingo L. (corrtexx)
Datum:

Bewertung
-1 lesenswert
nicht lesenswert
Die fertige Funktion, die im 10kHz Systick aufgerufen wird sieht, für 
die die es interessiert, derzeit so aus:
void USART_Handling ( void )
{
  if (USART_GetFlagStatus(USART3, USART_FLAG_ORE) == SET){
    volatile uint16_t dummy = 0;

    // Overrun condition
    strcpy ( USART.Recieve, "\nSymbol lost!!!\n" );
    USART.RecieveCompleteFlag = 1
    USART.Index = 0;

    // Clear Flag
    dummy = USART_Recieve();

  }else if (USART_GetFlagStatus(USART3, USART_FLAG_RXNE) == SET){
    USART.Recieve[USART.Index] = USART_Recieve();

    if ( USART.Recieve[USART.Index] == '#' ){// End of String
      USART.Index = 0;
      USART.RecieveCompleteFlag = 1;
    }else{
      USART.Index++;
      if ( USART.Index > (STRINGSIZE-1) ) USART.Index = 0; // Indexoverrun
    }
  }
}
Ich habe zur Sicherheit noch den Fehler abgefangen, dass ich evtl. ein 
oder mehr Zeichen verpassen könnte, ganz ohne Interrupt.

Autor: Ingo L. (corrtexx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nun frage ich mich, warum dieser Beitrag ein "nicht lesenswert" bekommt.
Beitrag "Re: USART Polling"

Autor: m.n. (Gast)
Datum:

Bewertung
2 lesenswert
nicht lesenswert
Dirk B. schrieb:
> ich will euch gar nichts sagen

Gut, Du möchtest nur dumm schwätzen. Erledigt.

Ingo L. schrieb:
> Ich sehe derzeit keinen vernünftigen Grund, einen Interrupt oder gar DMA
> zu verwenden.

DMA würde ich auch nicht verwenden, Interrupt allerdings schon.
Wenn Dir Dein Vorgehen reicht, soll's gut sein.
Mit ein wenig Erfahrung wird man allerdings vom Polling Abstand nehmen, 
da es einem irgendwann auf die Füße fällt.

Autor: Ingo L. (corrtexx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
m.n. schrieb:
> Mit ein wenig Erfahrung wird man allerdings vom Polling Abstand nehmen,
> da es einem irgendwann auf die Füße fällt.
Genau deswegen frage ich ja hier. Warum fällt man auf die Füße? Genau 
diese Antwort suche ich!!! Bei schnelleren Übertragungsraten sehe ich 
das ein, aber bei 1200Bd?! Bitte kläre mich auf

: Bearbeitet durch User
Autor: Wolfgang (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dirk B. schrieb:
> Nein, die kindliche Folgerung dass Zeit für unbekannt "andere Dinge"
> fehlt wenn in 79 von 80 Fällen 'unnötig' Zeit vorgehalten wird passiert
> nur wenn die 'Planung' so verworren ist, dass "andere Dinge"
> möglicherweise ohne Planung Zeit benötigen.

Dann packe mal in deinen 10kHz Interrupt mehrere Dinge rein, die ab und 
zu etwas Zeit erfordern (so wie hier der USART). Genau wenn diese dann 
zufällig im selben Interrupt abgearbeitet werden müssen, brauchst du die 
maximale Zeit und die muss dann tunlichst so ausgelegt sein, dass vorm 
nächsten ISR alles erledigt ist. Hingegen wenn diese seltenen Ereignisse 
in einem eigenen Interrupt mit geringerer Priorität erledigt werden, 
hast du statt 100us plötzlich etliche ms Zeit.

Autor: m.n. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ingo L. schrieb:
> Bitte kläre mich auf

Das ist zunächst unabhängig von der Übertragungsrate. Beim Polling 
reagiert man auf Ereignisse, die eingetreten sein könnten. In Deinem 
Fall siehst Du jede Minute auf die Uhr, um die volle Stunde abzuwarten. 
Bei einem stündlichen Glockenschlag hingegen, kann man ohne 
'neurotisches Kopfwackeln' die reguläre Arbeit erledigen.
Polling macht das Programm zudem intransparent. Achte mal auf die vielen 
Anfängerbeiträge hier, die für zeitliche Abläufe mangels Erfahrung nur 
mit Ketten von delay() programmiert werden. Polling ist dem sehr 
ähnlich.

Per Interrupt wird USART nur dann beachtet, wenn ein neues Zeichen 
empfangen wurde. Die Priorität der Verarbeitung kann dazu frei gewählt 
werden und es wird nur das erledigt, was von derdiedas USART kommt. 
Keine zusätzliche Beachtung von blinkenden LEDs, keine Abfrage von 
Drehgebern oder Tasten, keine Softtimer o.ä..

Autor: Bernd K. (prof7bit)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ingo L. schrieb:
> ganz ohne Interrupt.

Ist das irgendwie ein Wettbewerb oder ein persönlicher Rekordversuch den 
UART so zu bedienen daß der Code möglichst unflexibel wird, möglichst 
viele nützliche Features der MCU brach liegen, der Code sich möglichst 
überall kreuz und quer über die Anwendung und sogar über fremde 
Interrupt-Routinen verteilt, für höheren Energieverbrauch sorgt und 
insgesamt möglichst nicht vernünftig in zukünftigen Projekten 
wiederverwendbar ist? Oder warum sträubst Du Dich so sehr gegen eine 
saubere vernünftige Lösung?

Autor: DanVet (Gast)
Datum:

Bewertung
-1 lesenswert
nicht lesenswert
Ich verstehe auch nicht warum alle auf das Polling schimpfen.
Die 1200Bd mit Polling (10kHz!) abzufragen finde ich völlig in Ordnung.
Ich weiß nicht, was sonst noch innerhalb dieser 10kHz passieren muss, 
aber wenn man das geprüft hat und die nötige Zeit vorhanden ist, ist das 
OK.

Es gibt sogar Anwendungen, bei denen Interrupts "böse" sind.
Man weiß nicht WANN sie kommen, deshalb versucht man alles in eine 
zeitliche Reihenfolge zu bekommen.
TimerInterrupts kommen immer zur selben Zeit, UART-Interrupts: who 
knows?

Autor: H.Joachim S. (crazyhorse)
Datum:

Bewertung
-1 lesenswert
nicht lesenswert
Nun lasst ihn doch.
Er hat entschieden, es so machen zu wollen, fertig. Was solls.

Autor: Ingo L. (corrtexx)
Datum:

Bewertung
-1 lesenswert
nicht lesenswert
Bernd K. schrieb:
> Oder warum sträubst Du Dich so sehr gegen eine
> saubere vernünftige Lösung?
Weil die derzeitigen 100µs zu max. 5µs ausgereizt sind, ich somit noch 
95% frei habe UND der USART (wenn der abgehandelt wird) nicht einmal 
0,35% dazu bringen.

Autor: Bernd K. (prof7bit)
Datum:

Bewertung
2 lesenswert
nicht lesenswert
DanVet schrieb:
> TimerInterrupts kommen immer zur selben Zeit, UART-Interrupts: who
> knows?

Dafür gibts Prioritäten.

Autor: Dirk B. (dirkb)
Datum:

Bewertung
-3 lesenswert
nicht lesenswert
Wolfgang schrieb:
> Dirk B. schrieb:
>> Nein, die kindliche Folgerung dass Zeit für unbekannt "andere Dinge"
>> fehlt wenn in 79 von 80 Fällen 'unnötig' Zeit vorgehalten wird passiert
>> nur wenn die 'Planung' so verworren ist, dass "andere Dinge"
>> möglicherweise ohne Planung Zeit benötigen.
>
> Dann packe mal in deinen 10kHz Interrupt mehrere Dinge rein, die ab und
> zu etwas Zeit erfordern (so wie hier der USART). Genau wenn diese dann
> zufällig im selben Interrupt abgearbeitet werden müssen, brauchst du die
> maximale Zeit und die muss dann tunlichst so ausgelegt sein, dass vorm
> nächsten ISR alles erledigt ist.
Wenn du nicht eigenständig antworten /programmieren kannst und deine 
Methode beliebig "mehre Dinge", die ab und zu "etwas" Zeit erfordern in 
einen Interrupt reinzupacken einem Menschen befehlen musst, dann wäre 
eine Spende an die Gruppe der Betreuten sicher die einfachere Methode. 
Der aktuell betriebene lowlevel-Interrupt des Lobbyprogramms das 
lediglich Selbstauskunft("möchte nur dumm _schwätzen_") geben kann, da 
für das billig Progrämmchen Menschenverstand der die technische 
Unmöglichkeit verstehen könnte wohl zu teuer ist. Auch wenn du nicht aus 
eigener Kraft antworten kannst so kannst du doch immerhin einzelne 
Wörter nennen, vielleicht kannst du deine Dinge denen "möglicherweise" 
nur dann Zeit fehlt wenn diese die Vorhaltung als unnötig erkannt haben 
bei " m.n." implementieren und damit zufällig die Möglichkeit geben 
einzelne Wörter aus der Umwelt wahrzunehmen, sodass er nicht nur über 
sich und seine Gruppe Texte ausgeben muss.

Die zwanghaften Dummschwätzer die kein einziges geschriebenes Wort aus 
einem Satz beantworten können, lassen sich am Zwang zur Sprachwunsch 
ablesen...

Autor: Ingo L. (corrtexx)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Also Dirk, dein Geschwafel kann sich kein Mensch antun, echt. Ich hör 
dich reden, aber nichts sagen...

Autor: Dirk B. (dirkb)
Datum:

Bewertung
-2 lesenswert
nicht lesenswert
Ingo L. schrieb:
> Also Dirk, dein Geschwafel kann sich kein Mensch antun, echt. Ich hör
> dich reden, aber nichts sagen...
solche Halluzinationen dürften wohl ansteckend sein wenn die Kraft fehlt 
eigenständig einen Satz zu benennen und ein Zwang zu einer Reaktion 
besteht. Wenn du Zugang zu einem PC-Spezialisten hast, dann könnte er 
dir erklären wie du dein wahrgenommenes Geschwafel zumindest PC-Seitig 
ausschließen könntes.

Dein Kollege (mit dem gescheiterten Versuch) der 120 einzelne Zeichen je 
Sekunde als "deine I/O-Ströme"[Mehrzahl] empfunden hat dürfte dann wohl 
besser zu deiner Schwafelliga passen in der eine ehrliche Nennung eines 
Textes unmöglich ist und die Ursache dafür natürlich bei Anderen 
vermutet werden muss.

Sorry ich wollte dich nicht Texten belasten wenn es für dich so 
schwierig ist auf einen Satz zu antworten. Viel Spass mit den anderen 
Betroffen die nicht eigenständig auf Texte antworten können und von der 
Hilfe des Autor abhängig sind, damit sie auf Texte reagieren können.

Autor: Peter D. (peda)
Datum:

Bewertung
3 lesenswert
nicht lesenswert
Ich würde für die UART lieber die extra dafür vorgesehenen Interrupts 
verwenden. Dann kann ich auch mal die Baudrate erhöhen, ohne das mir 
eine Pollingrate auf die Füße fällt. Oder die Timerrate verringern, ohne 
Seiteneffekte auf die UART befüchten zu müssen.
Verschiedene Sachen miteinander zu verweben mache ich nur, wenn es 
zwingende Gründe dafür gibt.

Autor: Dirk B. (dirkb)
Datum:

Bewertung
-6 lesenswert
nicht lesenswert
Peter D. schrieb:
> Ich würde für die UART lieber die extra dafür vorgesehenen
> Interrupts
> verwenden. Dann kann ich auch mal die Baudrate erhöhen, ohne das mir
> eine Pollingrate auf die Füße fällt.
Mit einem barrierefreien Zugang zum Programm ließe sich die eine 
Pollingrate, die durch einen der zusätzlich dafür vorgesehenen 
Interrupte nicht mehr "auf die Füße fällt", auch vor so einem Experiment 
identifizieren und mit etwas Mathematik anhand der Werte berechnen, 
sodass so eine Hilfe nicht notwendig wäre. Wenn etwas Erfahrung in dem 
Bereich vorhanden ist, dann sind solche Experimentiermöglichkeiten ohne 
Wirkungen auf die UART oder eine unbekannte Pollingrate befürchten zu 
müssen, häufig auch nicht so spannend, dass deswegen gleich Änderungen 
im Programm notwendig werden.
Der Seiteneffekt einer starken Erhöhung der Fehlerrate wenn mal die 
Baudrate erhöht wird, ließe sich mit etwas Hintergrundinformation auch 
ohne Experiment vorhersagen und wenn mit Hilfe eines angepassten Senders 
eine passend erhöhte Baudrate experimentell überprüft wird, dann fällt 
eventuell die Pollingrate auf "USART.RecieveCompleteFlag" auf die Füße.

Technisch ist das zweifache Polling auf ein einzelnes Zeichen und die 
Zeichenkette die in der Variante ebenfalls innerhalb der Zeitspanne 
eines Zeichens verrechnet wird, das Überflüssige. Ob das einzelne 
Zeichen zu häufig geprüft wird oder 'bedarfsgerecht' empfangen wird ist 
dabei egal.

Wenn KEIN Teil der Abläufe die nacheinander innerhalb der Zeitspanne 
eines Zeichens abzuarbeiten sind in eine ISR ausgelagert wird d.h. 
weder(!) eine 10khz-isr noch eine uart-isr, dann wäre die relevante 
'Pollingrate' sauber im Programm zu finden, wenn dann weitere 
Anforderungen kämen dann ließe sich eine ISR mit 2 Strings 
implementieren um diese zu erfüllen.

Autor: Lama (Gast)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Peter D. schrieb:
> Dann kann ich auch mal die Baudrate erhöhen, ohne das mir
> eine Pollingrate auf die Füße fällt. Oder die Timerrate verringern, ohne
> Seiteneffekte auf die UART befüchten zu müssen.

-> defensive Programmierung. Profis machen es grundsätzlich, für die 
Anfänger ist es halt "unnötiger" Denk- und Programmieraufwand. Jedem das 
Seine  :-)

Peter D. schrieb:
> Verschiedene Sachen miteinander zu verweben mache ich nur, wenn es
> zwingende Gründe dafür gibt.

-> Absolute Zustimmung.

Autor: Lama (Gast)
Datum:

Bewertung
3 lesenswert
nicht lesenswert
@Dirk Braun: höre bitte auf zu schreiben. danke.

Autor: Dirk B. (dirkb)
Datum:

Bewertung
-5 lesenswert
nicht lesenswert
Lama schrieb:
> @Dirk Braun: höre bitte auf zu schreiben. danke.
hast du keine Filterblase die dich vor Texten beschützen kann, damit du 
nicht auf so eine Unterstützung angewiesen bist?

Wenn du so intransparent implementierst wurdest, dass du nur fremde 
Namen nennen darfst, dann können deine Betreuer auch nicht ermitteln 
welche Worte bei dir so einen Leidensdruck verursachen und dich vor 
anderen belastenden Worten beschützen.

Autor: H.Joachim S. (crazyhorse)
Datum:

Bewertung
3 lesenswert
nicht lesenswert
Was ne Labertasche....
Kannst hier keinem imponieren mit deinem aufgeblasenen Geschreibsel.
Lass es wirklich lieber sein (und zeig am besten, dass du diesen 
einfachen Satz sinnerfassend lesen konntest und auch verstanden hast).

Autor: Dirk B. (dirkb)
Datum:

Bewertung
-4 lesenswert
nicht lesenswert
H.Joachim S. schrieb:
> Was ne Labertasche....
> Kannst hier keinem imponieren mit deinem aufgeblasenen Geschreibsel.
> Lass es wirklich lieber sein (und zeig am besten, dass du diesen
> einfachen Satz sinnerfassend lesen konntest und auch verstanden hast).
Dein Sozialbericht über deine Labertasche und deine Anweisung durch 
Untätigkeit etwas zu zeigen ist sicherlich psychologisch spannend.

Wenn du so intelligent wärst und "einfachen Satz sinnerfassend lesen" 
und kopieren könntest, dann müsstest du nicht von deinem Projekt 
Labertasche berichteten sondern könntest wie ein intelligenter Mensch 
Texte beantworten.

Das Geschwafel wenn Unselbstständige nur von Fremden berichten und nicht 
eigenständig eine einfache technische Frage beantworten können, ob es 
sinnvoll ist "USART.RecieveCompleteFlag" mit etlichen MHZ zu pollen, 
erzeugt dann aus traditioneller defensiver Programmierung "die möglichst 
viele Voraussetzungen selbst überprüft, bevor der eigentliche 
Selbstzweck erfüllt wird" (Wiki) eine Beschäftigungstherapie damit der 
Programmierwillige seine Experimente machen muss.

Wenn die Intelligenz nicht reicht Sätze aus  der Umwelt zu kopieren und 
diese zu beantworten, dann bleibt nur der private Bericht über private 
Labertaschen.

Autor: Karl B. (gustav)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Ingo L. schrieb:
> Habe ich einen Fallstrick vergessen?

Hi,
Framing error abfangen. (Falls hier nichts übersehen wurde.)

ciao
gustav

Autor: Ingo L. (corrtexx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl B. schrieb:
> Framing error abfangen.
Ja danke, ich denke es macht zusätzlich Sinn auch Parity_Error und evtl. 
noch Noise_Detect abzufragen

Autor: Dirk B. (dirkb)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ingo L. schrieb:
> ich denke es macht zusätzlich Sinn auch Parity_Error und evtl.
> noch Noise_Detect abzufragen
bei defensiver Programmierung müsstest du die Voraussetzung für 
Parity_Error (Parity-Bit im verwendeten Protokoll) vorher prüfen und 
zusätzlich einen 'Framing Error' beim Empfang nacheinander folgender 
Zeichen abfragen:
wenn nach bspw. 1sek kein Zeichen empfangen wurde, dann dürfte sicher 
sein, dass die zuvor empfangenen Zeichen nicht zum String gehören.
Ein trivialer Timeout ist dann in der 10kHZ-Isr sehr einfach zu 
programmieren, während Beliebigkeitsorientierte u.U. keinen der 
genommenen "vorgesehenen Interrupts" finden.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.