Als kleine kostengünstige Lösung für die Auswertung von Linear-,
Rotations- oder Drehgebern bietet sich ein ATtiny25 an, da er nicht nur
die Auswertung und Impulszählung erledigen kann, sondern zur
Datenausgabe mit seinem USI auch eine IIC-Schnittstelle bedient.
Bei der Beschaltung des Tiny25 sind PB0 (SDA) und PB2 (SCL) für die
IIC-Schnittstelle fest vorgegeben. Die freien Pins PB4 (Phase-A) und PB4
(Phase-B) werden für den Anschluß des Inkrementalgebers verwendet; bei
beiden Eingängen ist der interne Pullup-Widerstand aktiviert, sodaß auch
passive Geber direkt angeschlossen werden können. Der verbleibende PB1
kann für optinales /Reset-Signal genutzt werden und hat ebenfalls den
internen Pullup-Widerstand eingeschaltet.
Sofern für SDA, SCL und /Reset noch zusätzliche Pullup-Widerstände im
Schaltbild eingefügt sind, dienen diese der Erhöhung der Störsicherheit
bzw. als Abschlußwiderstände für IIC, falls nicht an anderer Stelle der
Schaltung bereits vorhanden.
Mit dem intern getakteten ATtiny werden Flankenänderungen bis ca. 350
kHz erkannt und mit einem 32 Bit Zähler gezählt. Dabei ist es
unerheblich, ob prellende mechanische Kontakte angeschlossen werden,
oder das Signal von optischen Encodern oder Hallsensoren stammt. Alle
Signale werden mit 4-fach Flankenbewertung gezählt. Um bei mechanischen
Drehgebern die unbrauchbaren Zwischenflanken zu unterdrücken, kann man
bei der Datenausgabe auf 2-fach Auswertung 'umschalten', was nicht
anderes bedeutet, als daß Zählerwert/2 ausgegeben wird.
Die Datenausgabe per IIC ist minimal gehalten. Folgende Befehle werden
beachtet:
'A' Ausgabe des Zählerstandes
'B' Ausgabe des Zählerstandes/2 für Geber mit Zwischenflanken
'Z' Löschen des Zählers
Bei der Ausgabe wird das untere Byte zuerst gesendet. Daher ist es
möglich, nur ein oder zwei Bytes auszulesen und die Übertragung
abzukürzen. Werden mehr als vier Bytes gelesen, wiederholt sich die
Ausgabe des 32 Bit Zählerstandes.
Als IIC-Adresse gibt das Programm 0xB8 vor, die (hoffentlich) nicht mit
anderen Busteilnehmern zur Kollision führt. Alternativ kann man eine
eigene Adresse vorgeben, die man ins interne EEPROM an Adresse 0x00
schreibt. Hier steht normalerweise ein 0xFF. Wird beim Programmstart ein
Wert != 0xFF gefunden, wird dieser als neue, eigene Adresse verwendet.
Bislang habe ich die Software mit 100 kHz Busfrequenz und einem
IIC-Master per Software getestet. Vielleicht testet jemand bei Bedarf
unter anderen Bedingungen und kann seine Erfahrungen mitteilen. Soweit
bleibt die Software daher eine Testversion.
Die Funktion der Flankenauswertung ist an anderer Stelle schon
beschrieben: Beitrag "4-fach Flankenauswertung per Interrupt mit ATmega48/88"
Danke für deine Antwort. Genau so was suche ich. Habe zwar einen anderen
Prozessor und zusätzlich noch RGB LED Dioden mit Drehgeber. Dein
Programm ist allerdings in hex geschrieben. Arbeite mit C. dadurch kann
ich es nicht anpassen. Hast du vielleicht eine Version in C dazu?
Bert schrieb:> Danke für deine Antwort. Genau so was suche ich. Habe zwar einen anderen> Prozessor und zusätzlich noch RGB LED Dioden mit Drehgeber. Dein> Programm ist allerdings in hex geschrieben. Arbeite mit C. dadurch kann> ich es nicht anpassen. Hast du vielleicht eine Version in C dazu?
Das Programm könnte ziemlicher Käse sein (Hervorhebung von mir):
> Die Funktion der Flankenauswertung ist an anderer Stelle schon> beschrieben: Beitrag "4-fach Flankenauswertung per Interrupt mit> ATmega48/88"
Interrupts sind im Allgemeinen zur Auswertung von Drehgebern nicht zu
empfehlen.
Alternative: https://www.mikrocontroller.net/articles/Drehgeber
Harald schrieb:> Interrupts sind im Allgemeinen zur Auswertung von Drehgebern nicht zu> empfehlen.
Du hättest Dir das Programm überhaupt einmal ansehen soll; die
einleitende Beschreibung hätte ja schon gereicht.
Dann hättest du (vielleicht) gemerkt, daß Deine Antwort Käse ist.
M.N. schrieb:> Du hättest Dir das Programm überhaupt einmal ansehen soll
Tja, hier ist nur die HEX-Datei.
Im Thread
Beitrag "4-fach Flankenauswertung per Interrupt mit ATmega48/88"
findet sich
"Jede Flankenänderung wird mit einer schnellen Interruptroutine erfaßt."
// init fuer Flankenauswertung per interrupt
EICRA |= BIT(ISC10) + BIT(ISC00); // int0 + int1: beide flanken
also gerade der Weg, mit dem man es NICHT macht und schon gar nciht dann
damit wirbt, daß das programm gegen prellen immun ist.
Allerdings ist in dem Programm der richtige Weg immerhin als Option
drin, bloss woher soll der Leser das wissen daß du den meinst und nur
den ?
Über die Defizite warst du dir 2013 offenbar im Klaren (2015 hast du sie
dann in diesme Thread einfach wieder vergessen):
"die nicht prellen. Falls dies nicht garantiert werden
kann, können die Eingangssignale per externen 2 x D-FF synchronisiert
werden."
(Nein, NIEMAND will das, 1 74HC74 extra spendieren weil das Programm zu
dumm geschrieben wurde) aber die richtige Auswertung war da nur eine
Option:
"Ferner kann die Signalerfassung auch intern synchronisiert werden
(Timer0"
Michael B. schrieb:> Über die Defizite warst du dir 2013 offenbar im Klaren (2015 hast du sie> dann in diesme Thread einfach wieder vergessen):> (Nein, NIEMAND will das, 1 74HC74 extra spendieren weil das Programm zu> dumm geschrieben wurde) aber die richtige Auswertung war da nur eine> Option:
100% Zustimmung
ehrlich wenn dann würde ich dem Tiny25 PeDas Routine einplanzen wenn es
unbedingt ein extra µC werden soll.
Ausserdem ist der Tiny als I2C nicht OC was mixed voltage auch nicht
vereinfacht, OK mit 8 MHz programmiert ist er wenigstens 8 MHz und 16
MHz kompatibel.
Die hier gezeigten Schaltungen und Programme von mir sind getestet,
teilweise in Stückzahlen praktisch erprobt und funktionieren. Ernsthafte
Fragen diesbezüglich beantworte ich gerne.
Dummen Leuten aber laufe ich nicht hinterher.
M.N. schrieb:> Harald schrieb:>> Interrupts sind im Allgemeinen zur Auswertung von Drehgebern nicht zu>> empfehlen.>> Du hättest Dir das Programm überhaupt einmal ansehen soll; die> einleitende Beschreibung hätte ja schon gereicht.> Dann hättest du (vielleicht) gemerkt, daß Deine Antwort Käse ist.
Meine Antwort ist kein Käse, sie sachlich und begründet. Es ist einfach
bedauerlich, dass du es nicht schaffst ebenso sachlich zu antworten.
M.N. schrieb:> Die hier gezeigten Schaltungen und Programme von mir sind getestet
Ja, das sagt der Hersteller meines Autoradios auch.
Du hast eigentlich viele schöne Module erstellt, die für manchmal
nachgefragte spezielle Lösungen eine gute Basis wären für die es keine
Lösung von der Stange gibt die aber nur eine leichte Abwandlung durch
Anpassung der Software oder Ergänzung der Elektronik brauchen,
aber deine pentetrante Weigerung, den Stand der Technik zu folgen, sei
es bei Vorwiderständen von LEDs oder eben der richtigen
Drehgeberausleseroutine, macht es schwer, dich und deine Module zu
empfehlen.
Es würde dich NICHTS kosten, beim Drehgeber einfach die andere "PeDa"
Routine als Default einzuschalten "bis 100000 Striche/s per
entprellender Auswertung, auf Wunsch bis 120000 Striche/s mit
Flankeninterrupt bei prellfreien Drehgebern umschaltbar', bei CD4094 die
Platine mit den SMD Vorwiderständen zu nutzen 'wer nicht will kann 0 Ohm
einlöten', ausser daß du über deine eigene völlig verrannte
Selbstüberzeugung "in meinem Experiment klappte das aber" springen
müsstest, und dir einfach mal sagst: "Die anderen werden schon wissen
warum sie ständig darauf hinweisen daß das besser ist, dort liegt
schliesslich millionenfache Erfahrung auch unter schwierigen Bedingungen
'handy neben optischem Drehgeber' und nachgemessen '360.0 Grad gedreht,
kamen wirklich 1024 bei raus' statt bloss ausprobiert vor".
Aber so stehst du dir selbst im Weg, bastelst auf chinesischem Niveau
(das können die aber billiger und besser), und kommst nicht zu den
relevanten Kriterien für Marktfähigkeit, Module mit bestandenem EMV+LVD
Test und RoHS/UL Nachweis. Schade eigentlich.
Die neueren ATtiny2xx, 4xx, 8xx haben ein Hardware TWI, was das
merkwürdige USI ersetzt. Um dies zu testen, habe ich die ursprügliche
Schaltung angepaßt und das Programm umgeschrieben.
Ferner gibt es ein kleines Arduino-Programm zum Auslesen des
Zählerstandes, was den Einstieg erleichtert und angepaßt werden kann.
http://www.mino-elektronik.de/mt12_iic/mt12_iic.htm#qcnt_tiny202
Mi N. schrieb:> Die neueren ATtiny2xx, 4xx, 8xx haben ein Hardware TWI,...
Und was ist dann daran besser? Garnichts.
Dieses Projekt war schon vor 5 Jahren einfach zu kurz gesprungen.
Damit der Chip, der dieses Ding benutzen will, herauskriegen kann, ob
tatsächlich etwas Neues anliegt oder nicht, muß er jedesmal per I2C das
Ding pollen. Das ist ja noch umständlicher, als wenn er die DG_Signale
selbst auswerten würde.
Was hier fehlt, ist ein Status-Ausgang, der anzeigt, ob neue Daten zum
Abholen bereitstehen oder nicht.
W.S.
Mensch W.S., was ist los? Hat man Dir Deinen Rotwein weggehamstert?
W.S. schrieb:> Das ist ja noch umständlicher, als wenn er die DG_Signale> selbst auswerten würde.
Du kennst sicherlich nur manuelle Drehgeber, die für 10 ct über den
Ladentisch gehen. Dem zuzusehen, sieht ja sicherlich recht lustig aus.
Aber es gibt auch Inkrementalgeber, die an ihren Ausgängen
Quadratursignale bis in den 100 kHz Bereich liefern. Und das macht dann
Dein "Chip" nicht mehr so locker nebenbei. Dank IIC-Schnittstelle kann
man einen oder bei Bedarf deutlich mehr dieser Dekoder an einen lahmen
µC anschließen. Kostenpunkt pro Kanal < 1 Euro.
Wer einen Statusausgang für Zähleränderungen braucht, programmiert ihn
sich dazu.
Mi N. schrieb:> Und das macht dann> Dein "Chip" nicht mehr so locker nebenbei.
Wenn man denn schon eine Motorwelle o.ä. auf solche Weise abtasten will,
dann nimmt man dafür einen geeigneten µC - und der hat die dazu passende
Elektronik bereits drin. In Hardware und schnell. Also "mein" Chip macht
das mit links.
Und Rotwein ist grad noch genug da.
Du weißt doch, was der ALLERSCHLIMMSTE Alptraum von John Steed war? -
daß kein Sekt mehr im Keller ist.
W.S.
John war zwar interessant, aber Emma eben interessanter ;-)
Keine Frage, daß Du und Dein "Chip" soetwas können. Aber was sagst Du
z.B. einem Maschinenbauer, der einen inkrem. Messtaster an einen Arduino
anschließen möchte?
Zeigt doch ein Beispiel für Deinen "Chip", was für sie/ihn geeignet
wäre. Und damit unsere Freunde hier nicht einschlafen, am besten mit
flankengetriggerten Interrupts ;-)
Mi N. schrieb:> Aber was sagst Du> z.B. einem Maschinenbauer, der einen inkrem. Messtaster an einen Arduino> anschließen möchte?
Ich sage dem, daß er da eine versierte Fachfirma engagieren soll. Auf
die Idee, als Maschinenbauer nen Arduino überhaupt in die nähere Wahl
zu nehmen, kommt nur ein grottenschlechter Maschinenbauer.
W.S.
Zitat W.S. 25-04-2020:
"Aber es ist wohl heutzutage so, daß die allermeisten Leute nicht selber
etwas lernen wollen, sondern Ergebnisse ohne eigene Anstrengung haben
wollen."
Und wenn einer etwas lernen möchte kommt dann:
W.S. schrieb:> Ich sage dem, daß er da eine versierte Fachfirma engagieren soll.
Und ich dachte, Du würdest ihm weiterhelfen. Dein "Chip" ist doch ein
Wunderding, wenn ich Dich richtig verstanden habe.
Nur weil jemand Maschinenbau macht, ist er noch lange nicht unfähig,
sich Programmieren anzueigenen. Ich kenne etliche Gegenbeispiele!
Und wenn es ein Arduino ist, dann ist das ein guter, überschaubarer
Einstieg.