Forum: Mikrocontroller und Digitale Elektronik Drehgeber an Arduino, external interrupt ISR wird doppelt ausgeführt


von Enrico I. (Gast)


Lesenswert?

Hallo zusammen,

für ein Projekt muss ich mich mit Interrupts beschäftigen und habe daher 
einen Drehgeber an meinen Arduino nano angeschloßen.
Die ISR wird jedoch doppelt ausgeführt.

mein Plan ist es das clk Signal mit einem Interrupt zu erkennen und eine 
flag im programm zu setzen.
wegen den Prellen schalte ich den externen interrupt anschließend aus.
1
void init_INT0()
2
{
3
  EICRA|= 1<<ISC01; //ISC01 -> set int0  
4
  EIMSK|= 1<<INT0;  //enable INT0
5
6
}
7
8
ISR(INT0_vect)
9
{
10
 int0_detected = 1;  //set 
11
 EIMSK=0;            //disable INT0
12
}

Im loop wird anschließend die Richtung bestimmt und es wird vorerst 2 
sekunden gewartet damit das clk Signal auf jeden Fall nicht mehr prellt.
Wegen dem Prellen setze ich am Ende noch das Interrupt Flag register 
zurück um den besagten merfachaufruf zu verhindern und aktiviere den 
externen Interrupt wieder.
1
void loop() 
2
{
3
  if(int0_detected)
4
  {
5
    if(PIND&DIR_mask) Serial.println("<-  left");
6
    else              Serial.println("right ->");
7
8
    delay(2000);  
9
    Serial.println("\n\n\n\n\n\n\n\n\n\n\n");
10
    
11
    int0_detected = 0;
12
    PCIFR |= (1<<PCIF0);  //clear interrupt flag
13
    EIMSK |=  1<<INT0;    //enable INT0
14
    
15
  }
16
}

Das Prooblem bleibt weiterhin bestehen und davon abgesehen stellen sich 
mir weitere Fragen:

1. nach dem Reset von PCIFR sollte doch ein Wiederaufruf bis zum 
nächsten clk        verhindert werden?

2. PCIFR wird laut datenblatt von haus aus mit nullen initialisiert, 
kann aber mit einsen resetet werden. müsste bei Programmstart dann nicht 
automatisch die ISR aufgerufen werden?

vieleicht weiß ja jemand Rat, ich komme jedenfalls nicht weiter

Grüße
Enrico

von EAF (Gast)


Lesenswert?

Nunja...

Ein Drehgeber mit CLK Signal, das ist ja schon mal interessant.....
Zudem ein prellender...

Die Kombination ist doch selten, oder?

von Enrico I. (Gast)


Lesenswert?

ach verdammt, ich meine natürlich einen Drehcodierer

von Wolfgang (Gast)


Lesenswert?

Enrico I. schrieb:
> Im loop wird anschließend die Richtung bestimmt und es wird vorerst 2
> sekunden gewartet damit das clk Signal auf jeden Fall nicht mehr prellt.

Hast du eine ganz grobe Vorstellung davon, wie Prellen und wie 
Drehgebersignale auf der Zeitskala aussehen?
Und was soll das für ein clk Signal sein, von dem du sprichst?

von Enrico I. (Gast)


Lesenswert?

nun ja, es gibt 2 zeitlich versetze signale.
von signal a kann man sich die drehrichtung herleiten und signal b kann 
man zum einlesen verwenden daher habe ich es clk genannt
was wäre den die korrekte bezeichnung?

von EAF (Gast)


Lesenswert?

Enrico I. schrieb:
> was wäre den die korrekte bezeichnung?

Phase A und Phase B

von Wolfgang (Gast)


Lesenswert?

Enrico I. schrieb:
> von signal a kann man sich die drehrichtung herleiten und signal b kann
> man zum einlesen verwenden daher habe ich es clk genannt
> was wäre den die korrekte bezeichnung?

Die Signale werden gewöhnlich A/B-Signale genannt und sind völlig 
gleichberechtigt. Am Dekodereingang kannst du sie einfach vertauschen, 
ohne dass sich an der Funktion irgendetwas grundlegendes ändert.

von MaWin (Gast)


Lesenswert?

Enrico I. schrieb:
> Die ISR wird jedoch doppelt ausgeführt.

Ja nun, wenn man den falschen Ansatz verfolgt, funktioniert's halt 
nicht.

https://dse-faq.elektronik-kompendium.de/dse-faq.htm#F.29
https://www.mikrocontroller.net/articles/Drehgeber

Suche dir für deine Interruptübungen halt eine andere Anwendung, in der 
es zu keinem Prellen kommen kann, nicht zu einem Interupt während der 
vorherige noch bearbeitet wird, dann hagelt es dir nicht auch gleich 
beim Verlassen der Interrupt-Routine den nächsten, gespeicherten rein.

von Georg (Gast)


Lesenswert?

MaWin schrieb:
> Ja nun, wenn man den falschen Ansatz verfolgt, funktioniert's halt
> nicht.

Da erfindet halt wieder mal einer das Rad, allerdings ein viereckiges, 
und dann wundert er sich wenn es holpert. Wahrscheinlich könnte man 
alles löschen, was hier jemals über Quadratursignale geschrieben wurde, 
es würde nichts ändern.

Georg

von Enrico I. (Gast)


Lesenswert?

Georg schrieb:
> Da erfindet halt wieder mal einer das Rad, allerdings ein viereckiges

ehrlich gesagt verstehe ich die aufregung nicht, ich versuche nicht eine 
perfekte auswertung zu erreichen.
Ich arbeite das erste mal mit Interrupts und den dazugehörigen Registern 
und habe Fragen zu dem verhalten gestellt welches bei mir aufgetreten 
ist

ob mein ansatz zur auswertung der signale sinn macht oder nicht ist doch 
wohl nebensächlich

von Enrico I. (Gast)


Lesenswert?

MaWin schrieb:
> Enrico I. schrieb:
>> Die ISR wird jedoch doppelt ausgeführt.
>
> Ja nun, wenn man den falschen Ansatz verfolgt, funktioniert's halt
> nicht.

ob mein ansatz komplett "Falsch" ist kann ich noch nicht beurteilen da 
ich noch zu wenig code verglichen habe.
Auf jeden Fall danke für die Links

von m.n. (Gast)


Lesenswert?

Enrico I. schrieb:
> habe daher
> einen Drehgeber

Ist das ein optischer, magnetischer oder mechanischer Drehgeber?

Enrico I. schrieb:
> ich versuche nicht eine
> perfekte auswertung zu erreichen.

Das hast Du ja schon geschafft ;-)

von Enrico I. (Gast)


Lesenswert?

m.n. schrieb:
> Das hast Du ja schon geschafft ;-)

Eben, das 2 Sekunden delay spricht für sich.

Laut dem Artikel :
https://www.mikrocontroller.net/articles/Drehgeber

Handelt es sich um einen Handbedienten Mechanischen Drehgeber

Beitrag #6808330 wurde von einem Moderator gelöscht.
Beitrag #6808333 wurde von einem Moderator gelöscht.
von Hugo H. (hugo_hu)


Lesenswert?

Georg schrieb:
> Wahrscheinlich könnte man
> alles löschen, was hier jemals über Quadratursignale geschrieben wurde,
> es würde nichts ändern.

Ja - Lesen ist heute nicht mehr "in", man nutzt die 
"Schwarmintelligenz". Ob das auf eigene Defizite hindeutet muss sich 
jeder selbst beantworten.

Beitrag #6808344 wurde von einem Moderator gelöscht.
Beitrag #6808346 wurde von einem Moderator gelöscht.
von Enrico I. (Gast)


Lesenswert?

Hugo H. schrieb:
> Georg schrieb:
>> Wahrscheinlich könnte man
>> alles löschen, was hier jemals über Quadratursignale geschrieben wurde,
>> es würde nichts ändern.
>
> Ja - Lesen ist heute nicht mehr "in", man nutzt die
> "Schwarmintelligenz". Ob das auf eigene Defizite hindeutet muss sich
> jeder selbst beantworten.

typisch forum

man stellt eine frage, kriegt erstmal nur hinweise dass das was man vor 
hat falsch ist und wird hinterher beleidigt weil man das forum scheinbar 
nur dafür nutzen soll um sich mit seinem wissen zu profilieren anstatt 
um hilfe zu bitten wenn man mal nicht weiter weiß.
Das eine konstruktive antwort einen akt der selbstlosigkeit darstellt 
und ich über jeden ansatz froh sein kann ist klar aber das hier ist doch 
lächerlich

ich will doch nur wissen ob ich das datenblatt richtig interpretiere und 
das PCIFR Register einfach zurücksetzen kann um ein erneuten interrupt 
zu verhindern bzw warum das bei mir nicht funktioniert hat...

Beitrag #6808353 wurde von einem Moderator gelöscht.
Beitrag #6808359 wurde von einem Moderator gelöscht.
Beitrag #6808360 wurde von einem Moderator gelöscht.
von Hugo H. (hugo_hu)


Lesenswert?

Enrico I. schrieb:
> Das eine konstruktive antwort einen akt der selbstlosigkeit darstellt
> und ich über jeden ansatz froh sein kann ist klar aber das hier ist doch
> lächerlich

Lächerlich ist, dass Du nicht mal ansatzweise versuchst, Dich selbst zu 
informieren, wie man allgemein damit umgeht. Man kann im großen weiten 
Internet und gezielt hier auf viele Hinweise stoßen, wie es gelöst 
werden kann. Aber man kann auch einfach irgendetwas ausprobieren und 
dann herumfragen, warum es nicht funktioniert.

Enrico I. schrieb:
> ich will doch nur wissen ob ich das datenblatt richtig interpretiere und
> das PCIFR Register einfach zurücksetzen kann um ein erneuten interrupt
> zu verhindern bzw warum das bei mir nicht funktioniert hat...

Auch zum Thema Interrupts gibt es hier informative Artikel, welche man 
sich ansehen und deren Code man nachvollziehen kann um die Grundlagen zu 
erlernen.

Beitrag #6808362 wurde von einem Moderator gelöscht.
von Hugo H. (hugo_hu)


Lesenswert?

Enrico I. schrieb im Beitrag #6808360:
> es hätte auch ein einfacher schalter sein können.

Selbst das Auslesen eines "einfachen Schalters" muss entprellt erfolgen. 
Das ist übrigens ein interessantes Stichwort.

von Enrico I. (Gast)


Lesenswert?

Hugo H. schrieb:
> Enrico I. schrieb im Beitrag #6808360:
>> es hätte auch ein einfacher schalter sein können.
>
> Selbst das Auslesen eines "einfachen Schalters" muss entprellt erfolgen.
> Das ist übrigens ein interessantes Stichwort.


ist ja scheinbar so als ging es hier mitlerweile um die signal 
verarbeitung
also danke

Beitrag #6808375 wurde von einem Moderator gelöscht.
Beitrag #6808380 wurde von einem Moderator gelöscht.
Beitrag #6808388 wurde von einem Moderator gelöscht.
Beitrag #6808392 wurde von einem Moderator gelöscht.
von Gerald K. (geku)


Lesenswert?

Vielleicht ist der Interruptcontroller für fallende und steigende Flanke 
des Signals konfiguriert.

Beitrag #6808404 wurde von einem Moderator gelöscht.
von Hugo H. (hugo_hu)


Lesenswert?

