https://rn-wissen.de/wiki/index.php?title=%C3%9Cberlegungen_zur_Drehgeber-Auswertung&feed=atom&action=history
Überlegungen zur Drehgeber-Auswertung - Versionsgeschichte
2024-03-29T12:43:07Z
Versionsgeschichte dieser Seite in RN-Wissen.de
MediaWiki 1.25.1
https://rn-wissen.de/wiki/index.php?title=%C3%9Cberlegungen_zur_Drehgeber-Auswertung&diff=25298&oldid=prev
Besserwessi: /* Drehgeber-Auswertung */ Link angepasst
2014-09-21T17:03:41Z
<p><span dir="auto"><span class="autocomment">Drehgeber-Auswertung: </span> Link angepasst</span></p>
<table class='diff diff-contentalign-left'>
<col class='diff-marker' />
<col class='diff-content' />
<col class='diff-marker' />
<col class='diff-content' />
<tr style='vertical-align: top;'>
<td colspan='2' style="background-color: white; color:black; text-align: center;">← Nächstältere Version</td>
<td colspan='2' style="background-color: white; color:black; text-align: center;">Version vom 21. September 2014, 17:03 Uhr</td>
</tr><tr><td colspan="2" class="diff-lineno" id="L1" >Zeile 1:</td>
<td colspan="2" class="diff-lineno">Zeile 1:</td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>=Drehgeber-Auswertung=</div></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>=Drehgeber-Auswertung=</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>Es gibt in RN-Wissen schon einige (sehr gute) Artikel über Drehgeber und Auswertungsvarianten. Denen will ich hier keine Konkurrenz machen.<br/>  </div></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>Es gibt in RN-Wissen schon einige (sehr gute) Artikel über Drehgeber und Auswertungsvarianten. Denen will ich hier keine Konkurrenz machen.<br/>  </div></td></tr>
<tr><td class='diff-marker'>−</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div>[[Sensorarten#<del class="diffchange diffchange-inline">Incremental-Geber</del>|Technisches]] findet man hier, [[Beispiel_Drehzahlmessung_mit_Drehgeber#Richtung.2C_Geschwindigkeit_und_Position_mit_Doppellichtschranke_ermitteln|Grundsätzliches]] über das Quadratur-Signal da, und [[Drehencoder|Programm-Beispiele]] für Drehencoder gibt es auch<br/></div></td><td class='diff-marker'>+</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div>[[Sensorarten#<ins class="diffchange diffchange-inline">Drehgeber Sharp GP1A30 und GP1A38</ins>|Technisches]] findet man hier, [[Beispiel_Drehzahlmessung_mit_Drehgeber#Richtung.2C_Geschwindigkeit_und_Position_mit_Doppellichtschranke_ermitteln|Grundsätzliches]] über das Quadratur-Signal da, und [[Drehencoder|Programm-Beispiele]] für Drehencoder gibt es auch<br/></div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>Ich möchte dem einige grundsätzliche Überlegungen zur Drehgeber-Auswertung hinzufügen, damit es einem Einsteiger leichter fällt, eine Auswahl für seine konkreten Anforderungen zu treffen.  </div></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>Ich möchte dem einige grundsätzliche Überlegungen zur Drehgeber-Auswertung hinzufügen, damit es einem Einsteiger leichter fällt, eine Auswahl für seine konkreten Anforderungen zu treffen.  </div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td></tr>
</table>
Besserwessi
https://rn-wissen.de/wiki/index.php?title=%C3%9Cberlegungen_zur_Drehgeber-Auswertung&diff=23746&oldid=prev
Besserwessi: /* INT0/1 oder Polling ? */
2014-03-26T21:06:38Z
<p><span dir="auto"><span class="autocomment">INT0/1 oder Polling ?</span></span></p>
<table class='diff diff-contentalign-left'>
<col class='diff-marker' />
<col class='diff-content' />
<col class='diff-marker' />
<col class='diff-content' />
<tr style='vertical-align: top;'>
<td colspan='2' style="background-color: white; color:black; text-align: center;">← Nächstältere Version</td>
<td colspan='2' style="background-color: white; color:black; text-align: center;">Version vom 26. März 2014, 21:06 Uhr</td>
</tr><tr><td colspan="2" class="diff-lineno" id="L47" >Zeile 47:</td>
<td colspan="2" class="diff-lineno">Zeile 47:</td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>===Programmtechnische Umsetzung===</div></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>===Programmtechnische Umsetzung===</div></td></tr>
<tr><td class='diff-marker'>−</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div>====<del class="diffchange diffchange-inline">INT0/1 </del>oder Polling ?====</div></td><td class='diff-marker'>+</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div>====<ins class="diffchange diffchange-inline">Externer Interrupt </ins>oder Polling ?====</div></td></tr>
<tr><td class='diff-marker'>−</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div><del class="diffchange diffchange-inline">* Wie schon erwähnt, bei AVR's bieten sich die beiden "external interrrupts" geradezu an. </del>Bei <del class="diffchange diffchange-inline">vielen fertigen Boards werden </del>die <del class="diffchange diffchange-inline">notwendigen Leitungen schon für einen Anschluss herausgeführt. Bei neuere AVR µCs </del>(z.B. <del class="diffchange diffchange-inline">Mega88) bietet sich </del>der Pin-Change Interrupt <del class="diffchange diffchange-inline">an, der an allen Ports verfügbar ist. Die Hauptschleife (DO...LOOP</del>) <del class="diffchange diffchange-inline">bzw. (while(true)) braucht sich dadurch nicht unbedingt um die Sache zu kümmern. Unpraktisch ist ein externer Interrupt</del>, <del class="diffchange diffchange-inline">wenn es durch eine kleine Hysterese zu vielen Störungen kommen kann</del>, <del class="diffchange diffchange-inline">wenn eine der Lichtschranken gerade an der Grenze ist. Man hat dann im ungünstigen Fall ein sehr hohe Interruptfrequenz und </del>ggf. <del class="diffchange diffchange-inline">auftretende Schrittfehler werden zum Problem. <br/></del></div></td><td class='diff-marker'>+</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div>Bei <ins class="diffchange diffchange-inline">der Auswertung hat man </ins>die <ins class="diffchange diffchange-inline">Wahl zwischen einem externen Interrupt, der auf jede Änderung reagiert </ins>(z.B. der Pin-Change Interrupt <ins class="diffchange diffchange-inline">beim neueren AVR wie Mega88</ins>) <ins class="diffchange diffchange-inline">oder dem regelmäßigen Polling des Zustandes</ins>, <ins class="diffchange diffchange-inline">etwa in einer Timer ISR</ins>, <ins class="diffchange diffchange-inline">oder weniger gut </ins>ggf. <ins class="diffchange diffchange-inline">auch </ins>in der <ins class="diffchange diffchange-inline">Schleife im Hauptprogramm</ins>. <ins class="diffchange diffchange-inline">Der eigentliche Code zur Auswertung ist </ins>der <ins class="diffchange diffchange-inline">gleiche - die Frage ist also nur noch wann er aufgerufen wird</ins>.  </div></td></tr>
<tr><td class='diff-marker'>−</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div><del class="diffchange diffchange-inline">Bei Odometrie-Anwendungen gehen die oben erwähnten möglichen Schrittfehler meistens völlig </del>in der <del class="diffchange diffchange-inline">Gesamt-Ungenauigkeit unter (schlupfende Räder etc</del>.<del class="diffchange diffchange-inline">).<br/></del></div></td><td class='diff-marker'>+</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div></div></td></tr>
<tr><td class='diff-marker'>−</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div><del class="diffchange diffchange-inline">Hat man als Drehgeber ein Dateneingaberad ( z.B. für Menüs u. Parametereingaben) erfolgt ohnehin eine Sichtkontrolle </del>der <del class="diffchange diffchange-inline">Position, da kommt es schon garnicht darauf an</del>.</div></td><td class='diff-marker'>+</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div></div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td></tr>
<tr><td class='diff-marker'>−</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div><del class="diffchange diffchange-inline">* Die Sache liegt anders</del>, wenn <del class="diffchange diffchange-inline">wirklich kein Tick falsch interpretiert werden soll</del>, <del class="diffchange diffchange-inline">also z</del>.<del class="diffchange diffchange-inline">B. bei Positionier-Anwendungen. Da </del>ist <del class="diffchange diffchange-inline">es wohl besser</del>, <del class="diffchange diffchange-inline">die Eingänge zu pollen und alle Übergänge auszuwerten.<br/></del></div></td><td class='diff-marker'>+</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins class="diffchange diffchange-inline">Beim Polling wird eine häufige Abfrage benötigt</ins>, <ins class="diffchange diffchange-inline">um keine Schritte zu verlieren. Auch </ins>wenn <ins class="diffchange diffchange-inline">sich in den meisten Fällen nichts getan hat</ins>, <ins class="diffchange diffchange-inline">wird dafür Rechenzeit benötigt</ins>. <ins class="diffchange diffchange-inline">Die Belastung für den µC </ins>ist <ins class="diffchange diffchange-inline">damit praktisch unabhängig vom Signal</ins>, <ins class="diffchange diffchange-inline">abhängig von </ins>der <ins class="diffchange diffchange-inline">maximalen erlaubten Geschwindigkeit</ins>.</div></td></tr>
<tr><td class='diff-marker'>−</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div><del class="diffchange diffchange-inline">Das kann man durchaus in </del>der <del class="diffchange diffchange-inline">Hauptschleife machen, wenn dann die Abtastfrequenz ausreichend ist, man kann aber auch durch einen TIMER-Interrupt das Polling auslösen (mit dem gleichen Kriterium)</del>.  </div></td><td class='diff-marker'>+</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div></div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td></tr>
<tr><td class='diff-marker'>−</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div><del class="diffchange diffchange-inline">* Ganz elegant ist natürlich eine Mischform: </del>wenn man <del class="diffchange diffchange-inline">auch die Geschwindigkeit misst</del>, kann <del class="diffchange diffchange-inline">man abhängig davon </del>die <del class="diffchange diffchange-inline">Methode ändern</del>, <del class="diffchange diffchange-inline">denn </del>die <del class="diffchange diffchange-inline">genannten Schrittfehler </del>werden <del class="diffchange diffchange-inline">bei höherem Tempo kaum auftreten</del>, <del class="diffchange diffchange-inline">eher bei Stillstand</del>, <del class="diffchange diffchange-inline">genauso, wie </del>auch die <del class="diffchange diffchange-inline">Geschwindigkeitsmessung selbst wechseln kann zwischen "schritte in </del>der <del class="diffchange diffchange-inline">Zeit" </del>und <del class="diffchange diffchange-inline">"Zeit je Schritt"</del>.</div></td><td class='diff-marker'>+</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins class="diffchange diffchange-inline">Bei der Interrupt-Lösung, erfolgt die Auswertung nur </ins>wenn <ins class="diffchange diffchange-inline">wirklich ein Schritt erfolgt oder halt gerade eine Störung kommt. Hat </ins>man <ins class="diffchange diffchange-inline">nur selten Störungen ist dies ein echter Vorteil, weil das Hauptprogramm nur selten unterbrochen wird. Bei dem seltenen Extremfall von starken Störungen</ins>, kann <ins class="diffchange diffchange-inline">es aber passieren das </ins>die <ins class="diffchange diffchange-inline">ISR sehr häufig aufgerufen wird und kaum noch Rechenzeit für da Hauptprogramm übrig bleibt. Wenn solche extremen Störungen möglich sind (etwa optische Geber ohne Hysterese)</ins>, <ins class="diffchange diffchange-inline">sind externe Interrupts generell nicht zu empfehlen. Bei schneller Bewegung und entsprechend vielen ISR-Aufrufen kann </ins>die <ins class="diffchange diffchange-inline">Geschwindigkeit des Hauptprogramms geringer </ins>werden<ins class="diffchange diffchange-inline">. Wartezeiten durch Warteschleifen sind dann nicht mehr zuverlässig. Oft wird aber nur ein sehr kleiner Anteil der Rechenleistung benötigt.</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div> </div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins class="diffchange diffchange-inline">Sofern man kleine Fehler tolerieren kann</ins>, <ins class="diffchange diffchange-inline">etwa für eine Menüsteuerung oder Geschwindigkeitsmessung ohne Richtungswechsel</ins>, <ins class="diffchange diffchange-inline">kann man natürlich </ins>auch die <ins class="diffchange diffchange-inline">Auswertung über einen externen Interrupt wählen, </ins>der <ins class="diffchange diffchange-inline">nur eine Flanke auswertet. Damit reduziert sich ggf. die Rechenzeit auf Kosten geringerer Auflösung </ins>und <ins class="diffchange diffchange-inline">möglicher Schrittfehler</ins>.</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>====Auswertung der Signale====</div></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>====Auswertung der Signale====</div></td></tr>
</table>
Besserwessi
https://rn-wissen.de/wiki/index.php?title=%C3%9Cberlegungen_zur_Drehgeber-Auswertung&diff=23745&oldid=prev
Besserwessi: /* Auswertung der Flanken */
2014-03-26T20:22:07Z
<p><span dir="auto"><span class="autocomment">Auswertung der Flanken</span></span></p>
<table class='diff diff-contentalign-left'>
<col class='diff-marker' />
<col class='diff-content' />
<col class='diff-marker' />
<col class='diff-content' />
<tr style='vertical-align: top;'>
<td colspan='2' style="background-color: white; color:black; text-align: center;">← Nächstältere Version</td>
<td colspan='2' style="background-color: white; color:black; text-align: center;">Version vom 26. März 2014, 20:22 Uhr</td>
</tr><tr><td colspan="2" class="diff-lineno" id="L8" >Zeile 8:</td>
<td colspan="2" class="diff-lineno">Zeile 8:</td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>[[Bild:quad_0.png|center]]</div></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>[[Bild:quad_0.png|center]]</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>===Auswertung der Flanken===</div></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>===Auswertung der Flanken===</div></td></tr>
<tr><td class='diff-marker'>−</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div>Gerade bei den AVR's bietet es sich an, das A-Signal an einen "Externen Interrupt" <del class="diffchange diffchange-inline">anzuschliessen</del>.  </div></td><td class='diff-marker'>+</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div>Gerade bei den AVR's bietet es sich an, das A-Signal an einen "Externen Interrupt" <ins class="diffchange diffchange-inline">anzuschließen</ins>.  </div></td></tr>
<tr><td class='diff-marker'>−</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div>Da man meist auch zwei Drehgeber hat (für links u. rechts), kommt man da wunderbar mit INT0 u. INT1 aus.  </div></td><td class='diff-marker'>+</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div>Da man meist auch zwei Drehgeber hat (für links u. rechts), kommt man da wunderbar mit INT0 u. INT1 aus<ins class="diffchange diffchange-inline">.  Allerdings zeigt sich, dass dieser Weg nicht ideal ist</ins>.</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>====Vorwärts====</div></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>====Vorwärts====</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>Bei einer Konfiguration "steigende Flanke" wird bei den dicken Pfeilen der Interrupt ausgelöst. Liest man in der ISR den B-Kanal, kann man daraus direkt die Richtung entnehmen (im Beispiel ist das ebenfalls "1") und auf den Schrittzähler 1 addieren.   </div></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>Bei einer Konfiguration "steigende Flanke" wird bei den dicken Pfeilen der Interrupt ausgelöst. Liest man in der ISR den B-Kanal, kann man daraus direkt die Richtung entnehmen (im Beispiel ist das ebenfalls "1") und auf den Schrittzähler 1 addieren.   </div></td></tr>
</table>
Besserwessi
https://rn-wissen.de/wiki/index.php?title=%C3%9Cberlegungen_zur_Drehgeber-Auswertung&diff=23744&oldid=prev
Besserwessi: /* Auswertung der Übergänge */
2014-03-26T20:18:14Z
<p><span dir="auto"><span class="autocomment">Auswertung der Übergänge</span></span></p>
<table class='diff diff-contentalign-left'>
<col class='diff-marker' />
<col class='diff-content' />
<col class='diff-marker' />
<col class='diff-content' />
<tr style='vertical-align: top;'>
<td colspan='2' style="background-color: white; color:black; text-align: center;">← Nächstältere Version</td>
<td colspan='2' style="background-color: white; color:black; text-align: center;">Version vom 26. März 2014, 20:18 Uhr</td>
</tr><tr><td colspan="2" class="diff-lineno" id="L24" >Zeile 24:</td>
<td colspan="2" class="diff-lineno">Zeile 24:</td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>=== Auswertung der Übergänge===</div></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>=== Auswertung der Übergänge===</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>(Genaugenommen der Zustände unmittelbar danach)<br/></div></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>(Genaugenommen der Zustände unmittelbar danach)<br/></div></td></tr>
<tr><td class='diff-marker'>−</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div>Die <del class="diffchange diffchange-inline">genaueste </del>Auswertung ist möglich, wenn man alle Übergänge steigend/fallend von beiden Kanälen (A u. B) bewertet. Das kann man ebenfalls mit ISR's machen, wenn man den µC so konfigurieren kann, dass er <del class="diffchange diffchange-inline">beide </del>Flankenarten auslöst. Da <del class="diffchange diffchange-inline">dafür aber nur ein </del>ISR<del class="diffchange diffchange-inline">-Vektor zur Verfügung steht</del>, <del class="diffchange diffchange-inline">muss man in </del>der <del class="diffchange diffchange-inline">Routine sowohl Kanal A als auch B abfragen und </del>auch, <del class="diffchange diffchange-inline">ob fallend </del>oder <del class="diffchange diffchange-inline">steigend.<br/></del></div></td><td class='diff-marker'>+</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div>Die <ins class="diffchange diffchange-inline">korrekte </ins>Auswertung ist möglich, wenn man alle Übergänge steigend/fallend von beiden Kanälen (A u. B) bewertet. Das kann man ebenfalls mit ISR's machen, wenn man den µC so konfigurieren kann, dass er <ins class="diffchange diffchange-inline">bei beiden </ins>Flankenarten auslöst. Da <ins class="diffchange diffchange-inline">die Auswertung nicht nach der Art des Interrupts unterscheidet, kann dies auch eine gemeinsame </ins>ISR <ins class="diffchange diffchange-inline">sein</ins>, <ins class="diffchange diffchange-inline">etwa </ins>der <ins class="diffchange diffchange-inline">Pin-Change Interrupt beim AVR. </ins></div></td></tr>
<tr><td class='diff-marker'>−</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div><del class="diffchange diffchange-inline">Am einfachsten merkt </del>man sich <del class="diffchange diffchange-inline">immer </del>den Zustand <del class="diffchange diffchange-inline">von </del>A <del class="diffchange diffchange-inline">u. </del>B und <del class="diffchange diffchange-inline">vergleicht </del>mit dem <del class="diffchange diffchange-inline">neuen Abtastergebnis</del>.<del class="diffchange diffchange-inline"><br/></del></div></td><td class='diff-marker'>+</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins class="diffchange diffchange-inline">Um </ins>auch <ins class="diffchange diffchange-inline">auf sehr kurze Pulse</ins>, <ins class="diffchange diffchange-inline">wie sie etwa durch Störungen </ins>oder <ins class="diffchange diffchange-inline">eine schnelle hin und her Bewegung entstehen können, darf </ins>man sich <ins class="diffchange diffchange-inline">nicht auf die Auslösung des Interrupts stützen (da kann ggf. eine verloren gehen), sondern muss </ins>den Zustand <ins class="diffchange diffchange-inline">(</ins>A <ins class="diffchange diffchange-inline">und </ins>B<ins class="diffchange diffchange-inline">) jeweils einmal auslesen </ins>und mit <ins class="diffchange diffchange-inline">den alten (aus </ins>dem <ins class="diffchange diffchange-inline">letzten Interrupt) vergleichen</ins>.  </div></td></tr>
<tr><td class='diff-marker'>−</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div>Im Grunde ist das dann dasselbe, als wenn man ohne ISR periodisch die Eingänge abtastet, was natürlich oft genug geschehen muss, damit nichts verlorengeht. Die Flanken selbst erkennt man an dem <del class="diffchange diffchange-inline">Unterschien </del>AB / AB-alt.<br/>  </div></td><td class='diff-marker'>+</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div>Im Grunde ist das dann dasselbe, als wenn man ohne ISR periodisch die Eingänge abtastet, was natürlich oft genug geschehen muss, damit nichts verlorengeht. Die Flanken selbst erkennt man an dem <ins class="diffchange diffchange-inline">Unterschied </ins>AB / AB-alt.<br/>  </div></td></tr>
<tr><td class='diff-marker'>−</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div>In beiden Fällen erfolgt dann die Auswertung an den <del class="diffchange diffchange-inline">strichlierten </del>senkrechten Linien.     </div></td><td class='diff-marker'>+</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div>In beiden Fällen erfolgt dann die Auswertung an den <ins class="diffchange diffchange-inline">strichlinierten </ins>senkrechten Linien.     </div></td></tr>
<tr><td class='diff-marker'>−</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div>[[Bild:quad_states.png|center]]</div></td><td class='diff-marker'>+</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div>[[Bild:quad_states.png|center]]  </div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>====Vorwärts====</div></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>====Vorwärts====</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>Von dem Mitte nach rechts gelesen bekommt also an den bezeichneten Stellen die Werte</div></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>Von dem Mitte nach rechts gelesen bekommt also an den bezeichneten Stellen die Werte</div></td></tr>
<tr><td colspan="2" class="diff-lineno" id="L43" >Zeile 43:</td>
<td colspan="2" class="diff-lineno">Zeile 43:</td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>* 10  vorher: 11</div></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>* 10  vorher: 11</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>* usw</div></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>* usw</div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;">====Störpulse====</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;">Bei Störpulsen kommt es in kurzer Zeit zu einem Schritt vor und zurück (oder andersherum). Wenn die beiden Schritte zu schnell kommen, wird ggf. nur einmal die Auswertung aufgerufen. Dabei ist dann der alte und neue Wert gleich - so dass kein Schritt erfolgt.</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;"></ins></div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>===Programmtechnische Umsetzung===</div></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>===Programmtechnische Umsetzung===</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>====INT0/1 oder Polling ?====</div></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>====INT0/1 oder Polling ?====</div></td></tr>
</table>
Besserwessi
https://rn-wissen.de/wiki/index.php?title=%C3%9Cberlegungen_zur_Drehgeber-Auswertung&diff=22716&oldid=prev
Besserwessi: /* Auswertung der Signale */
2013-06-15T16:45:40Z
<p><span dir="auto"><span class="autocomment">Auswertung der Signale</span></span></p>
<table class='diff diff-contentalign-left'>
<col class='diff-marker' />
<col class='diff-content' />
<col class='diff-marker' />
<col class='diff-content' />
<tr style='vertical-align: top;'>
<td colspan='2' style="background-color: white; color:black; text-align: center;">← Nächstältere Version</td>
<td colspan='2' style="background-color: white; color:black; text-align: center;">Version vom 15. Juni 2013, 16:45 Uhr</td>
</tr><tr><td colspan="2" class="diff-lineno" id="L56" >Zeile 56:</td>
<td colspan="2" class="diff-lineno">Zeile 56:</td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>====Auswertung der Signale====</div></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>====Auswertung der Signale====</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>Auch wenn bei der Benutzung von Interrupts schon eine Information da ist, welcher Kanal sich geändert hat (und ggf. auch in welche Richtung), sollte die Auswertung trotzdem wie beim Polling erfolgen: Die beiden Kanäle einmal Auslesen, und dann zusammen mit dem vorherigen Wert bestimmen ob es einen Schritt gab und in welche Richtung. So kann verhindert werden, dass durch zu schnelle Interrupts, z.B. durch kurzzeitige Störungen Schritte verloren gehen und Fehler entstehen.  </div></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>Auch wenn bei der Benutzung von Interrupts schon eine Information da ist, welcher Kanal sich geändert hat (und ggf. auch in welche Richtung), sollte die Auswertung trotzdem wie beim Polling erfolgen: Die beiden Kanäle einmal Auslesen, und dann zusammen mit dem vorherigen Wert bestimmen ob es einen Schritt gab und in welche Richtung. So kann verhindert werden, dass durch zu schnelle Interrupts, z.B. durch kurzzeitige Störungen Schritte verloren gehen und Fehler entstehen.  </div></td></tr>
<tr><td class='diff-marker'>−</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div>Sofern von Hand nötig, muss das Interruptflag vor dem Auslesen des Ports zurückgesetzt werden, so dass alle Änderungen nach dem Auslesen erfasst werden.  </div></td><td class='diff-marker'>+</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div>Sofern von Hand nötig, muss das Interruptflag vor dem Auslesen des Ports zurückgesetzt werden, so dass alle Änderungen nach dem Auslesen erfasst werden.</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td></tr>
<tr><td class='diff-marker'>−</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div>* Bei der Auswertung nur einer Flanke (also z.B. steigende Flanke von Kanal A) ist die Sache einfach: Es erfolgt ein Schritt, die Richtung zeigt der andere Kanal.  </div></td><td class='diff-marker'>+</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div>* Bei der Auswertung nur einer Flanke (also z.B. steigende Flanke von Kanal A) ist die Sache einfach: Es erfolgt ein Schritt, die Richtung zeigt der andere Kanal<ins class="diffchange diffchange-inline">. Allerdings lässt sich mit nur einer Flanke der oben beschrieben Fehler beim Pendeln um den Übergang nicht vermeiden, weil ein Schritt vor bzw. zurück nicht an der gleichen Stelle erkannt werden</ins>.  </div></td></tr>
<tr><td class='diff-marker'>−</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div>* mit beiden Flanken eines Kanals ist die Sache auch nicht viel komplizierter:  </div></td><td class='diff-marker'>+</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div>* mit beiden Flanken eines Kanals ist die Sache auch nicht viel komplizierter <ins class="diffchange diffchange-inline">und man kann Schrittfehler vermeiden</ins>:  </div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>** A = B --> vorwärts</div></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>** A = B --> vorwärts</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>** A <> B --> rückwärts</div></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>** A <> B --> rückwärts</div></td></tr>
<tr><td class='diff-marker'>−</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div>* Bei den Übergängen des anderen Kanals dreht sich die Richtung um.  </div></td><td class='diff-marker'>+</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div>* Bei den Übergängen des anderen Kanals dreht sich die Richtung um <ins class="diffchange diffchange-inline">und die Auflösung wird verdoppelt</ins>. <ins class="diffchange diffchange-inline"> </ins></div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>   </div></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>   </div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>Die Auswertung der Übergänge kann man natürlich auf viele Arten machen. Je nach Sprache bietet sich  </div></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>Die Auswertung der Übergänge kann man natürlich auf viele Arten machen. Je nach Sprache bietet sich  </div></td></tr>
</table>
Besserwessi
https://rn-wissen.de/wiki/index.php?title=%C3%9Cberlegungen_zur_Drehgeber-Auswertung&diff=22705&oldid=prev
Besserwessi: /* Auswertung der Signale */
2013-06-09T20:39:50Z
<p><span dir="auto"><span class="autocomment">Auswertung der Signale</span></span></p>
<table class='diff diff-contentalign-left'>
<col class='diff-marker' />
<col class='diff-content' />
<col class='diff-marker' />
<col class='diff-content' />
<tr style='vertical-align: top;'>
<td colspan='2' style="background-color: white; color:black; text-align: center;">← Nächstältere Version</td>
<td colspan='2' style="background-color: white; color:black; text-align: center;">Version vom 9. Juni 2013, 20:39 Uhr</td>
</tr><tr><td colspan="2" class="diff-lineno" id="L55" >Zeile 55:</td>
<td colspan="2" class="diff-lineno">Zeile 55:</td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>====Auswertung der Signale====</div></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>====Auswertung der Signale====</div></td></tr>
<tr><td class='diff-marker'>−</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div><del class="diffchange diffchange-inline">* Bei </del>der <del class="diffchange diffchange-inline">INT-Methode mit nur einer Flanke </del>ist die <del class="diffchange diffchange-inline">Sache einfach</del>: <del class="diffchange diffchange-inline">Es erfolgt ein Schritt</del>, <del class="diffchange diffchange-inline">die </del>Richtung <del class="diffchange diffchange-inline">zeigt der andere Kanal</del>.  </div></td><td class='diff-marker'>+</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins class="diffchange diffchange-inline">Auch wenn bei </ins>der <ins class="diffchange diffchange-inline">Benutzung von Interrupts schon eine Information da </ins>ist<ins class="diffchange diffchange-inline">, welcher Kanal sich geändert hat (und ggf. auch in welche Richtung), sollte </ins>die <ins class="diffchange diffchange-inline">Auswertung trotzdem wie beim Polling erfolgen</ins>: <ins class="diffchange diffchange-inline">Die beiden Kanäle einmal Auslesen</ins>, <ins class="diffchange diffchange-inline">und dann zusammen mit dem vorherigen Wert bestimmen ob es einen Schritt gab und in welche </ins>Richtung<ins class="diffchange diffchange-inline">. So kann verhindert werden, dass durch zu schnelle Interrupts, z.B. durch kurzzeitige Störungen Schritte verloren gehen und Fehler entstehen. </ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins class="diffchange diffchange-inline">Sofern von Hand nötig, muss das Interruptflag vor dem Auslesen des Ports zurückgesetzt werden, so dass alle Änderungen nach dem Auslesen erfasst werden</ins>.  </div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td></tr>
<tr><td class='diff-marker'>−</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div>* mit beiden Flanken <del class="diffchange diffchange-inline">muss man beide Kanäle lesen, aber </del>die Sache <del class="diffchange diffchange-inline">ist </del>auch nicht <del class="diffchange diffchange-inline">kompliziert</del>:  </div></td><td class='diff-marker'>+</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins class="diffchange diffchange-inline">* Bei der Auswertung nur einer Flanke (also z.B. steigende Flanke von Kanal A) ist die Sache einfach: Es erfolgt ein Schritt, die Richtung zeigt der andere Kanal. </ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div>* mit beiden Flanken <ins class="diffchange diffchange-inline">eines Kanals ist </ins>die Sache auch nicht <ins class="diffchange diffchange-inline">viel komplizierter</ins>:  </div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>** A = B --> vorwärts</div></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>** A = B --> vorwärts</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>** A <> B --> rückwärts</div></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>** A <> B --> rückwärts</div></td></tr>
<tr><td class='diff-marker'>−</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div><del class="diffchange diffchange-inline">Wenn der µC diese Interrupt-Art zulässt, kann man damit auch Schrittfehler vermeiden</del>.  </div></td><td class='diff-marker'>+</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins class="diffchange diffchange-inline">* Bei den Übergängen des anderen Kanals dreht sich die Richtung um</ins>.  </div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>   </div></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>   </div></td></tr>
<tr><td class='diff-marker'>−</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div><del class="diffchange diffchange-inline">* </del>Auswertung der Übergänge<del class="diffchange diffchange-inline">:Das </del>kann man natürlich auf viele Arten machen. Je nach Sprache bietet sich  </div></td><td class='diff-marker'>+</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins class="diffchange diffchange-inline">Die </ins>Auswertung der Übergänge kann man natürlich auf viele Arten machen. Je nach Sprache bietet sich  </div></td></tr>
<tr><td class='diff-marker'>−</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div><del class="diffchange diffchange-inline">*</del>* "Select/Case" (Bascom) oder "switch/case" (GCC) an.  </div></td><td class='diff-marker'>+</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div>* "Select/Case" (Bascom) oder "switch/case" (GCC) an. Als Beispiel das [[Bascom_Inside-Code#.28Quadratur-.29_ENCODER|Assembler-listing]] für die Bascom-ENCODER()-Funktion<br/></div></td></tr>
<tr><td class='diff-marker'>−</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div>Als Beispiel das [[Bascom_Inside-Code#.28Quadratur-.29_ENCODER|Assembler-listing]] für die Bascom-ENCODER()-Funktion<br/></div></td><td class='diff-marker'>+</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div>* <ins class="diffchange diffchange-inline">IF THEN ELSE oder in C auch die bedingte Berechnung mit dem ? Operator an.</ins></div></td></tr>
<tr><td class='diff-marker'>−</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div>** Eine andere Möglichkeit ist es, die neuen und die vorhergegangenen AB Werte zusammenzufassen und als Index für <del class="diffchange diffchange-inline">einen </del>Werte- oder Sprungtabelle zu verwenden. In einer solche Tabelle muss man allerdings auch die ungültigen AB Kombinationen belegen, damit das funktioniert.</div></td><td class='diff-marker'>+</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div>* Eine andere Möglichkeit ist es, die neuen und die vorhergegangenen AB Werte zusammenzufassen und als Index für <ins class="diffchange diffchange-inline">eine </ins>Werte- oder Sprungtabelle <ins class="diffchange diffchange-inline">mit 16 Werten </ins>zu verwenden. In einer solche Tabelle muss man allerdings auch die ungültigen AB Kombinationen belegen, damit das funktioniert.</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>==Autoren==</div></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>==Autoren==</div></td></tr>
</table>
Besserwessi
https://rn-wissen.de/wiki/index.php?title=%C3%9Cberlegungen_zur_Drehgeber-Auswertung&diff=17772&oldid=prev
Besserwessi: /* INT0/1 oder Polling ? */
2011-07-26T19:17:15Z
<p><span dir="auto"><span class="autocomment">INT0/1 oder Polling ?</span></span></p>
<table class='diff diff-contentalign-left'>
<col class='diff-marker' />
<col class='diff-content' />
<col class='diff-marker' />
<col class='diff-content' />
<tr style='vertical-align: top;'>
<td colspan='2' style="background-color: white; color:black; text-align: center;">← Nächstältere Version</td>
<td colspan='2' style="background-color: white; color:black; text-align: center;">Version vom 26. Juli 2011, 19:17 Uhr</td>
</tr><tr><td colspan="2" class="diff-lineno" id="L45" >Zeile 45:</td>
<td colspan="2" class="diff-lineno">Zeile 45:</td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>===Programmtechnische Umsetzung===</div></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>===Programmtechnische Umsetzung===</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>====INT0/1 oder Polling ?====</div></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>====INT0/1 oder Polling ?====</div></td></tr>
<tr><td class='diff-marker'>−</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div>* Wie schon erwähnt, bei AVR's bieten sich die beiden "external interrrupts" geradezu an. Bei vielen fertigen Boards werden die notwendigen Leitungen schon für einen Anschluss herausgeführt. Bei neuere AVR µCs (z.B. Mega88) bietet sich der Pin-Change Interrupt an, der an allen Ports verfügbar ist. Die Hauptschleife (DO...LOOP) bzw. (while(true)) braucht sich dadurch nicht unbedingt um die Sache zu kümmern.<br/></div></td><td class='diff-marker'>+</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div>* Wie schon erwähnt, bei AVR's bieten sich die beiden "external interrrupts" geradezu an. Bei vielen fertigen Boards werden die notwendigen Leitungen schon für einen Anschluss herausgeführt. Bei neuere AVR µCs (z.B. Mega88) bietet sich der Pin-Change Interrupt an, der an allen Ports verfügbar ist. Die Hauptschleife (DO...LOOP) bzw. (while(true)) braucht sich dadurch nicht unbedingt um die Sache zu kümmern<ins class="diffchange diffchange-inline">. Unpraktisch ist ein externer Interrupt, wenn es durch eine kleine Hysterese zu vielen Störungen kommen kann, wenn eine der Lichtschranken gerade an der Grenze ist. Man hat dann im ungünstigen Fall ein sehr hohe Interruptfrequenz und ggf. auftretende Schrittfehler werden zum Problem</ins>. <br/></div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>Bei Odometrie-Anwendungen gehen die oben erwähnten möglichen Schrittfehler meistens völlig in der Gesamt-Ungenauigkeit unter (schlupfende Räder etc.).<br/></div></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>Bei Odometrie-Anwendungen gehen die oben erwähnten möglichen Schrittfehler meistens völlig in der Gesamt-Ungenauigkeit unter (schlupfende Räder etc.).<br/></div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>Hat man als Drehgeber ein Dateneingaberad ( z.B. für Menüs u. Parametereingaben) erfolgt ohnehin eine Sichtkontrolle der Position, da kommt es schon garnicht darauf an.</div></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>Hat man als Drehgeber ein Dateneingaberad ( z.B. für Menüs u. Parametereingaben) erfolgt ohnehin eine Sichtkontrolle der Position, da kommt es schon garnicht darauf an.</div></td></tr>
</table>
Besserwessi
https://rn-wissen.de/wiki/index.php?title=%C3%9Cberlegungen_zur_Drehgeber-Auswertung&diff=17578&oldid=prev
Besserwessi: /* INT0/1 oder Polling ? */
2011-07-19T19:51:10Z
<p><span dir="auto"><span class="autocomment">INT0/1 oder Polling ?</span></span></p>
<table class='diff diff-contentalign-left'>
<col class='diff-marker' />
<col class='diff-content' />
<col class='diff-marker' />
<col class='diff-content' />
<tr style='vertical-align: top;'>
<td colspan='2' style="background-color: white; color:black; text-align: center;">← Nächstältere Version</td>
<td colspan='2' style="background-color: white; color:black; text-align: center;">Version vom 19. Juli 2011, 19:51 Uhr</td>
</tr><tr><td colspan="2" class="diff-lineno" id="L45" >Zeile 45:</td>
<td colspan="2" class="diff-lineno">Zeile 45:</td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>===Programmtechnische Umsetzung===</div></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>===Programmtechnische Umsetzung===</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>====INT0/1 oder Polling ?====</div></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>====INT0/1 oder Polling ?====</div></td></tr>
<tr><td class='diff-marker'>−</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div>* Wie schon erwähnt, bei AVR's bieten sich die beiden "external interrrupts" geradezu an. Bei vielen fertigen Boards werden die notwendigen Leitungen schon für einen Anschluss herausgeführt. Die Hauptschleife (DO...LOOP) bzw. (while(true)) braucht sich dadurch nicht unbedingt um die Sache zu kümmern.<br/></div></td><td class='diff-marker'>+</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div>* Wie schon erwähnt, bei AVR's bieten sich die beiden "external interrrupts" geradezu an. Bei vielen fertigen Boards werden die notwendigen Leitungen schon für einen Anschluss herausgeführt<ins class="diffchange diffchange-inline">. Bei neuere AVR µCs (z.B. Mega88) bietet sich der Pin-Change Interrupt an, der an allen Ports verfügbar ist</ins>. Die Hauptschleife (DO...LOOP) bzw. (while(true)) braucht sich dadurch nicht unbedingt um die Sache zu kümmern.<br/></div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>Bei Odometrie-Anwendungen gehen die oben erwähnten möglichen Schrittfehler meistens völlig in der Gesamt-Ungenauigkeit unter (schlupfende Räder etc.).<br/></div></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>Bei Odometrie-Anwendungen gehen die oben erwähnten möglichen Schrittfehler meistens völlig in der Gesamt-Ungenauigkeit unter (schlupfende Räder etc.).<br/></div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>Hat man als Drehgeber ein Dateneingaberad ( z.B. für Menüs u. Parametereingaben) erfolgt ohnehin eine Sichtkontrolle der Position, da kommt es schon garnicht darauf an.</div></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>Hat man als Drehgeber ein Dateneingaberad ( z.B. für Menüs u. Parametereingaben) erfolgt ohnehin eine Sichtkontrolle der Position, da kommt es schon garnicht darauf an.</div></td></tr>
<tr><td colspan="2" class="diff-lineno" id="L52" >Zeile 52:</td>
<td colspan="2" class="diff-lineno">Zeile 52:</td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>Das kann man durchaus in der Hauptschleife machen, wenn dann die Abtastfrequenz ausreichend ist, man kann aber auch durch einen TIMER-Interrupt das Polling auslösen (mit dem gleichen Kriterium).  </div></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>Das kann man durchaus in der Hauptschleife machen, wenn dann die Abtastfrequenz ausreichend ist, man kann aber auch durch einen TIMER-Interrupt das Polling auslösen (mit dem gleichen Kriterium).  </div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td></tr>
<tr><td class='diff-marker'>−</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div>* Ganz elegant ist natürlich eine Mischform: wenn man auch die Geschwindigkeit misst, kann man abhängig davon die Methode ändern, denn die genannten Schrittfehler werden bei höherem Tempo kaum auftreten, eher bei Stillstand, genauso, wie auch die Geschwindigkeitsmessung selbst wechseln kann zwischen "schritte in der Zeit" und "Zeit je Schritt".  </div></td><td class='diff-marker'>+</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div>* Ganz elegant ist natürlich eine Mischform: wenn man auch die Geschwindigkeit misst, kann man abhängig davon die Methode ändern, denn die genannten Schrittfehler werden bei höherem Tempo kaum auftreten, eher bei Stillstand, genauso, wie auch die Geschwindigkeitsmessung selbst wechseln kann zwischen "schritte in der Zeit" und "Zeit je Schritt".</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>====Auswertung der Signale====</div></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>====Auswertung der Signale====</div></td></tr>
</table>
Besserwessi
https://rn-wissen.de/wiki/index.php?title=%C3%9Cberlegungen_zur_Drehgeber-Auswertung&diff=17576&oldid=prev
PicNick: /* Drehgeber-Auswertung */
2011-07-19T12:58:30Z
<p><span dir="auto"><span class="autocomment">Drehgeber-Auswertung</span></span></p>
<table class='diff diff-contentalign-left'>
<col class='diff-marker' />
<col class='diff-content' />
<col class='diff-marker' />
<col class='diff-content' />
<tr style='vertical-align: top;'>
<td colspan='2' style="background-color: white; color:black; text-align: center;">← Nächstältere Version</td>
<td colspan='2' style="background-color: white; color:black; text-align: center;">Version vom 19. Juli 2011, 12:58 Uhr</td>
</tr><tr><td colspan="2" class="diff-lineno" id="L1" >Zeile 1:</td>
<td colspan="2" class="diff-lineno">Zeile 1:</td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>=Drehgeber-Auswertung=</div></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>=Drehgeber-Auswertung=</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>Es gibt in RN-Wissen schon einige (sehr gute) Artikel über Drehgeber und Auswertungsvarianten. Denen will ich hier keine Konkurrenz machen.<br/>  </div></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>Es gibt in RN-Wissen schon einige (sehr gute) Artikel über Drehgeber und Auswertungsvarianten. Denen will ich hier keine Konkurrenz machen.<br/>  </div></td></tr>
<tr><td class='diff-marker'>−</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div><del class="diffchange diffchange-inline">Technisches findet man hier:</del></div></td><td class='diff-marker'>+</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div>[[Sensorarten#Incremental-Geber<ins class="diffchange diffchange-inline">|Technisches</ins>]] <ins class="diffchange diffchange-inline">findet man hier, </ins>[[Beispiel_Drehzahlmessung_mit_Drehgeber#Richtung.2C_Geschwindigkeit_und_Position_mit_Doppellichtschranke_ermitteln<ins class="diffchange diffchange-inline">|Grundsätzliches</ins>]] <ins class="diffchange diffchange-inline">über das Quadratur</ins>-<ins class="diffchange diffchange-inline">Signal da, und </ins>[[Drehencoder<ins class="diffchange diffchange-inline">|Programm-Beispiele</ins>]] <ins class="diffchange diffchange-inline">für Drehencoder gibt es auch</ins><br/></div></td></tr>
<tr><td class='diff-marker'>−</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div>[[Sensorarten#Incremental-Geber]]<del class="diffchange diffchange-inline"><br/></del></div></td><td class='diff-marker'>+</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div></div></td></tr>
<tr><td class='diff-marker'>−</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div><del class="diffchange diffchange-inline">und Grundsätzliches über das Quadratur-Signal:<br/></del></div></td><td class='diff-marker'>+</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div></div></td></tr>
<tr><td class='diff-marker'>−</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div>[[Beispiel_Drehzahlmessung_mit_Drehgeber#Richtung.2C_Geschwindigkeit_und_Position_mit_Doppellichtschranke_ermitteln]]<del class="diffchange diffchange-inline"><br/></del></div></td><td class='diff-marker'>+</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div></div></td></tr>
<tr><td class='diff-marker'>−</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div><del class="diffchange diffchange-inline">Programmierungs</del>-<del class="diffchange diffchange-inline">Beispiele für Drehencoder:</del></div></td><td class='diff-marker'>+</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div></div></td></tr>
<tr><td class='diff-marker'>−</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div>[[Drehencoder]]<br/></div></td><td class='diff-marker'>+</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div></div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>Ich möchte dem einige grundsätzliche Überlegungen zur Drehgeber-Auswertung hinzufügen, damit es einem Einsteiger leichter fällt, eine Auswahl für seine konkreten Anforderungen zu treffen.  </div></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>Ich möchte dem einige grundsätzliche Überlegungen zur Drehgeber-Auswertung hinzufügen, damit es einem Einsteiger leichter fällt, eine Auswahl für seine konkreten Anforderungen zu treffen.  </div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td></tr>
<tr><td colspan="2" class="diff-lineno" id="L28" >Zeile 28:</td>
<td colspan="2" class="diff-lineno">Zeile 23:</td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>=== Auswertung der Übergänge===</div></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>=== Auswertung der Übergänge===</div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;">(Genaugenommen der Zustände unmittelbar danach)<br/></ins></div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>Die genaueste Auswertung ist möglich, wenn man alle Übergänge steigend/fallend von beiden Kanälen (A u. B) bewertet. Das kann man ebenfalls mit ISR's machen, wenn man den µC so konfigurieren kann, dass er beide Flankenarten auslöst. Da dafür aber nur ein ISR-Vektor zur Verfügung steht, muss man in der Routine sowohl Kanal A als auch B abfragen und auch, ob fallend oder steigend.<br/></div></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>Die genaueste Auswertung ist möglich, wenn man alle Übergänge steigend/fallend von beiden Kanälen (A u. B) bewertet. Das kann man ebenfalls mit ISR's machen, wenn man den µC so konfigurieren kann, dass er beide Flankenarten auslöst. Da dafür aber nur ein ISR-Vektor zur Verfügung steht, muss man in der Routine sowohl Kanal A als auch B abfragen und auch, ob fallend oder steigend.<br/></div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>Am einfachsten merkt man sich immer den Zustand von A u. B und vergleicht mit dem neuen Abtastergebnis.<br/></div></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>Am einfachsten merkt man sich immer den Zustand von A u. B und vergleicht mit dem neuen Abtastergebnis.<br/></div></td></tr>
<tr><td colspan="2" class="diff-lineno" id="L66" >Zeile 66:</td>
<td colspan="2" class="diff-lineno">Zeile 62:</td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>Wenn der µC diese Interrupt-Art zulässt, kann man damit auch Schrittfehler vermeiden.  </div></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>Wenn der µC diese Interrupt-Art zulässt, kann man damit auch Schrittfehler vermeiden.  </div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>   </div></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>   </div></td></tr>
<tr><td class='diff-marker'>−</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div>* Auswertung der Übergänge:Das kann man natürlich auf viele Arten machen. Je nach Sprache bietet sich "Select/Case" (Bascom) oder "switch/case" (GCC) an.<del class="diffchange diffchange-inline"><br/> </del></div></td><td class='diff-marker'>+</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div>* Auswertung der Übergänge:Das kann man natürlich auf viele Arten machen. Je nach Sprache bietet sich  </div></td></tr>
<tr><td class='diff-marker'>−</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div>Als Beispiel das <del class="diffchange diffchange-inline">Assembler-listing für die Bascom-ENCODER()-Funktion:</del></div></td><td class='diff-marker'>+</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins class="diffchange diffchange-inline">** </ins>"Select/Case" (Bascom) oder "switch/case" (GCC) an.  </div></td></tr>
<tr><td class='diff-marker'>−</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div>[[Bascom_Inside-Code#.28Quadratur-.29_ENCODER]]<br/></div></td><td class='diff-marker'>+</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div>Als Beispiel das [[Bascom_Inside-Code#.28Quadratur-.29_ENCODER<ins class="diffchange diffchange-inline">|Assembler-listing</ins>]] <ins class="diffchange diffchange-inline">für die Bascom-ENCODER()-Funktion</ins><br/></div></td></tr>
<tr><td class='diff-marker'>−</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div>Eine andere Möglichkeit ist es, die neuen und die vorhergegangenen AB Werte zusammenzufassen und als Index für einen Werte- oder Sprungtabelle zu verwenden. In einer solche Tabelle muss man allerdings auch die ungültigen AB Kombinationen belegen, damit das funktioniert.</div></td><td class='diff-marker'>+</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins class="diffchange diffchange-inline">** </ins>Eine andere Möglichkeit ist es, die neuen und die vorhergegangenen AB Werte zusammenzufassen und als Index für einen Werte- oder Sprungtabelle zu verwenden. In einer solche Tabelle muss man allerdings auch die ungültigen AB Kombinationen belegen, damit das funktioniert.</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>==Autoren==</div></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>==Autoren==</div></td></tr>
</table>
PicNick
https://rn-wissen.de/wiki/index.php?title=%C3%9Cberlegungen_zur_Drehgeber-Auswertung&diff=17575&oldid=prev
PicNick: /* Programmtechnische Umsetzung */
2011-07-19T12:48:24Z
<p><span dir="auto"><span class="autocomment">Programmtechnische Umsetzung</span></span></p>
<table class='diff diff-contentalign-left'>
<col class='diff-marker' />
<col class='diff-content' />
<col class='diff-marker' />
<col class='diff-content' />
<tr style='vertical-align: top;'>
<td colspan='2' style="background-color: white; color:black; text-align: center;">← Nächstältere Version</td>
<td colspan='2' style="background-color: white; color:black; text-align: center;">Version vom 19. Juli 2011, 12:48 Uhr</td>
</tr><tr><td colspan="2" class="diff-lineno" id="L48" >Zeile 48:</td>
<td colspan="2" class="diff-lineno">Zeile 48:</td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>* usw</div></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>* usw</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>===Programmtechnische Umsetzung===</div></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>===Programmtechnische Umsetzung===</div></td></tr>
<tr><td class='diff-marker'>−</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div>====<del class="diffchange diffchange-inline">ISR </del>oder Polling ?====</div></td><td class='diff-marker'>+</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div>====<ins class="diffchange diffchange-inline">INT0/1 </ins>oder Polling ?====</div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins class="diffchange diffchange-inline">* Wie schon erwähnt, bei AVR's bieten sich die beiden "external interrrupts" geradezu an. Bei vielen fertigen Boards werden die notwendigen Leitungen schon für einen Anschluss herausgeführt. Die Hauptschleife (DO...LOOP) bzw. (while(true)) braucht sich dadurch nicht unbedingt um die Sache zu kümmern.<br/></ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins class="diffchange diffchange-inline">Bei Odometrie-Anwendungen gehen die oben erwähnten möglichen Schrittfehler meistens völlig in der Gesamt-Ungenauigkeit unter (schlupfende Räder etc.).<br/></ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins class="diffchange diffchange-inline">Hat man als Drehgeber ein Dateneingaberad ( z.B. für Menüs u. Parametereingaben) erfolgt ohnehin eine Sichtkontrolle der Position, da kommt es schon garnicht darauf an.</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div> </div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins class="diffchange diffchange-inline">* Die Sache liegt anders, wenn wirklich kein Tick falsch interpretiert werden soll, also z.B. bei Positionier-Anwendungen. Da ist es wohl besser, die Eingänge zu pollen und alle Übergänge auszuwerten.<br/></ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins class="diffchange diffchange-inline">Das kann man durchaus in der Hauptschleife machen, wenn dann die Abtastfrequenz ausreichend ist, man kann aber auch durch einen TIMER-Interrupt das Polling auslösen (mit dem gleichen Kriterium). </ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div> </div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins class="diffchange diffchange-inline">* Ganz elegant ist natürlich eine Mischform: wenn man auch die Geschwindigkeit misst, kann man abhängig davon die Methode ändern, denn die genannten Schrittfehler werden bei höherem Tempo kaum auftreten, eher bei Stillstand, genauso, wie auch die Geschwindigkeitsmessung selbst wechseln kann zwischen "schritte in der Zeit" und "Zeit je Schritt". </ins></div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>====Auswertung der Signale====</div></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>====Auswertung der Signale====</div></td></tr>
<tr><td class='diff-marker'>−</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div><del class="diffchange diffchange-inline">Das kann man natürlich auf viele Arten machen. Je nach Sprache bietet sich "Select/Case" (Bascom) oder "switch/case" (GCC) an. Ein Hinweis, dem man folgen kann</del>: <del class="diffchange diffchange-inline">Bascom prüft ab, '''ob''' </del>ein Schritt <del class="diffchange diffchange-inline">erfolgt ist</del>, <del class="diffchange diffchange-inline">danach prüft er aber '''nur''' </del>die <del class="diffchange diffchange-inline">Werte für "vorwärts" einzeln ab, alle anderen Möglichkeiten müssen dann ja zwangsläufig "rückwärts" bedeuten.<br/> </del></div></td><td class='diff-marker'>+</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins class="diffchange diffchange-inline">* Bei der INT-Methode mit nur einer Flanke ist die Sache einfach</ins>: <ins class="diffchange diffchange-inline">Es erfolgt </ins>ein Schritt, die <ins class="diffchange diffchange-inline">Richtung zeigt der </ins>andere <ins class="diffchange diffchange-inline">Kanal</ins>.  </div></td></tr>
<tr><td class='diff-marker'>−</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div><del class="diffchange diffchange-inline">Das Assembler-listing für die Bascom-ENCODER()-Funktion:</del></div></td><td class='diff-marker'>+</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div></div></td></tr>
<tr><td class='diff-marker'>−</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div><del class="diffchange diffchange-inline">[[Bascom_Inside-Code#.28Quadratur-.29_ENCODER]]<br/></del></div></td><td class='diff-marker'>+</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div></div></td></tr>
<tr><td class='diff-marker'>−</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div><del class="diffchange diffchange-inline">Eine </del>andere <del class="diffchange diffchange-inline">Möglichkeit ist es, die neuen und die vorhergegangenen AB Werte zusammenzufassen und als Index für einen Werte- oder Sprungtabelle zu verwenden. In einer solche Tabelle muss man allerdings auch die ungültigen AB Kombinationen belegen, damit das funktioniert</del>.  </div></td><td class='diff-marker'>+</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div></div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;">* mit beiden Flanken muss man beide Kanäle lesen, aber die Sache ist auch nicht kompliziert: </ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;">** A = B --> vorwärts</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;">** A <> B --> rückwärts</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;">Wenn der µC diese Interrupt-Art zulässt, kann man damit auch Schrittfehler vermeiden. </ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;"> </ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;">* Auswertung der Übergänge:Das kann man natürlich auf viele Arten machen. Je nach Sprache bietet sich "Select/Case" (Bascom) oder "switch/case" (GCC) an.<br/> </ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;">Als Beispiel das Assembler-listing für die Bascom-ENCODER()-Funktion:</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;">[[Bascom_Inside-Code#.28Quadratur-.29_ENCODER]]<br/></ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;">Eine andere Möglichkeit ist es, die neuen und die vorhergegangenen AB Werte zusammenzufassen und als Index für einen Werte- oder Sprungtabelle zu verwenden. In einer solche Tabelle muss man allerdings auch die ungültigen AB Kombinationen belegen, damit das funktioniert.</ins></div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>==Autoren==</div></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>==Autoren==</div></td></tr>
</table>
PicNick