mikrocontroller.net

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


Autor: M. N. (Gast)
Datum:
Angehängte Dateien:

Bewertung
1 lesenswert
nicht 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"

Autor: Bert (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Harald (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: M.N. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Michael B. (laberkopp)
Datum:

Bewertung
1 lesenswert
nicht 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"

Autor: Joachim B. (jar)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: M.N. (Gast)
Datum:

Bewertung
-1 lesenswert
nicht 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.

Autor: Harald (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Michael B. (laberkopp)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

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

Wichtige Regeln - erst lesen, dann posten!

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

Formatierung (mehr Informationen...)

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




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

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