Eine Lösung über Flankenauswertung (nicht zu verwechseln mit 
Flankenerkennung) scheint mir nicht ratsam:

https://www.mikrocontroller.net/articles/Drehgeber

Dort sind die "Fallstricke" hübsch erklärt.

Beitrag #6808407 wurde von einem Moderator gelöscht.
von EAF (Gast)


Lesenswert?

Enrico I. schrieb:
> Georg schrieb:
>> Da erfindet halt wieder mal einer das Rad, allerdings ein viereckiges
>
> ehrlich gesagt verstehe ich die aufregung nicht, ich versuche nicht eine
> perfekte auswertung zu erreichen.
> Ich arbeite das erste mal mit Interrupts und den dazugehörigen Registern
> und habe Fragen zu dem verhalten gestellt welches bei mir aufgetreten
> ist
>
> ob mein ansatz zur auswertung der signale sinn macht oder nicht ist doch
> wohl nebensächlich

Nein, das ist nicht "nebensächlich".
Denn dein Weg ist ein Irrweg.
Und auf diesem Irrweg muss man keinen bestärken, zudem gibts auch keine 
"elegante" oder einfache Lösung.

Wenn es doch unbedingt Interrupts sein müssen, dann werte den Drehgeber 
in einem Timer Interrupt aus. Das ist die angemessene Methode für 
händisch bediente Encoder.

Tipp:
> Wer in die falsche Richtung läuft,
> muss sich nicht beeilen.

Beitrag #6808423 wurde von einem Moderator gelöscht.
von Peter D. (peda)


Lesenswert?

Wer die verrückte Idee mit dem Flankeninterrupt in die Welt gebracht 
hat, wollte die Menschheit nur ärgern. Milliarden von Benutzern kämpfen 
daher täglich mit prellenden Drehgebern.
Hier in der Firma sind alle Kaffeemaschinen, der Generator 33220A und 
das Oszi HMO2024 davon betroffen.
Die von mir entwickelten Geräte haben keine Probleme mit Drehgebern 
(Abtastung im Timerinterrupt). Sie sind seit 1995 im Einsatz.

: Bearbeitet durch User
von Hugo H. (hugo_hu)


Lesenswert?

c-hater schrieb im Beitrag #6808423:
> Such's dir selber! Ist ja nicht auszuhalten, diese völlig unverhüllte
> Faulheit.

Wer wird denn gleich so unwirsch, eure Genialität. Damit auch andere 
erleuchtet werden können, kleine Ausschnitte aus euren "Abhandlungen" 
dazu:

Beitrag "Re: Drehencoder Rastung<->Impulse"
Beitrag "Re: Drehgeber-Auswertung zählt falsch/ungenau"
Beitrag "Re: Rotary Encoder macht komische Sprünge beim ganz langsamen drehen."
Beitrag "Re: Optischen Drehencoder auswerten"
Beitrag "Re: Frage zur Dekodierung von Drehencodern"
Beitrag "Re: Auswertung Drehencoder?"

Das hätte ich allerdings nicht erwartet :-) :

Beitrag "Re: Entprellen (kein AVR)"

von Frank (Gast)


Lesenswert?

c-hater schrieb im Beitrag #6808330:
> das geht auch mit Interrupts, aber nur unter bestimmten Voraussetzungen.
> Nämlich: Es müssen für die beiden Kanäle VERSCHIEDENE Interrupts
> verwendet werden.
> Und natürlich müssen die ISRs für die beiden verwendeten Interrupts
> richtig implementiert sein, klar...

Klar. Man kann sich natürlich von hinten durch die Brust ins Auge 
schießen. Aber ob man es auch sollte?

von Gerald K. (geku)


Lesenswert?

Peter D. schrieb:
> Wer die verrückte Idee mit dem Flankeninterrupt in die Welt gebracht
> hat, wollte die Menschheit nur ärgern

Filter und Entprellschaltungen sind schon erfunden und lassen eine 
zuverlässige Auswertung zu. Wer Kontakte, ohne Beschaltung, an MC 
Eingänge anschaltet, ist selber Schuld.

Beitrag #6809760 wurde von einem Moderator gelöscht.
Beitrag #6809763 wurde von einem Moderator gelöscht.
von MaWin (Gast)


Lesenswert?

Gerald K. schrieb:
> Wer Kontakte, ohne Beschaltung, an MC Eingänge anschaltet, ist selber
> Schuld.

Im Gegenteil: Er ist kostenbewusst und verlagert Hardware in Software. 
Dafür muss man Softwareerstellung aber auch beherrschen und nicht 
falschen Grundprinzipien dogmatisch verhaftet bleiben.

Beitrag #6809775 wurde von einem Moderator gelöscht.
Beitrag #6809779 wurde von einem Moderator gelöscht.
Beitrag #6809785 wurde von einem Moderator gelöscht.
von Wolfgang (Gast)


Lesenswert?

Gerald K. schrieb:
> Filter und Entprellschaltungen sind schon erfunden und lassen eine
> zuverlässige Auswertung zu.

Die Auswertung von Gray-Code BRAUCHT keine Entprellung. Aber das scheint 
bei vielen noch nicht angekommen zu sein, obwohl diese Art der Kodierung 
inzwischen fast 70 Jahre alt wird.

von MaWin (Gast)


Lesenswert?

Wolfgang schrieb:
> Die Auswertung von Gray-Code BRAUCHT keine Entprellung. Aber das scheint
> bei vielen noch nicht angekommen zu sein, obwohl diese Art der Kodierung
> inzwischen fast 70 Jahre alt wird.

Wer halt die korrekte Methode nicht verstanden hat und auf Grund 
ideologischer Blockiertheit auch nicht verstehen will, der bleibt auf 
ewig doof.

von Georg (Gast)


Lesenswert?

MaWin schrieb:
> Wer halt die korrekte Methode nicht verstanden hat

Gottseidank ist das Verständnis von Graycode für den Fortbestand der 
Menschheit nicht so entscheidend wie manches andere, sonst sähe es 
zappenduster aus. Also entspannt euch, ob der TO sein Problem jemals 
begreift ist ziemlich irrelevant.

Georg

von Wolfgang (Gast)


Lesenswert?

Georg schrieb:
> Gottseidank ist das Verständnis von Graycode für den Fortbestand der
> Menschheit nicht so entscheidend ...

Stimmt, ein Großteil der Menschheit kauft einfach die Geräte, in denen 
er verwendet wird und der Rest wird von einigen mehr oder weniger 
fähigen Ingenieuren erledigt.

Beitrag #6809902 wurde von einem Moderator gelöscht.
Beitrag #6809924 wurde von einem Moderator gelöscht.
Beitrag #6809940 wurde von einem Moderator gelöscht.
Beitrag #6809945 wurde von einem Moderator gelöscht.
Beitrag #6809950 wurde von einem Moderator gelöscht.
Beitrag #6809966 wurde von einem Moderator gelöscht.
von c-hater (Gast)


Lesenswert?

Frank schrieb:

> Klar. Man kann sich natürlich von hinten durch die Brust ins Auge
> schießen. Aber ob man es auch sollte?

Aber klar, unter den entsprechenden Umständen:

Eindeutige Pro-Indikationen für eine interrupbasierte Lösung sind:

1) Es müssen schnelle Encoder abgefragt werden, ohne dabei dauerhaft 
eine hohe Grundlast an Rechenzeit zu erzeugen.

2) Es handelt sich um ein Design, bei dem der minimale Energieverbrauch 
eine Rolle spielt.

Eindeutige Contra-Indikationen sind:

1) Es müssen viele (langsame) Encoder abgefragt werden.

von MaWin (Gast)


Lesenswert?

c-hater schrieb im Beitrag #6809966:
> Man kann sie nämlich auch situationsabhängig DEAKTVIEREN

Das nützt nichts, wenn man nicht noch einen Timer zusätzlich benutzt.

Denn ohne Timer kann nur ein Interrupt sich selbst sperren und auf den 
jeweils anderen warten, einer muss immer aktiv sein, also auf von sussen 
eintreffende events reagieren können. Auch damit besteht also die 
Möglichkeit, dass der uC zu nichts anderem kommt, als der Abarbeitung 
der nicht entprellten Interrupts, und stillsteht.

Und wenn man einen Timer verwendet, nun,  dann kann man den ganzen 
Scheiss mit den Flankeninterrupts gleich ganz lassen, denn ein Timer 
reicht zur Auswertung eines Drehgebers schon alleine ganz aus.

Das verstehst DU jedoch erkennbar überhaupt nicht.

von MaWin (Gast)


Lesenswert?

c-hater schrieb:
> Eindeutige Pro-Indikationen für eine interrupbasierte Lösung sind:
>
> Es müssen schnelle Encoder abgefragt werden, ohne dabei dauerhaft eine
> hohe Grundlast an Rechenzeit zu erzeugen.
>
> Es handelt sich um ein Design, bei dem der minimale Energieverbrauch
> eine Rolle spielt.

Es gibt kein 'pro' für flankenbasierte Interrupt aus nicht entprellten 
Quellen.

Es macht auch keinen Sinn, irgendwelche CPU Last einzusparen, denn wenn 
jemand dreht, und das kann ja wohl zu jedem beliebigen Zeitpunkt 
erfolgen, muss der uC die ganze Rechenleistung übrig haben, sonst 
verpasst er die Drehgeberauswertung.

Zur Energieeinsparung reicht ein Interrupt auf Flankenwechsel beider 
Kanäle, der dann nur die stinknormale timerbasierte Graykanalauswertung 
anschmeisst bzw. wieder stoppt. Dank Graykanalauswertung muss man dabei 
nicht mal beachten, ob ein Prellen auftritt, ob also der dann 
eingelesene Portpinzustand mit der Flanke die den Interrupt auslöste 
übereinstimmt, sie zählt automatisch richtig.

von c-hater (Gast)


Lesenswert?

MaWin schrieb:

> c-hater schrieb im Beitrag #6809966:
>> Man kann sie nämlich auch situationsabhängig DEAKTVIEREN
>
> Das nützt nichts, wenn man nicht noch einen Timer zusätzlich benutzt.

Doch, genau das braucht man eben bei einem Quadratur-Encoder nicht zu 
tun. Die Sperrung erledigt "timeless" die ISR des eigenen Kanals, die 
Freigabe erfolgt genauso "timeless" einzig über die ISR des anderen 
Kanals. Das ist der ganze Trick. Und dass der funktioniert, liegt halt 
an der grundsätzlichen Funktionsweise so eines Encoders.

Absolut trivial, aber Leute wie du kapieren das nach zwei Jahrzehnten, 
entsprechendem Beispielcode und hinreichend Erklärungen dazu immer noch 
nicht...

von Wolfgang (Gast)


Lesenswert?

c-hater schrieb:
> Eindeutige Pro-Indikationen für eine interrupbasierte Lösung sind:
>
> 1) Es müssen schnelle Encoder abgefragt werden, ohne dabei dauerhaft
> eine hohe Grundlast an Rechenzeit zu erzeugen.

Quatsch. Wenn schnelle Encoder per Software abgefragt werden müssen, 
muss die Rechenleistung dafür vorhanden sein. Oder willst du bei schnell 
drehenden Encoder alle anderen Aufgaben so lange zurück stellen, bis die 
Mimik wieder langsam dreht?

von c-hater (Gast)


Lesenswert?

Wolfgang schrieb:

