Forum: Projekte & Code mini Quadraturdekoder + 32 Bit Zähler + TWI, Attiny25


von M. N. (Gast)


Angehängte Dateien:

Lesenswert?

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"

von Bert (Gast)


Lesenswert?

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?

von Harald (Gast)


Lesenswert?

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

von M.N. (Gast)


Lesenswert?

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.

von Michael B. (laberkopp)


Lesenswert?

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"

von Joachim B. (jar)


Lesenswert?

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.

von M.N. (Gast)


Lesenswert?

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.

von Harald (Gast)


Lesenswert?

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.

von Michael B. (laberkopp)


Lesenswert?

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.

von Mi N. (msx)


Lesenswert?

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

von W.S. (Gast)


Lesenswert?

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.

von Mi N. (msx)


Lesenswert?

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.

von W.S. (Gast)


Lesenswert?

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.

von Mi N. (msx)


Lesenswert?

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 ;-)

von W.S. (Gast)


Lesenswert?

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.

von Mi N. (msx)


Lesenswert?

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.

: Bearbeitet durch User
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.