> Quatsch. Wenn schnelle Encoder per Software abgefragt werden müssen,
> muss die Rechenleistung dafür vorhanden sein.

Das ist völlig unbezweifelbar richtig.

Der Punkt ist hier vor allem: auch wenn sie vorhanden ist (vorhanden 
sein muss), ist es extrem SCHWACHSINNIG, sie dauerhaft abzurufen, auch 
wenn es in 99% oder mehr der Zeit des Betriebs der Anwendung überhaupt 
nicht nötig wäre. Das führt uns im Minimum wieder ein Stück in Richtung 
des Entropietods des Unversums. Bei Betrieb aus irgendwas anderem als 
dem Stromnetz führt es aber auch unter einem enger gefassten 
Betrachtungswinkel dazu, dass die Sache MERKLICH mehr Kosten und 
Aufwand verursacht, als nötig wäre. Weil halt Primärzellen dann häufiger 
neu gekauft werden müssen und Akkus häufiger geladen werden müssen.

> Oder willst du bei schnell
> drehenden Encoder alle anderen Aufgaben so lange zurück stellen, bis die
> Mimik wieder langsam dreht?

Das könnte eventuell sogar tatsächlich eine Notlösung für Grenzfälle 
sein. Hängt von der Anwendung ab. Strebt man aber natürlich 
normalerweise nicht an. Der normalerweise interessante Arbeitsbereich 
ist alles darunter. In diesem Bereich wird der Rest nur 
seltener/langsamer verarbeitet (worst case berechenbar). Aber dieser 
worst case tritt nur dann ein, wenn der Encoder wirklich volle 
Schrittrate liefert. Von allem darunter profitiert der Rest unmittelbar, 
so er denn Rechenzeit braucht. Er kann dann einfach mehr davon 
verwenden.

Ich verstehe überhaupt nicht, wo dein Problem ist. Genau dieser Ansatz, 
immer nur das an Rechenzeit zu verbrauchen, was man auch wirklich 
benötigt, ist ja z.B. das Grundkonzept aller modernen Betriebssysteme. 
Wer das für sinnlos hält, ist definitiv allein deswegen mit einiger 
Wahrscheinlichkeit ein VOLLIDIOT, weil alle, die was von der Sache 
verstehen, halt dieses Konzept gewählt haben...

von Peter D. (peda)


Lesenswert?

c-hater schrieb:
> Der Punkt ist hier vor allem: auch wenn sie vorhanden ist (vorhanden
> sein muss), ist es extrem SCHWACHSINNIG, sie dauerhaft abzurufen

Bei MCs hängt der Stromverbracuh nicht von der Rechenleistung ab. Dem MC 
macht es also überhaupt nichts aus, wenn er permanent rechnet oder nur 
ne Endlosschleife dreht.
Ich hab z.B. mit einem AT89C51CC03 2 Positionsgeber (X,Y) im 
Timerinterrupt 50kHz abgefragt. Es gingen keine Schritte verloren und 
der MC wurde auch nicht heiß. Die anderen Tasks (CAN-Kommunikation usw.) 
liefen auch einwandfrei.

von Stefan F. (Gast)


Lesenswert?

Peter D. schrieb:
> Bei MCs hängt der Stromverbracuh nicht von der Rechenleistung ab.

Ich finde diese Sichtweise ziemlich eingeschränkt.

Die STM32 nehmen zum Beispiel alle deutlich weniger Strom im WFI (Wait 
for Interrupt) Zustand auf, als wenn sie Befehle ausführen.

von Peter D. (peda)


Lesenswert?

Stefan ⛄ F. schrieb:
> Die STM32 nehmen zum Beispiel alle deutlich weniger Strom im WFI (Wait
> for Interrupt) Zustand auf, als wenn sie Befehle ausführen.

Dürfte dem Idle beim AVR entsprechen, da sinkt der Strom natürlich 
etwas. Ich benutze bei netzbetriebenen Schaltungen in der Regel aber 
keine Stromsparmodi. Ob der MC nun 5mA oder 2mA zieht, fällt gegenüber 
den anderen Lasten kaum ins Gewicht. Selbst der Spannnungsregler 7805 
verbraucht ja schon 5mA. Am 230V Eingang wird man den Unterschied daher 
nicht mehr messen können.
Stromsparmodi zu implementieren und zu testen, kostet weitere 
Entwicklungszeit, die der Kunde nicht bezahlen will.

von MaWin (Gast)


Lesenswert?

Stefan ⛄ F. schrieb:
> Die STM32 nehmen zum Beispiel alle deutlich weniger Strom im WFI (Wait
> for Interrupt) Zustand auf, als wenn sie Befehle ausführen.

Spielt nur im Batteriebetrieb eine Rolle. Bei Netzversorgung geht der 
Unterschied in der Stromaufnahme im Rauschen unter.

Bei Batteriebetrieb braucht man aber meistens ein Display, möglichst LCD 
Glas  und schon hast du wieder einen 2ms Takt. Also nix gespart.

c-hater versucht jeden Strohhalm um seine desolate Lösung irgendwie 
aufrechtzuerhalten, aber es ist alles vergeblich. Selbst wenn man die 
Drehgeberauswertung erst startet wenn ein PinChange vom Drehgeber oder 
Tastatur kommt (und dann zeitig wieder schlafen legt), wertet man sie 
doch klüger per state machine im Timertick aus. Dann stimmt wenigstens 
das Ergebnis.

Auch dass eine interrupt-gesteuerte Version schneller sein soll, wurde 
schon längst widerlegt, 1 Mio Striche/Sekunde an 4 Drehgebern 
gleichzeitig sind an einem 16 MHz AVR möglich per polling, no chance das 
per Interrupt zu schaffen, da ist schon der Interrupt-overhead höher.

von m.n. (Gast)


Lesenswert?

MaWin schrieb:
> Auch dass eine interrupt-gesteuerte Version schneller sein soll, wurde
> schon längst widerlegt, 1 Mio Striche/Sekunde an 4 Drehgebern
> gleichzeitig sind an einem 16 MHz AVR möglich per polling, no chance das
> per Interrupt zu schaffen, da ist schon der Interrupt-overhead höher.

Jetzt kommt dieser Blödsinn wieder! Aber manche begreifen es eben nie 
;-)

von W.S. (Gast)


Lesenswert?

Enrico I. schrieb:
> typisch forum
>
> man stellt eine frage, kriegt erstmal nur hinweise dass das was man vor
> hat falsch ist und wird hinterher beleidigt weil man das forum scheinbar
> nur dafür nutzen soll um sich mit seinem wissen zu profilieren anstatt
> um hilfe zu bitten wenn man mal nicht weiter weiß.

Ähem...
Also zum einen: Du stellst dich hier ausgesprochen 'wittfleudig' an und 
zu anderen verrätst du mit keinem Wort, was du da treibst. Und dann 
wirst du obendrein auch noch ungehalten, wenn die anderen auf deine 
Einlassungen irgendwann mal genervt reagieren.

Also: So ein typischer Drehgeber für die Frontplatte eines Radios o.ä. 
hat 3 Dinge: 2 Kontakte, die man durch Drehen am Stiel öffnen und 
schließen kann und obendrein auch noch eine Rastung, die ist nur etwas 
Mechanisches.

Die beiden Kontakte öffnen und schließen versetzt ( idealerweise um die 
Hälfte versetzt, das kann aber konstruktiv und/oder verschleißbedingt 
anders sein ) und damit erhält man bei jedem Zustandswechsel des einen 
Signals durch Betrachten des anderen Signals die Richtungsinformation. 
Rein elektrisch ist es schnurz, welches Signal man für den o.g. 
Zustandswechsel benutzt. Aber diese Rechnung ist ohne die mechanische 
Rastung gemacht. In der Realität tut man besser, sich das Signal als 
Zustandswechsel-Signal auszusuchen, was möglichst fern der Rastung 
seinen Zustand wechselt.

Wenn du nun Signale hast, die bereits prellfrei sind, dann ist die 
Auswertung kein Problem: das 'Zustandaswechsel'-Signal triggert mit 
jeder Flanke einen Interrupt und dieser liest beide Signale und 
verknüpft sie per XOR. Das Ergebnis ist die Richtungsinformation. Das 
Auslesen beider Signale möglichst zeitnah an der triggernden Flanke ist 
esseziell, denn je länger man wartet, desto wahrscheinlicher ist es, daß 
das andere (nacheilende) Signal bereits beim Umschalten ist.

So. Was dir bleibt, ist die Arbeit, deine beiden Signale ausreichend 
prellfrei zu kriegen und die Arbeit, dir einen Interrupt zu 
programmieren, der auf beide Flanken gleichermaßen reagiert.

Und jetzt mache es und jammere nicht.

W.S.

von c-hater (Gast)


Lesenswert?

Peter D. schrieb:

> Bei MCs hängt der Stromverbracuh nicht von der Rechenleistung ab.

Natürlich tut er das. Man muß die nur richtig programmieren. Also: 
pennen schicken, wann immer es nicht wirklich etwas zu tun gibt.

von c-hater (Gast)


Lesenswert?

MaWin schrieb:

> Spielt nur im Batteriebetrieb eine Rolle. Bei Netzversorgung geht der
> Unterschied in der Stromaufnahme im Rauschen unter.

Ja klar, solche fähigen Programmierer wie du kommen natürlich zu solchen 
Ergebnissen. Aber betrachte das mal bei Anwendungen, die konsequent 
nicht pollen und die MCU immer schlafen legen, wann immer es möglich 
ist. Dann sieht das gleich GANZ anders aus. Für 99.999999% aller 
existierenden µC Anwendungen. Naja, es könnte zumindest so aussehen, 
wenn sie halt nicht von Programmierern stammen würden, wie du es einer 
bist...

> Bei Batteriebetrieb braucht man aber meistens ein Display, möglichst LCD
> Glas  und schon hast du wieder einen 2ms Takt. Also nix gespart.

Häh? 2ms? Und in diesem Intervall müssen ein paar Ports togglen? Das 
kann man typisch in n µs (u.U. sogar ns) tun. Und dann den µC 2000-n µs 
(wenn sonst nix anliegt) pennen schicken. Typisch also >>99% der Zeit. 
Also ich jedenfalls kann das tun (und mache es in etlichen Anwendungen 
genau so), du nicht?

> c-hater versucht jeden Strohhalm um seine desolate Lösung irgendwie
> aufrechtzuerhalten

Das ist deine, ganz offensichtlich heftig beschränkte, Sicht der Dinge.

Du musstest nun schon zugeben, dass es (also interruptbasierte Abfrage 
von Quadraturencodern) prinzipiell funktioniert. Hast du nur nicht offen 
und ehrlich zugegeben, dazu fehlen dir wohl die cojones.

Aber indirekt hast du es DOCH getan, indem du nämlich jetzt anfängst, 
die daraus erwachsenden Vorteile nieder zu diskutieren. Wenn du 
weiterhin der Meinung währst, das es grundsätzlich nicht geht und nicht 
gehen kann, wäre das doch völlig überflüssig, das sagen die Gesetze der 
Logik...

von Teo (Gast)


Lesenswert?

W.S. schrieb:
> Also: So ein typischer Drehgeber für die Frontplatte eines Radios o.ä.
> hat 3 Dinge: 2 Kontakte, die man durch Drehen am Stiel öffnen und
> schließen kann und obendrein auch noch eine Rastung, die ist nur etwas
> Mechanisches.

Die prellen und kratzen....
Wie der Zufall es will, trotz allem Unken "Das brauchts dank Gray nicht" 
spuckt mir der Drehencoder meines Korad LNTs, einige Dutzend gültige 
Sequenzen raus, so das die Spannung nicht wie gewollt um 0,1V steigt, 
sondern gleich mal um einige Volt nach oben springt....

Meine billigen Restposten ALPS, tun auch erst zuverlässig ab ~1mA. Also 
nix für Batterie und Interrupt.
Mein unprofessionelles Fazit, als Anwender und Hobbybastler: Ich mach 
nich mehr ohne 1mA und SW-Entprellung.
Da taugt der Interrupt höchstens noch zum aufwecken aber was will man 
bei 1-2mA "Grundlast" schon noch aufwecken. Wie viel Strom zum Schalten, 
gönnt Ihr den eurem Drehgebern?! :)
Ach so ja, die putzen sich ja alleinig schon durchs Schleifen der 
Kontakte. Das müssen also alles SW Fehler sein.....

von Frank (Gast)


Lesenswert?

c-hater schrieb:
> Wenn du weiterhin der Meinung währst, das es grundsätzlich nicht geht
> und nicht gehen kann, wäre das doch völlig überflüssig, das sagen die
> Gesetze der Logik...

Niemand hat gesagt das es nicht geht. Nur das es nicht sinnvoll ist.

von Hugo H. (hugo_hu)


Lesenswert?

c-hater schrieb:
> Du musstest nun schon zugeben, dass es (also interruptbasierte Abfrage
> von Quadraturencodern) prinzipiell funktioniert. Hast du nur nicht offen
> und ehrlich zugegeben, dazu fehlen dir wohl die cojones.

Hast Du zufällig mal etwas für ELV entwickelt? FHT80b oder PPS 5330?

von MaWin (Gast)


Lesenswert?

c-hater schrieb:
> Du musstest nun schon zugeben, dass es (also interruptbasierte Abfrage
> von Quadraturencodern) prinzipiell funktioniert

Falsch.

c-hater schrieb:
> Aber indirekt hast du es DOCH getan, indem du nämlich jetzt anfängst,
> die daraus erwachsenden Vorteile nieder zu diskutieren

Falsch.

c-hater schrieb:
> Wenn du weiterhin der Meinung währst, das es grundsätzlich nicht geht
> und nicht gehen kann, wäre das doch völlig überflüssig, das sagen die
> Gesetze der Logik...

Falsch.

Deine interruptbasierte Variante hat mehrere Defizite und zählt dann 
falsch.

Was bei einem sauberen nicht prellenden Drehencoder im Test auf dem 
Schreibtisch noch funktioniert, wird dann in der Praxis nach Jahren der 
Benutzung mit schlechter werdenden Kontakten zu den Kunden störenden 
Fehlfunktionen neigen.

Es sei allerdings nicht verschwiegen, dass auch die richtige Methode der 
pollenden Drehgeberauswertung ihre Probleme hat, wenn Kontakte nicht nur 
mehr an Übergängen prellen, sondern die ganze Zeit beim rutschen über 
die Kontaktfläche (und Staub bzw. Oxidstellen) zu kurzen Aussetzern 
neigen. Da ist ein Kondensator am Kontakt, der über den pull up 
aufgeladen wird, notwendig. Software alleine hilft da nicht mehr. Die 
korrekte Art der Drehgeberauswertung weist aber immerhin auf das Problem 
hin  in dem die state machine einen ungultigen Zustandswechsel erkennt.

von MaWin (Gast)


Lesenswert?

c-hater schrieb:
> Du musstest nun schon zugeben, dass es (also interruptbasierte Abfrage
> von Quadraturencodern) prinzipiell funktioniert

Falsch.

c-hater schrieb:
> Aber indirekt hast du es DOCH getan, indem du nämlich jetzt anfängst,
> die daraus erwachsenden Vorteile nieder zu diskutieren

Falsch.

c-hater schrieb:
> Wenn du weiterhin der Meinung währst, das es grundsätzlich nicht geht
> und nicht gehen kann, wäre das doch völlig überflüssig, das sagen die
> Gesetze der Logik...

Falsch.

Deine interruptbasierte Variante hat mehrere Defizite und zählt dann 
falsch.

Was bei einem sauberen nicht prellenden Drehencoder im Test auf dem 
Schreibtisch noch funktioniert, wird dann in der Praxis nach Jahren der 
Benutzung mit schlechter werdenden Kontakten zu den Kunden störenden 
Fehlfunktionen neigen.

Es gibt keine Vorteile in deiner Methode. Sie wertet im Gegensatz zu 
deiner Behauptung langsamer aus, sie lässt sich leichter stören und 
zählt dann falsch, sie bremst den uC stärker aus wenn pinChanges durch 
Prellen viel öfter vorkommen als reale Zustandswechsel und kostet 
dadurch auch noch mehr Strom als ein timerinterruptbasiertes pollen. Und 
der einzige Vorteil, sie lässt den uC schlafen wenn keiner am Knopf 
dreht, funktioniert genau so mit der polling Methode wenn man sie bei 
pinChange startet.

Es sei allerdings nicht verschwiegen, dass auch die richtige Methode der 
pollenden Drehgeberauswertung ihre Probleme hat, wenn Kontakte nicht nur 
mehr an Übergängen prellen, sondern die ganze Zeit beim rutschen über 
die Kontaktfläche (und Staub bzw. Oxidstellen) zu kurzen Aussetzern 
neigen. Da ist ein Kondensator am Kontakt, der über den pull up 
aufgeladen wird, notwendig. Software alleine hilft da nicht mehr. Die 
korrekte Art der Drehgeberauswertung weist aber immerhin auf das Problem 
hin in dem die state machine einen ungultigen Zustandswechsel erkennt.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

MaWin schrieb:
> Es gibt keine Vorteile in deiner Methode. Sie wertet im Gegensatz zu
> deiner Behauptung langsamer aus, sie lässt sich leichter stören und
> zählt dann falsch, sie bremst den uC stärker aus wenn pinChanges durch
> Prellen viel öfter vorkommen als reale Zustandswechsel und kostet
> dadurch auch noch mehr Strom als ein timerinterruptbasiertes pollen.

c-hater hat leider in keinem einzigen Beitrag "sein Verfahren" 
zusammenhängend dargestellt, sondern immer nur Brotkrümel hingeworfen. 
Um ihn zu verstehen, musste ich mir das Verständnis aus mehreren seiner 
Beiträge erst zusammenklauben.

Wenn ich ihn richtig verstehe, meint er folgendes:
1
1. PCINT Enable auf Pin A
2
2. Wenn INT auf Pin A, dann:
3
3. PCINT Disable auf Pin A
4
4. Hole Zustand von Pin B
5
5. PCINT Enable auf Pin B
6
6. Wenn INT auf Pin B, dann:
7
7. PCINT Disable auf Pin B
8
8. Hole Zustand von Pin A
9
9. Weiter bei 1.

Dadurch, dass er zwei Interrupts abwechselnd benutzt (Pin/Kanal A und 
B) und immer dann, wenn ein Interrupt erfolgt, diesen anschließend 
sofort sperrt, lässt den µC ein Prellen kalt: Es erfolgt ja kein 
Interrupt mehr auf demselben Pin, nur im folgenden auf dem anderen.

Von daher ist die Kritik im Artikel Drehgeber bezüglich 
Interrupt-Lösungen für c-haters Verfahren nicht zutreffend. Ein 
"Pendeln" sollte hier kein Problem darstellen. Ebenso halbiert sich 
nicht die Auflösung, da A und B vollkommen symmetrisch ausgewertet 
werden.

Es kann auch sein, dass ich ihn komplett falsch verstanden habe. Leider 
hat er sein Verfahren selbst überhaupt nicht im Zusammenhang erklärt. 
Ich selbst habe auch mit Drehencodern noch nicht rumgespielt, habe daher 
keine Erfahrung damit.

: Bearbeitet durch Moderator
von Thomas (Gast)


Lesenswert?

Hallo  Enrico I.

ich habe gerade mal den ganzen Verlauf schnell mal überflogen.
Also nicht alles gelesen...
Ich benutze auch einen solchen Encoder für meine CNC.

Bei mir funtkioniert es sauber.

Meine Frage ist, wie hast du deinen Interrupt eingestellt??

Steigende Flanke, fallende Flanke     oder wie ich vermute
Beide Flanken ???

Deshalb der doppelte Auslöser...

Gruß Thomas

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Thomas schrieb:
> ich habe gerade mal den ganzen Verlauf schnell mal überflogen.

Merkt man.

> Deshalb der doppelte Auslöser...

Das Thema "Prellen" hast Du hier leider komplett ignoriert.

von Teo (Gast)


Lesenswert?

Frank M. schrieb:
> Dadurch, dass er zwei Interrupts abwechselnd benutzt (Pin/Kanal A und
> B) und immer dann, wenn ein Interrupt erfolgt, diesen anschließend
> sofort sperrt, lässt den µC ein Prellen kalt: Es erfolgt ja kein
> Interrupt mehr auf demselben Pin, nur im folgenden auf dem anderen.

Ja schon aber so zählt er trotzdem ins Nirwana, wenn die Kontakte 
kratzen.
Da jetzt noch SW zum Endprellen/Fehlererkennung dran dröseln lohnt doch 
nich, da polle ich doch lieber gleich.
Wie MaWin schon erwähnte, selbst meine hingefrickelte SW-Entprellung, 
dämpft das Problem nur, beseitigt es aber nicht. Das nur per SW zu 
machen wird sicher nich ohne, da löt ich mir dann doch lieber noch ein 
paar Bauteile extra dran. :)
Also, nich das ich das für meine Privaten Projekt, für nötig erachte!

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Teo schrieb:
> Ja schon aber so zählt er trotzdem ins Nirwana, wenn die Kontakte
> kratzen.

Kannst Du das bitte näher erläutern? Wenn ein Kontakt "kratzt" passiert 
doch exakt gar nichts, da der Interrupt bereits nach der ersten Flanke 
deaktiviert worden ist?

: Bearbeitet durch Moderator
von MaWin (Gast)


Lesenswert?

Frank M. schrieb:
> Wenn ich ihn richtig verstehe, meint er folgendes:
> 1. PCINT Enable auf Pin A
> 2. Wenn INT auf Pin A, dann:
> 3. PCINT Disable auf Pin A
> 4. Hole Zustand von Pin B
> 5. PCINT Enable auf Pin B
> 6. Wenn INT auf Pin B, dann:
> 7. PCINT Disable auf Pin B
> 8. Hole Zustand von Pin A
> 9. Weiter bei 1.

Nun dreht man vorwärts und dann rückwärts:
1
R: vorwärts | rückwarts
2
A: 001111000|000111100
3
B: 111100000|000001111
4
zahlt er
5
D: 00+0+0+00|00000-0-0
also in der Summe +3 -2 um 1 falsch.

[Mod: Formatierung angepasst für Ansicht mit Proportionalschrift]

: Bearbeitet durch Moderator
von Teo D. (teoderix)


Lesenswert?

Frank M. schrieb:
> Kannst Du das bitte näher erläutern? Wenn ein Kontakt "kratzt" passiert
> doch exakt gar nichts, da der Interrupt bereits nach der ersten Flanke
> deaktiviert worden ist?

Und wann wird der andere aktiviert?!
Prellen und Kratzen treten immer auf beiden Kanälen gleichzeitig auf! 
Das is dann wie Lotto spielen. Nur mit Interrupt(s) zählst du da jeden 
Treffer, beim pollen nur jeden x-ten.
Bei mir geht das sofort ins die Tonne (wird verworfen), wenn da ein 
anderes Muster als erwartet auftaucht. Funst scheinbar ganz gut. ;)

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

MaWin schrieb:
> also in der Summe +3 -2 um 1 falsch.

Ja, das kann ich nachvollziehen. Dann muss das c-hater mal erklären, wie 
das funktionieren kann.

Teo D. schrieb:
> Prellen und Kratzen treten immer auf beiden Kanälen gleichzeitig auf!

Okay, ich dachte, dass bei Drehgebern immer nur ein Kanal prellen kann, 
nämlich der, wo gerade ein gewollter Pegelwechsel auftritt. Das war wohl 
ein Fehlschluss. "Kratzen" an sich hatte ich ausgeschlossen, da ich mal 
irgendwo gelesen hatte, dass hier jeweils 2 Kontakspuren verwendet 
werden, also eine Art "Doppelfinger" pro Schleifer. Kann auch sein, dass 
ich mich hier irre.

Nicht, dass man mich falsch versteht: Ich selbst bin bei mechanischen 
Kontakten auch kein Freund von Interrupts und benutze daher stehts 
Polling. Ich wollte nur verstehen, ob und was hinter dem "Verfahren von 
c-hater" wirklich steckt.

: Bearbeitet durch Moderator
von EAF (Gast)


Lesenswert?

Frank M. schrieb:
> Dann muss das c-hater mal erklären, wie
> das funktionieren kann.

Meine Prognose sagt:
Das wird nicht geschehen.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Frank M. schrieb:
> also eine Art "Doppelfinger" pro Schleifer.

Auf den Fotos dieses Threads kann man die "Doppelfinger" pro Schleifer 
ganz gut erkennen:

Beitrag "Drehgeber/Encoder EC16 ersetzen durch neuen Typ"

Beitrag "Re: Drehgeber/Encoder EC16 ersetzen durch neuen Typ"

Klar, ganz ausgeschlossen wird ein "Kratzen" damit nicht, aber wie 
wahrscheinlich ist das dann noch?

von EAF (Gast)


Lesenswert?

Frank M. schrieb:
> aber wie wahrscheinlich ist das dann noch?

Die Wahrscheinlichkeit ist gruselig hoch.
Mit zunehmendem Alter immer gruseliger.
Was sich die Hardware an Schwäche leistet, muss man irgendwie ausbügeln.

Denn:
Jede Fehlfunktion nervt.
Der Benutzer erwartet eine korrekte reproduzierbare Funktionalität, und 
keine willkürlichen Hüpfer.

von Teo D. (teoderix)


Lesenswert?

Frank M. schrieb:
> Klar, ganz ausgeschlossen wird ein "Kratzen" damit nicht, aber wie
> wahrscheinlich ist das dann noch?

Wahrscheinlicher als ich ursprünglich dachte, nur wie bereits erwähnt, 
hat mich dann der Spannungssprung von 5V auf ~16V (0,1V Schritt), dann 
doch etwas stutzig gemacht. #-/ Als dann mein viel bekurbelter 
Test-Drehencoder fürs Breadboard zu spinnen begann, hab ich erst mal mit 
dem Frittstrom experimentiert. Weil das hatte nur 0,5mA und da ich mir 
hierüber noch nie wirklich Gedanken gemacht hatte.... Also 3mA gegönnt 
und sie da, es bringt wirklich was. 8-O
Aber das alleine wars dann doch nich (was mich nicht erstaunt), also per 
SW noch entprellt. Juhu, nu tut er's wieder.

Haja, alle Drehencoder für die Finger, die ich bisher zerlegt gesehen 
habe hatten min. zwei Zungen pro Kontakt. Halbiert aber das Problem nur.

: Bearbeitet durch User
von W.S. (Gast)


Lesenswert?

Frank M. schrieb:
> Kannst Du das bitte näher erläutern? Wenn ein Kontakt "kratzt" passiert
> doch exakt gar nichts, da der Interrupt bereits nach der ersten Flanke
> deaktiviert worden ist?

Bei den gebräuchlichsten billigen Drehgebern stecken keine 
Schleifkontakte drin, sondern ein gedelltes Plastikrad, was auf zwei 
Büchsenblech-Streifen drückt und damit sowohl die Kontaktgaben als auch 
die mechanische Rastung erledigt. Sparsam eben. Die Dinger sollen in der 
Herstellung möglichst garnix kosten.

Zwei sich gegenseitig verriegelnde Interrupts halte ich für nicht 
wirklich betriebssicher, denn das kommt irgendwann außer Tritt. 
Obendrein hätte man bei dem Kanal, der im oder ganz nahe dem Rastpunkt 
schaltet, ein Problem mit einem sinnlosen Gewitter von Interrupts. Also 
besser nur ein Interrupt und zwar auf dem "zuverlässigeren" Kanal, dafür 
aber auf beide Flanken.

Nochwas: Wenn man schon voraussetzt, daß die Kontakte dank fehlender 
Entprellung prellen, dann ist das Pollen unzuverlässiger als das 
Benutzen der Interrupts, denn der Zustand des zweiten Signals sollte 
möglichst zeitnah zum Umschalten des ersten Signals erfaßt werden, sonst 
ist die Richtungsfindung nicht mehr zuverlässig möglich. Also wenn 
pollen, dann in sehr kurzen Zeitabständen, was Rechenzeit und ggf. Strom 
kostet. Soviel zu den vollmundigen Äußerungen von Mawin.

W.S.

von Teo D. (teoderix)


Lesenswert?

W.S. schrieb:
> denn der Zustand des zweiten Signals sollte
> möglichst zeitnah zum Umschalten des ersten Signals erfaßt werden

Was??? Vollverpeilt?! Jeder sollte wissen, dass dies entweder 
gleichzeitig (ein Port) geschieht oder mit 2-4 Maschinenzyklen abgetan 
ist! 8-O

von W.S. (Gast)


Lesenswert?

Teo D. schrieb:
> Was??? Vollverpeilt?!

Nö, sondern bei Polling durchaus drin, wenn das Lesen der beiden Kanäle 
mal zu spät kommt (von der tatsächlichen Flanke aus gesehen).

W.S.

von Teo D. (teoderix)


Lesenswert?

W.S. schrieb:
> denn der Zustand des zweiten Signals sollte
> möglichst zeitnah zum Umschalten des ersten Signals erfaßt werden

Ha jetzt versteh ich dich. Nur ist das völliger Blödsinn. Der exakte 
Augenblick, wann der Mechanische-Kontakt erfolgt, ist sowas von 
unwichtig, ja kontraproduktiv, da zu diesem Zeitpunkt das blöde Ding ja 
nicht nur Kratzt sonder eben gerade dann auch prellt..... OK, 'ich' 
umgeh das zwar nur rein zufällig, aber immer hin. :)

von Teo D. (teoderix)


Lesenswert?

(Hab nur meinen Blödsinn gelöscht! Bin schon ganz kirre;)

: Bearbeitet durch User
von A. S. (Gast)


Lesenswert?

Frank M. schrieb:
> Ja, das kann ich nachvollziehen. Dann muss das c-hater mal erklären, wie
> das funktionieren kann.

Das ist nur ein Scheinproblem: bei Wiederholung kann sich das nicht 
summieren.

Wer sich daran stört kann zusätzlich zum Zahlstand auch den aktuellen 
Wert des prellenden Bits auswerten. Notwendig ist das nicht.

Der erste hier, der auf Gray hinwies und das dafür keine Entprellung 
notwendig ist, war m.E.

Wolfgang schrieb:
> Die Auswertung von Gray-Code BRAUCHT keine Entprellung.

C-hater hat es eher nur das wie erklärt.

Edit: sorry, war wohl doch c-hater eher. Gelöscht?

von temp (Gast)


Lesenswert?

c-hater schrieb:
> Ja klar, solche fähigen Programmierer wie du kommen natürlich zu solchen
> Ergebnissen. Aber betrachte das mal bei Anwendungen, die konsequent
> nicht pollen und die MCU immer schlafen legen, wann immer es möglich
> ist. Dann sieht das gleich GANZ anders aus. Für 99.999999% aller
> existierenden µC Anwendungen. Naja, es könnte zumindest so aussehen,
> wenn sie halt nicht von Programmierern stammen würden, wie du es einer
> bist...

Absolut hirnloser Kommentar. Bei einem STM32F103 z.B. ist der 
Unterschied im Stromverbrauch vom Run zum Sleep-Modus nicht mal Faktor 
2. Spätestens wenn das Gerät noch was anderes ausser den µC enthält, 
wird das auch mehr oder weniger Strom verbrauchen. Damit verringert sich 
die Wirksamkeit des Sleep-Modus noch weiter wenn man die 
Gesamtenergiebilanz betrachtet.

Das weiteren wird ja wohl kaum ein Gerät nur aus einen oder zwei 
Drehgebern bestehen. Und wenn ja haben sie oft auch noch einen Kontakt 
beim Drücken. Spätestens wenn da die Interruptjongleure ala c-hater zur 
Hochform auflaufen wird das Chaos perfekt.

In meinen Augen gibt es absolut keinen einzigen Grund der bei der 
Auswertung mechanisch betätigter Schalter/Drehgeber u.s.w. für 
Flankeninterrupts spricht. Dafür ist Polling das Mittel der Wahl und 
solange das nur ein paar wenige Eingänge sind, wird sich die CPU auch 
weiter 99% im Sleep-Modus befinden, selbst bei Polling-Raten von 1ms.

von Εrnst B. (ernst)


Lesenswert?

temp schrieb:
> In meinen Augen gibt es absolut keinen einzigen Grund der bei der
> Auswertung mechanisch betätigter Schalter/Drehgeber u.s.w. für
> Flankeninterrupts spricht.

Doch: Geplante Obsoleszenz. Wenn die Drehgeber nach ein paar Jahren 
labbrig werden und der Stellwert dank falscher Flankenauswertung nur 
noch wild in der Gegend herumspringt fliegt das Gerät auf den Schrott 
(dem Entwickler um die Ohren hauen geht ja leider meist nicht) und ein 
Neues wird gekauft.

von EAF (Gast)


Lesenswert?

temp schrieb:
> Bei einem STM32F103
Der hat solche Decoder in der Timer Hardware.
Da wird man das nicht in Software abhandeln.

von temp (Gast)


Lesenswert?

EAF schrieb:
> Der hat solche Decoder in der Timer Hardware.
> Da wird man das nicht in Software abhandeln.

Das ist auch Schwachsinn in Bezug auf mechanische Drehgeber. Und wenn es 
ein paar mehr werden ist sowieso Multiplexing angesagt, schon allein um 
Verdrahtungsaufwand zu sparen. Den Code dafür hat man einmal in der 
Schublade und ist auf allen denkbaren Controllern lauffähig (bis auf die 
Initialisierung der Pins).

von c-hater (Gast)


Lesenswert?

Frank M. schrieb:

> Um ihn zu verstehen, musste ich mir das Verständnis aus mehreren seiner
> Beiträge erst zusammenklauben.

Naja, dann hast du das richtige Posting nicht auf Anhieb gefunden. Ich 
habe es allerdings auch nicht gefunden. Es gibt so unzählige voluminöse 
Threads zu dem Thema, dass das keine leichte Aufgabe ist. Zumal mit der 
lausigen Suchfunktionalität der Board-Software.

> Wenn ich ihn richtig verstehe, meint er folgendes:
>
1
> 1. PCINT Enable auf Pin A
2
> 2. Wenn INT auf Pin A, dann:
3
> 3. PCINT Disable auf Pin A
4
> 4. Hole Zustand von Pin B
5
> 5. PCINT Enable auf Pin B
6
> 6. Wenn INT auf Pin B, dann:
7
> 7. PCINT Disable auf Pin B
8
> 8. Hole Zustand von Pin A
9
> 9. Weiter bei 1.
10
>

Ja, genau das ist es. Es fehlt eigentlich nur die "start condition". Das 
ist der einzige Zeitpunkt, zu dem beide Interrupts "scharf" sind. Sobald 
einer davon erstmals ausgelöst wurde, ergibt sich dann die von dir 
beschriebene "Schleife" des Zustandsautomaten, der keiner zusätzlichen 
(rechenzeitkostenden) Verwaltung bedarf, sondern mit dem 
Enable/Disable-Gedöhns für die Interrupts bereits vollständig 
abgehandelt ist.

Und wenn man Pedas Code genau analysiert, stellt man fest, dass er im 
Prinzip exakt dasselbe tut, was ich in der Interruptvariante mit der 
gegenseitigen Entriegelung der Interrupts tue (was kein Wunder ist, da 
er ja natürlich sinnvollerweise genauso die grundlegende Eigenschaft so 
eines Quadraturencoders benutzt, statt idiotisch irgendwelche Kontakte 
zeitabhängig zu entprellen).

Das ist, was all diese Programmiererluschen mit MaWin an der Spitze 
scheinbar einfach nicht zu begreifen in der Lage sind...

von Hugo H. (hugo_hu)


Lesenswert?

c-hater schrieb:
> Ja, genau das ist es. Es fehlt eigentlich nur die "start condition". Das
> ist der einzige Zeitpunkt, zu dem beide Interrupts "scharf" sind. Sobald
> einer davon erstmals ausgelöst wurde, ergibt sich dann die von dir
> beschriebene "Schleife" des Zustandsautomaten, der keiner zusätzlichen
> (rechenzeitkostenden) Verwaltung bedarf, sondern mit dem
> Enable/Disable-Gedöhns für die Interrupts bereits vollständig
> abgehandelt ist.

Kannst Du das an dieser Stelle vielleicht mal allgemeinverständlich - in 
Pseudo-Code oder irgendwelchem Code - darstellen? Generationen von 
Code-Erzeugern werden es Dir ggf. danken.

In keinem der von mir verlinkten Threads wird irgendetwas konkretes 
sichtbar - ob Du es so willst oder es schlicht nicht kannst bleibt 
offen.

Du gehörst ja sicher nicht zu den

c-hater schrieb:
> Programmiererluschen mit MaWin an der Spitze

: Bearbeitet durch User
von c-hater (Gast)


Lesenswert?

Hugo H. schrieb:

> Kannst Du das an dieser Stelle vielleicht mal allgemeinverständlich - in
> Pseudo-Code oder irgendwelchem Code - darstellen?

Nun ich könnte den Asm-Quelltext raussuchen, den ich irgendwann schonmal 
geposted habe (welchselbiges Posting ich aber leider nicht finden kann, 
sonst würde ich einfach einen Link darauf posten) und den erneut posten.

Würde dir das weiter helfen? Oder kannst du kein Assembler? Dann kann 
ich mir die Mühe sparen.

von Hugo H. (hugo_hu)


Lesenswert?

c-hater schrieb:
> Nun ich könnte den Asm-Quelltext raussuchen, den ich irgendwann schonmal
> geposted habe

Ja, das wäre durchaus hilfreich ...

Hugo H. schrieb:
> Kannst Du das an dieser Stelle vielleicht mal allgemeinverständlich - in
> Pseudo-Code oder irgendwelchem Code - darstellen?

von Georg (Gast)


Lesenswert?

Hugo H. schrieb:
> Generationen von
> Code-Erzeugern werden es Dir ggf. danken.

Aber nicht hier im Forum, da erntet er höchstens grenzenloses Mobbing - 
es gilt je richtiger desto mob.

Georg

von Hugo H. (hugo_hu)


Lesenswert?

Georg schrieb:
> Hugo H. schrieb:
>> Generationen von
>> Code-Erzeugern werden es Dir ggf. danken.
>
> Aber nicht hier im Forum, da erntet er höchstens grenzenloses Mobbing -
> es gilt je richtiger desto mob.
>
> Georg

Störe Dich bitte nicht an solchen "Gästen" ... uninteressant.

von c-hater (Gast)


Angehängte Dateien:

Lesenswert?

Hugo H. schrieb:

> c-hater schrieb:
>> Nun ich könnte den Asm-Quelltext raussuchen, den ich irgendwann schonmal
>> geposted habe
>
> Ja, das wäre durchaus hilfreich ...

Nun, ich habe ihn nicht finden können, auch nicht in meiner eigenen 
Ablage. Aber da ich bei dem Projekt, mit dem ich aktuell zugange bin, 
sowieso mal wegen einer gewissen geistigen Verknotung eine kleine 
Aus-Zeit benötigt habe und obendrein richtig Lust dazu hatte, mal wieder 
was für AVR8 zu schreiben, habe ich die Sache einfach mal from scratch 
neu programmiert. Das Ergebnis dürfte mit einiger Wahrscheinlichkeit 
etwas schöner und universeller einsetzbar sein als der damaligen Code. 
Sicher weiss ich es nicht, weil der ja leider nicht auffindbar ist.

Der aktuelle Code ist jedenfalls nahezu gnadenlos auf Speed optimiert. 
Die einige Ausnahme ist die Benutzung eines Common-Teils für die beiden 
ISRs. Das spart 22 Bytes Codespace, führt aber dafür für eine 
Zählrichtung 2 Straftakte ein. Wenn das stört, kann man es leicht 
ändern.

von c-hater (Gast)


Angehängte Dateien:

Lesenswert?

c-hater schrieb:

> Der aktuelle Code ist jedenfalls nahezu gnadenlos auf Speed optimiert.

Mist, aber die Sachen mit den konfigurierbaren Pullups war nur zur 
Hälfte eingebaut.

Hier also die korrigierte Fassung...

von m.n. (Gast)


Lesenswert?

Das ist optimaler Code, um Leute von Assembler fernzuhalten.

von Stefan F. (Gast)


Lesenswert?

m.n. schrieb:
> Das ist optimaler Code, um Leute von Assembler fernzuhalten.

Egal, es gibt in diesem Forum genau eine Person, die noch freiwillig 
(mehr als unbedingt nötig) in Assembler programmiert. Und die findet den 
Code super.

Also ist die gesamte Zielgruppe hoch zufrieden gestellt.

von c-hater (Gast)


Lesenswert?

m.n. schrieb:

> Das ist optimaler Code, um Leute von Assembler fernzuhalten.

Was genau gefällt dir daran denn nicht?

von c-hater (Gast)


Lesenswert?

Stefan ⛄ F. schrieb:

> Egal, es gibt in diesem Forum genau eine Person, die noch freiwillig
> (mehr als unbedingt nötig) in Assembler programmiert.

Nein, sicher nicht. Mindestens gibt es da noch einen, der recht 
regelmäßig entprechende Ambitionen verkündet.

Und es gibt offensichtlich noch eine große, mittlerweile einfachn ur 
noch genervt schweigende Menge von Leuten, die es leid sind, sich für 
die Verwendung von Asm vor den Nicht-Asm-fähigen Vollidioten 
rechtfertigen zu müssen, aber weiterhin Asm verwenden.

Außerdem: wenn dich die Asm-Umsetzung stört: Niemand hindert dich daran, 
das in fluffiges Idioten-C oder meinetwegen sogar Arduidioten-C++ zu 
verwandeln. Das Ergebnis wird NATÜRLICH sehr viel schlechtere 
Laufzeiteigenschaften haben, als der Assemblercode. Aber er wird auch 
dann funktionieren. Mit den entsprechenden Abstrichen bei der möglichen 
Performance...

Es ging im Kern nur darum, zu zeigen, dass es prinzipiell geht.

von Stefan F. (Gast)


Lesenswert?

c-hater schrieb:
> wenn dich die Asm-Umsetzung stört

Tut sie nicht, mach nur weiter. Ich wollte nur andeuten, dass du dazu 
nur wenig Feedback erwarten kannst.

von m.n. (Gast)


Lesenswert?

c-hater schrieb:
> Was genau gefällt dir daran denn nicht?

Viel zu viele Bäume und kein Wald zu sehen.
Anstatt einer universellen Version wäre ein Version mit festem Port und 
festen IO-Pins für das Verständnis hilfreicher. Es fehlen die 
notwendigen Kommentare zum Code.
So wirst Du keine "Oberpoller" bekehren können - Programmierneulinge 
schon garnicht.

Wer diese Routinen in seinen C-Quellcode einbetten will, wird daran 
scheitern, daß die verwendeten Register nicht reserviert sind. IAR 
könnte das zwar, ist hier aber nicht beliebt. In diesem Punkt ist es 
dann doch keine universelle Programmierung, sondern zwangsläufig daran 
gebunden, alles in Assembler zu machen.
Eine langsamere, abgekapselte Version mit PUSHs und POPs könnte besser 
in C-Programme eingebunden und dann direkt mit anderen Auswerteverfahren 
verglichen werden.

von Rainer V. (a_zip)


Lesenswert?

Stefan ⛄ F. schrieb:
> es gibt in diesem Forum genau eine Person

...mindestens zwei...

von c-hater (Gast)


Lesenswert?

m.n. schrieb:

> Viel zu viele Bäume und kein Wald zu sehen.

Der Code ist aber doch SEHR überschaubar. Wer das nicht lesen kann, 
der ist kein Programmierer.

> Anstatt einer universellen Version wäre ein Version mit festem Port und
> festen IO-Pins für das Verständnis hilfreicher.

Kann sich doch jeder leicht soweit runterbrechen?!

> Es fehlen die
> notwendigen Kommentare zum Code.

Höchstens in den ISRs und nur außerhalb dessen, was das Grundkonzept 
ausmacht, um das es ging, von dem halt einige Idioten behauptet haben, 
dass es nicht funktionieren kann. Das Grundkonzept wurde unzählige Male 
kommentiert, zuletzt recht ordentlich hier:

Beitrag "Re: Drehgeber an Arduino, external interrupt ISR wird doppelt ausgeführt"

Also, nichtmal von mir selber. Das zeigt im Minimum: es gibt da 
tatsächlich durchaus Programmierer, die in der Lage sind, es zu 
verstehen...

> So wirst Du keine "Oberpoller" bekehren können

Naja. Will ich eigentlich auch nicht. Die sind eh' verloren. Haben nie 
gelernt, wie man "ereignisorientiert" programmiert. Sind in 
Kontrollstrukturen in main() gefangen. Armes, bemitleidenswertes Pack.

> Wer diese Routinen in seinen C-Quellcode einbetten will, wird daran
> scheitern, daß die verwendeten Register nicht reserviert sind.

Was interessiert mich das Elend von C-Only-Programierern? Und: natürlich 
ist es kein Problem, die reservierten Register los zu werden. Mit den 
entsprechenden Einbußen bei der möglichen Performance natürlich...

von Hugo H. (hugo_hu)


Lesenswert?

c-hater schrieb:
> Hier also die korrigierte Fassung...

Herzlichen Dank - werde ich in Ruhe anschauen und überdenken. Dauert 
vermutlich etwas ... :-), da ich noch berufstätig bin.

von c-hater (Gast)


Lesenswert?

Hugo H. schrieb:

> Herzlichen Dank - werde ich in Ruhe anschauen und überdenken. Dauert
> vermutlich etwas ... :-), da ich noch berufstätig bin.

Wie ich auch. Deswegen hat auch die Lieferung etwas gedauert...

von Rainer V. (a_zip)


Lesenswert?

c-hater schrieb:
> Was interessiert mich das Elend von C-Only-Programierern?

Auch mich überhaupt nicht :-) abgesehen davon, dass der pure Kumpel eh 
keinen A-Code in sein Progrämmchen hineinbasteln kann!
Gruß Rainer

von Teo (Gast)


Lesenswert?

c-hater schrieb:
> Das Grundkonzept wurde unzählige Male
> kommentiert, zuletzt recht ordentlich hier:
>
> Beitrag "Re: Drehgeber an Arduino, external interrupt ISR wird doppelt
> ausgeführt"
>
> Also, nichtmal von mir selber. Das zeigt im Minimum: es gibt da
> tatsächlich durchaus Programmierer, die in der Lage sind, es zu
> verstehen...

OK, dann ist dies ja bestätigt. Jetzt fehlt nur noch jemand, der das an 
nem ollen 08/15 Drehgeber ausprobiert. Dieser "Speed optimierte" Code, 
muss da unweigerlich Amok laufen!

von c-hater (Gast)


Lesenswert?

Teo schrieb:

> OK, dann ist dies ja bestätigt. Jetzt fehlt nur noch jemand, der das an
> nem ollen 08/15 Drehgeber ausprobiert. Dieser "Speed optimierte" Code,
> muss da unweigerlich Amok laufen!

Das kann nur jemand sagen, der IMMER NOCH NICHT DAS KONZEPT VERSTANDEN 
HAT. Was, wie schon erwähnt, im Prinzip exakt dasselbe ist wie in PeDas 
bewährtem Code. Nix Entprellung. Braucht ein Quadrature-Encoder auf 
Grund seines Funktionsprinzips einfach nicht.

Manche Leute begreifen es halt einfach nicht. Hoffnunglos von der Natur 
mit unterdurchschnittlichen geistigen Fähigkeiten benachteiligt.

von Knut (Gast)


Lesenswert?

c-hater schrieb:
> Manche Leute begreifen es halt einfach nicht. Hoffnunglos von der Natur
> mit unterdurchschnittlichen geistigen Fähigkeiten benachteiligt.

Wow, wer beleidigt hat Recht oder was? WTF!

von Teo D. (teoderix)


Lesenswert?

c-hater schrieb:
> Das kann nur jemand sagen, der IMMER NOCH NICHT DAS KONZEPT VERSTANDEN
> HAT.

OK, du hast das ja. Also sollte dir folgendes, doch nicht schwerfallen: 
Also nur so mal zum Spass. Sagen wir es gäbe tatsächlich Drehgeber, die 
nicht nur Prellen, sondern währenddessen, auf dem anderen Kanal Kratzen. 
Wie würde dein Ultra-Speed Code darauf reagieren?!

"
1. PCINT Enable auf Pin A
2. Wenn INT auf Pin A, dann:
3. PCINT Disable auf Pin A
4. Hole Zustand von Pin B
5. PCINT Enable auf Pin B
6. Wenn INT auf Pin B, dann:
7. PCINT Disable auf Pin B
8. Hole Zustand von Pin A
9. Weiter bei 1.
"


(C-hater schrieb:
> Beitrag "Re: Drehgeber an Arduino, external interrupt ISR wird doppelt
> ausgeführt"
>
> Also, nichtmal von mir selber. Das zeigt im Minimum: es gibt da
> tatsächlich durchaus Programmierer, die in der Lage sind, es zu
> verstehen...)

von A. S. (Gast)


Lesenswert?

Teo D. schrieb:
> auf dem anderen Kanal Kratzen.

Wenn der andere Kanal in der Mitte seines Signals "kratzt", wie soll man 
den dann auswerten?

Entweder du definierst das Kratzen, dann ist es eine sportliche 
Herausforderung, oder es Kratzt beliebig, dann ist die Auswertung 
sinnlos.

von MaWin (Gast)


Lesenswert?

Teo schrieb:
> Jetzt fehlt nur noch jemand, der das an nem ollen 08/15 Drehgeber
> ausprobiert.

Ein gut funktionierender reicht.

Da drehste am Knopf rechts 5 Rasten, und dann wieder links 5 Rasten, und 
die Anzeige steht um 1 daneben

Da fragste dich dann als Bediener (vom Radio, Labornetzteil, 
wasauchimmer) ob du blöd bist und nicht zählen kannst, die Hardware 
nichts taugt, oder alles unter einem Zauber liegt.

Dabei war's der Programmierer der zu dumm ist, korrekten code zu 
schreiben. c-hater halt.

von Teo D. (teoderix)


Lesenswert?

MaWin schrieb:
> Ein gut funktionierender reicht.

Tun sie aber irgend wann nich mehr. Da muss man doch nich gleich Amok 
laufen.

Das dem C-Hasser hier bei jeder Richtungsumkehr, die erste 
Rastung(Schritt) verloren geht, wollte ich ncht ansprechen. Ich wollts 
halt erstmal einfach halten... ;P



A. S. schrieb:
> Entweder du definierst das Kratzen, dann ist es eine sportliche
> Herausforderung, oder es Kratzt beliebig, dann ist die Auswertung
> sinnlos.

Ja irgendwann hilft nicht mal mehr ein HW Tiefpass.... Die Dinger halten 
halt nich ewig.
Aber warum nich den Frust, wenn in der Zwischenzeit doch immer wieder 
mal der Zufall zuschlägt, für den Anwender soweit reduzieren wie möglich 
und letztendlich auch noch 50-100% an Lebenszeit für den Drehgeber raus 
holen?!

von Hugo H. (hugo_hu)


Lesenswert?

MaWin schrieb:
> Da drehste am Knopf rechts 5 Rasten, und dann wieder links 5 Rasten, und
> die Anzeige steht um 1 daneben

Das ist für mich kein Argument. Es ist doch Sch..ß-egal ob ich einen 
Rastpunkt mehr oder weniger in eine Richtung drehen muss - Hauptsache es 
ist im Drehvorgang ein zuverlässiger Zähler und wackelt nicht sinnlos 
durch die Gegend ohne zu (meinem) Ziel zu kommen. Außerdem könnte man 
das ja wohl in der Auswerte-SW kompensieren.

@PeDa: Erkennt Deine Routine die Richtungsumkehr ohne Schrittverlust? 
Weiß ich jetzt nicht, da es mich nie interessiert hat ...

: Bearbeitet durch User
von A. S. (Gast)


Lesenswert?

MaWin schrieb:
> Da drehste am Knopf rechts 5 Rasten, und dann wieder links 5 Rasten, und
> die Anzeige steht um 1 daneben

Diese 1 ist aber das Maximum. Es summiert sich nichts auf. D.h. Du 
kannst 1000x links und rechts drehen und am Ende liegst Du maximal 1 
daneben. Und dieses 1 kannst Du jederzeit korrigieren, wenn Du möchtest.

Hugo H. schrieb:
> Es ist doch Sch..ß-egal ob ich einen
> Rastpunkt mehr oder weniger in eine Richtung drehen muss

Wenn es sich aufsummieren würde (also bei jeder Kehre die Chance auf 
eine Abweichung), wäre es unbrauchbar. Zwar nicht für eine Bedienung, 
aber z.B. für einen Weggeber.

von m.n. (Gast)


Lesenswert?

MaWin schrieb:
> Dabei war's der Programmierer der zu dumm ist, korrekten code zu
> schreiben.

Da wird schon wieder gemeckert und geblökt, daß die Wände wackeln.
Warum probiert es nicht jemand aus?

Teo D. schrieb:
> Sagen wir es gäbe tatsächlich Drehgeber, die
> nicht nur Prellen, sondern währenddessen, auf dem anderen Kanal Kratzen.

Kratzen ist ja jetzt neu. Bislang haben Drehgeber immer nur gezittert.

Beitrag #6817443 wurde vom Autor gelöscht.
von c-hater (Gast)


Lesenswert?

A. S. schrieb:

> Diese 1 ist aber das Maximum. Es summiert sich nichts auf. D.h. Du
> kannst 1000x links und rechts drehen und am Ende liegst Du maximal 1
> daneben.

Ganz genau. Und ganz genau so ist es auch in PeDas Code (zumindest 
wahlweise). Die Alternative ist, halt Wackler ständig zu melden und es 
dem "Client" zu überlassen, damit sinnvoll umzugehen. Was der dann (wenn 
er Ahnung hat) auch wieder bloß (mit vergleichsweise viel Aufwand) mit 
einer Umkehr-Hysterese von 1 löst, weil eine echte Information steckt ja 
typisch nicht in dieser Wackelei...

Auch wieder eine Sache, die MaWin AKA HeinBlöd nicht kapiert. Und 
überhaupt hat er auch die Sache mit den Rastpunkten nicht kapiert. Da 
kommt's nämlich darauf an, alle wieviel Schritte (Schritt=minimale 
Zustandsänderung des Systems) die liegen. Sein "Problem" existiert 
überhaupt nur, wenn es für jeden Schritt wirklich einen gibt und wenn es 
überhaupt Rastpunkte gibt...

Und wenn das so ist, dann sollte der Encoder auch gut genug sein, hier 
nicht sinnlos zu wackeln, sondern nur, wenn sich tatsächlich was bewegt 
hat. Und dann kommt das in's Spiel, was du hier schreibst:

> Und dieses 1 kannst Du jederzeit korrigieren, wenn Du möchtest.

So ist das. Für jemanden, der das PRINZIP verstanden hat, ist es kein 
Problem, zu jedem beliebigen Zeitpunkt einer Abfrage des Zahlerstands 
auf den intern gespeicherten Zählerwert eine +-1-Korrektur anzuwenden. 
Alle dazu nötigen Daten liegen im Freigabestatus der Interrupts, dem 
Status-Byte und dem (dann aktuell einzulesenden) Zustand der Leitung, 
dessen Interrupt inaktiv ist.

von c-hater (Gast)


Lesenswert?

Teo D. schrieb:

> Das dem C-Hasser hier bei jeder Richtungsumkehr, die erste
> Rastung(Schritt) verloren geht, wollte ich ncht ansprechen.

Geht er nicht. Du kannst definitiv schonmal kein Assembler und/oder hast 
das PRINZIP immer noch nicht begriffen...

Was maximal "verloren" geht, ist der zuletzt gemachte Schritt. Das wird 
dann aber (wenn es geschehen ist) beim nächsten Schritt sofort 
kompensiert. Sprich: der maximale Fehler des internen Zählers ist zu 
jeder Zeit +-1 Schritt.

Und wenn sich der Client sicher ist, dass der Encoder nicht nur sinnlos 
wackelt (was eher die Ausnahme sein dürfte), kann er auch diesen Schritt 
noch ermitteln. Kostet nur vier oder fünf weitere Zeilen Assembler.

von c-hater (Gast)


Lesenswert?

Teo D. schrieb:

> Sagen wir es gäbe tatsächlich Drehgeber, die
> nicht nur Prellen, sondern währenddessen, auf dem anderen Kanal Kratzen.

Das sind dann keine tauglichen Drehgeber mehr. So einfach ist das.

Kein Software der Welt kann die dann wirklich sinnvoll auswerten.

Naturgesetz. Capisce?

von c-hater (Gast)


Lesenswert?

c-hater schrieb:

> Naturgesetz. Capisce?

Aber naja, warten wir mal auf MaWins Statement. Der kann das bestimmt. 
Ganz sicher. Man muß nur entprellen und das geht...

Ich bin zumindest diesbezüglich hochgespannt auf Lösungen von 
Fachleuten, die die Naturgesetze erfolgreich ignorieren...

von c-hater (Gast)


Lesenswert?

c-hater schrieb:
> c-hater schrieb:
>
>> Naturgesetz. Capisce?
>
> Aber naja, warten wir mal auf MaWins Statement.

Aber warum eigentlich auf MaWin warten (der wird sich nicht darauf 
einlassen, so clever ist er dann doch).

Sehen wir uns doch statt dessen einfach DEINE wohldurchdachte Lösung 
für den Fall des "kratzenden" anderen Kanals an...

Das wird genausp lustig, soviel kann man wohl vorab versprechen. Und das 
ganz ohne Hellseher zu sein...

von mehrfach (Gast)


Lesenswert?

Der Ersteller des Theads, Enrico I. hat eigentlich nur einen Fehler 
gemacht:

Er hat das Wort Encoder in der Raum geworfen. Dann wirds hier immer 
fundamentalistisch.

Klar, es gibt einwandfreie technische Lösungen um kratzende, prellende 
oder sonstwie gestörte Signale vernünftig einzulesen.

ABER: Enrico I. wollte ein anderes Problem behandelt sehen:

Seine Interrupt-Routine wird mehrfach (zweifach ist auch mehrfach) 
ausgelöst, und er weiß nicht warum.
Klar zwei Sekunden Delay spricht nicht für überlegtes Handeln, trotzdem 
ist das Problem unabhängig vom Reizwort Encoder.

Leider kenn ich mich bei diesen Prozessoren nicht aus und kann nicht 
helfen, aber irgendwer, der nicht auf Encoder-Macho macht weiß sicher 
die Lösung.

von W.S. (Gast)


Lesenswert?

m.n. schrieb:
> Kratzen ist ja jetzt neu.

Sehe ich auch so. Habe bislang zwar wackelnde und prellende DG gehabt, 
aber keinen einzigen, der gekratzt hätte. Ist wahrscheinlich eher ein 
Theoretikum.

W.S.

von W.S. (Gast)


Lesenswert?

mehrfach schrieb:
> Seine Interrupt-Routine wird mehrfach (zweifach ist auch mehrfach)
> ausgelöst, und er weiß nicht warum.

Wird sie überhaupt 2x ausgelöst? Oder besteht das Problem nur darin, daß 
die ISR nur int0_detected auf 1 setzt und dieses eine relativ lausige 
Kommunikation mit der Auswertefunktion ist?

Kurzum, es ist zuviel an Unwägbarkeiten dabei - bis hin zu womöglichen 
Einstellfehlern oder falsch verstandenen Einstellungen bei den AVR (um 
die ich mich seit Jahren schlichtweg nicht kümmere).

W.S.

von c-hater (Gast)


Lesenswert?

mehrfach schrieb:

> Der Ersteller des Theads, Enrico I. hat eigentlich nur einen Fehler
> gemacht:
>
> Er hat das Wort Encoder in der Raum geworfen. Dann wirds hier immer
> fundamentalistisch.

Das war eben KEIN Fehler, sondern ein notwendiges Grundlagenwissen 
über das Problem. Das ist nämlich schlicht und einfach bei einem rotary 
encoder anders lösbar als bei einfachen Kontakten.

Genau das ist der Punkt, den du nicht begriffen hast, etliche andere 
Leute auch nicht und vermutlich der TO in hundert Jahren auch noch 
nicht...

Der Thread könnte das zum Guten ändern...

von Rainer V. (a_zip)


Lesenswert?

...und ich kann kein "void" und sehe daher auch nicht, ob was in dem 
Progrämmchen schief läuft...der TO sollte aber mittlerweile so viele 
Infos bekommen haben, dass er jetzt seine eigene Implementierung locker 
prüfen kann :-)
Gruß Rainer

von MaWin (Gast)


Lesenswert?

c-hater schrieb:
> Kein Software der Welt kann die dann wirklich sinnvoll auswerten.

Doch, aber dazu muss man überabtasten, also z.B. mit 20-facher 
Geschwindigkeit als sonst notwendig, oder auch 100-facher.

Hardware funktioniert auch, da Kratzen nur auf dem Kontakt stattfindet 
der gerade geschlossen ist, so lange die Aussetzer zeitlich viel kürzer 
sind als die geschlossenen reicht ein Tiefpass, am besten ein 
Kondensator über dem Kontakt der bei geschlossenem Kontakt schnell 
entladen wird und bei offenem nur über den pull  up aufgeladen wird.

Ein Encoderinterface im uC als Hardware hat auch oft deglitching in dem 
mit hoher Abtastfrequenz einzelne Aussetzer ignoriert werden.

Solche Drehgeber sind also nicht gleich Müll, sondern passende 
Auswertung lässt sich nicht stören.

Erst wenn die Aussetzer statistisch häufiger als die Kontaktgabe werden, 
sind die Müll

Nehmen wir c-haters code und solche Drehgeber
1
A: 000011111111111111000000011
2
B: 000000001111111111111100000
3
X: 000011112222222222333344455
4
a: 000011111011110111000000011
5
b: 000000001111011111111100000
6
Y: 000011112322123222333344455
7
Z: aaaabbbbabbbaabbbbbbbbaaabb
8
C: 000011112222112222222233344
A wäre der gute Encoder Kanal A
B der gute Encoderkanal B
X die richtige Zählung
a ist der kratzende Kanal A
b der kratzende Kanal B
Y ist das was polling dabei zahlt
Z auf welchern Flankeninterrupt c-hater wartet
C sollte das sein was c-haters code zählt,
obwohl, sicher bin ich mir nicht,
ich hab sein Programm nicht ablaufen lassen
sonder nur per Hand versucht nachzuvollziehen.
Vielleicht guckt da noch mal jemand drüber.

von Joachim B. (jar)


Lesenswert?

MaWin schrieb:
> überabtasten

kann man mit Software

MaWin schrieb:
> ein Tiefpass, am besten ein
> Kondensator

geht auch, ABER viel hilft nicht immer viel, irgendwann ist der 
Kondensator so groß falsch gewählt das der Umladestrom alle Kontakte 
verbrutzelt.

von ardap (Gast)


Lesenswert?

c-hater schrieb:
> Mist, aber die Sachen mit den konfigurierbaren Pullups war nur zur
> Hälfte eingebaut.
>
> Hier also die korrigierte Fassung...

Bug in Zeile 258 (UOUT ENC_B_IFLGREG,R17)

von c-hater (Gast)


Angehängte Dateien:

Lesenswert?

ardap schrieb:

> c-hater schrieb:
>> Mist, aber die Sachen mit den konfigurierbaren Pullups war nur zur
>> Hälfte eingebaut.
>>
>> Hier also die korrigierte Fassung...
>
> Bug in Zeile 258 (UOUT ENC_B_IFLGREG,R17)

Stimmt, ganz klarer (und ziemlich peinlicher) Bug. Da müsste statt "R17" 
natürlich "TMP" stehen. Mist, wie ist das denn passiert? Keine Ahnung.

Blöd, dass dieser Bug im RL nahezu niemals Folgen hat, deswegen habe ich 
ihn auch nicht bemerkt.

Da kann man mal sehen, wozu unabhängige code reviews gut sind. Vier 
Augen sehen halt doch mehr als zwei.

Also nochmal eine korrigierte Fassung des Codes als Anhang.

von temp (Gast)


Lesenswert?

c-hater schrieb:
> Mist, wie ist das denn passiert? Keine Ahnung.

Aber ich, kannst du dich nicht mehr an deine eigenen Worte erinnern?

c-hater schrieb:
> Hoffnunglos von der Natur
> mit unterdurchschnittlichen geistigen Fähigkeiten benachteiligt.

von Stefan F. (Gast)


Lesenswert?

temp schrieb:
> Aber ich

bravo, dem hast du es mal so richtig gegeben! Du bist so toll! Komm, 
lass und freunde werden! Ich brauche noch mehr so geile Typen um mich 
herum. Dann können wir durch die Stadt ziehen und alle mal so richtig 
fett beleidigen. Das wird ein Hit bei Youtube, deine Mutter wird dich 
lieben.

Allerdings musst du bis dahin deine Feigheit ablegen, dich hinter einem 
anonymen Zugang zu verbergen.

von temp (Gast)


Lesenswert?

Stefan ⛄ F. schrieb:
> Komm,
> lass und freunde werden

Sorry, mein Bedarf an solchen Freunden ist gedeckt.

Stefan ⛄ F. schrieb:
> Allerdings musst du bis dahin deine Feigheit ablegen, dich hinter einem
> anonymen Zugang zu verbergen.

Und wozu soll das gut sein? Entweder alle oder keiner. Ich wäre sogar 
für alle mit Identitätsnachweis. Meinetwegen auch in einem anderen 
Forum. Aber hier? Hatte ich mal. Nie wieder.

von MaWin (Gast)


Lesenswert?

temp schrieb:
> Hatte ich mal. Nie wieder.

Wird seinen Grund haben. Fachlicher Unsinn, Lügengeschichten, 
rüpelhaftes Auftreten. Dann ist dein Name verbrannt.

von W.S. (Gast)


Lesenswert?

Nun ist wohl bereits alles gesagt und alle Leute haben Gelegenheit 
gehabt, ihre Version zum besten zu geben und der TO kann sich da 
inzwischen heraussuchen, was er am liebsten kopieren mag, von Polling 
bis zu mehreren abwechselnden Interrupts.

Was jetzt noch bleibt, sind nachfolgende und gegenseitige Anfeindungen, 
weil eine jede Sparte auf ihrer Methode als einzig seligmachende Version 
beharrt.

Ob das nun dem TO noch von Nutzen sein wird? Wohl eher nicht, denn er 
befaßt sich nur gezwungenermaßen damit:
Enrico I. schrieb:
> für ein Projekt muss ich mich mit Interrupts beschäftigen...

Tja, da muß du eben durch und auch ich werde dich bei passender 
Gelegenheit gebührend bedauern.

W.S.

von temp (Gast)


Lesenswert?

MaWin schrieb:
> Wird seinen Grund haben. Fachlicher Unsinn, Lügengeschichten,
> rüpelhaftes Auftreten. Dann ist dein Name verbrannt.

Das mach ich dann lieber unter "temp". Gerne auch mal so provokativ dass 
mir die Admins einen Thread sperren, wenn er von Leuten gekapert wird 
die z.B. C hassen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.