Forum: Compiler & IDEs Drehencoder auswerten


von criztalize (Gast)


Lesenswert?

Hallo,

ich möchte ein kleines  Interface bauen und möchte dazu einen 
Drehencoder/Drehgeber verwenden.
Mir ist das gnaze bis jetzt auch teilweise gelungen dank Peter 
Dannegger's Hilfe im Wiki womit ich den Drehgeber präzise auswerten 
konnte. Allerdings hing dort der Drehgeber direkt am Prozessor.
Ich möchte nun jedoch ein Display und Drehegber über I²C bzw. TWI 
ansprechen. Als Portexpander nutze ich einen PCF8574.
Einen vorgefertigten Code um das Display anzusprechen sowie grundlegende 
I²C/TWI Funktionen nutze ich von Peter 
fleury.(http://homepage.hispeed.ch/peterfleury/avr-software.html )
Das Display lässt sich ohne jegliche Probleme ansprechen d.h. die Texte 
sind schnell da.
Das Problem was ich nun habe ist das sich der Drehgeber nicht auswerten 
lässt bzw. ich nicht weiß wie ich den PCF8574 richtig nutzen kann.
Ich hatte mir das so vorgestellt das ich den PCF ganz normal abfragen 
kann wie eben beim Prozessor.
Ansonsten gab es im restlichen Internet auch nicht wirklich viele Infos 
geschweige denn ein vernünftiges Tutorial un nun stehe ich in einer 
Sackgasse.
Wie kann ich festlegen weclhes Device Master/Slave ist ?
Wie kann ich festlegen welche Pins vom PCF Eingang / Ausgang ist ?
Wie kann funktioniert das ganze denn überhaupt grundlegend ?

usw.

Ich würde mich freuen wenn ihr mir vielleicht bei meinem Problem 
weiterhelfen könntet.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

criztalize schrieb:
> Ich hatte mir das so vorgestellt das ich den PCF ganz
> normal abfragen kann wie eben beim Prozessor.

So in etwa funktioniert das ja auch, wenn Du das I2C-Protokoll in den 
Griff bekommst. Anstelle des Lesens von einem I/O-Port des µCs musst Du 
hier halt den Eingang des Portexpanders über I2C lesen, die restliche 
Behandlung ist identisch.

> Wie kann ich festlegen weclhes Device Master/Slave ist ?

Das gibt die Hardware vor; Dein µC ist Master, der Portexpander ist 
Slave.

> Wie kann ich festlegen welche Pins vom PCF Eingang / Ausgang ist ?

Steht in dessem Datenblatt.

von Bronco (Gast)


Lesenswert?

Wenn ich Dich richtig verstehe, willst Du den Drehgeber über die Ports 
des PCA8574 einlesen, oder?
Hast Du bedacht, daß die Abtastrate dieser Ports durch die 
I2C-Verbindung begrenzt ist?

Angenommen, Du taktest den Bus mit 400kHz (Maximum für den PCA8574). Du 
brauchst pro Telegram ca. 20 Bitzeiten (1x Start + 9x Slave-Adresse + 9x 
Portinhalt + 1x Stop).
Dann bekommst Du im allerbesten Fall eine Abtastrate von 50us (20kHz) 
hin. Und auch nur, wenn der I2C-Bus alleine dem PCA8574 gehört (ohne 
weitere Slaves) und immer mit höchster Priorität bearbeitet wird. Reicht 
Dir das?

von criztalize (Gast)


Lesenswert?

Genau Bronco :)
Ich weiß nicht ob das reicht aber ich dachte das würde so funktionieren. 
In der tat hatte ich es mal kurzzeitig geschafft Werte auszulesen und 
diese dann an Peter's Funktion weiterzugeben jedoch war die Auswertung 
dann ziemlich Bananne: ich hab meisten nur Stichpunktartig werte 
bekommen. Ich dachte eben das ich irgendwas falsch gemacht hatte.
An dem einen I²C Port hängt ja auch das Display und direkt dahinter der 
Drehgeber.
Derzeit läuft der PCF im normalen Modus.

von spontan (Gast)


Lesenswert?

Du hat die Frage von Bronco nicht verstanden.

Bronco schrieb:
>Dann bekommst Du im allerbesten Fall eine Abtastrate von 50us (20kHz)
>hin.

criztalize schrieb:
>Ich weiß nicht ob das reicht aber ich dachte das würde so funktionieren.


Bronco meint ob die Abtastrate ausreichend ist für Deine Anwendung. Der 
Hintergrund ist, was bewegt den Drehgeber?

Ein Motor? So kann es ja nach Geschwindigkeit schon eng werden.
Ein Mensch? Dann ist die erzielbare Abtastrate ausreichend. Dann hängt 
alles nur noch von der Einbindung im Main ab.

von criztalize (Gast)


Lesenswert?

Achso.
Ja also natürlich wird der von einem Mensch bedient sprich der dient 
dazu um durch ein Menü zu gehen.
Dann dürfte es von der Geschwindkeit ja passen.

> den Eingang des Portexpanders über I2C lesen

Gibt es da evtl. Beispielcodes ?

von Peter D. (peda)


Lesenswert?

Der I2C ist nicht geeignet für hohe Datenraten.
Bei 1ms Abtastrate des Encoders hast Du schon 20% CPU-Last.
Und Du hast das Problem, daß nur eine Instanz des I2C laufen darf.

Wenn es unbedingt I2C sein muß, dann nimm einen 2.MC für LCD und Encoder 
als I2C-Slave, z.B. ATtiny24.


Peter

von criztalize (Gast)


Lesenswert?

Da nur eine Instanz laufen darf und ständig per Timer ausgelesen wird 
kann das ganze doch gar nicht laufen oder ?
Sprich LCD & Encoder gleichzeitig an einem Bus.
Dein Vorschlag wäre also jetzt einen Attiny zu nehmen und Encoder + LCD 
direkt an den tiny zu hängen ?
Und der wird dann wiederum per I²C an meinen Atmega rangehängt ?

von criztalize (Gast)


Lesenswert?

entschuldigt- der atmega macht das lcd und der tiny den drehehncoder.
So wars gemeint :)

von Peter D. (peda)


Lesenswert?

criztalize schrieb:
> Dein Vorschlag wäre also jetzt einen Attiny zu nehmen und Encoder + LCD
> direkt an den tiny zu hängen ?
> Und der wird dann wiederum per I²C an meinen Atmega rangehängt ?

Genau so.
Der ATtiny kümmert sich um Encoder und LCD und entlastet damit den I2C 
und die Master-CPU.
ATtiny lesen: Encoder als 32bit Wert
ATtiny schreiben: Position + Text der LCD-Ausgabe


Peter

von criztalize (Gast)


Lesenswert?

Jetzt bin ich etwas verwirrt.
Der Attiny tastet den drehgeber ab gibt das dem Atmega, der macht das 
menü und gibt den zu schreibenden text dem attiny der wiederum das LCD 
ansteuert ?
Oder war das jetzt so gemeint das der Attiny das gesamte Menü macht 
sprich alles am Attiny hängt und der einfach nur dem Atmega per I2c sagt 
(per int wert) was jetzt gemacht wird. der wiederum gibt dann per I2c 
das ergenis zurück und der tiny schreibt das dann einfach oder wie ?

von Bronco (Gast)


Lesenswert?

Der Punkt ist:
Das Abfragen des Drehgebers erfordert eine mit der Drehzahl steigende 
Rechnleistung. Wenn Du den Drehgeber ganz einfach an Portpins anschließt 
und Pin-Interrupts verwendest, um die Flanken zu erkennen, steigt die 
Interrupt-Last mit der Drehzahl.
Die Frage ist:
Kannst Du in Deinem AVR soviel Interrupt-Last vertragen oder nicht?
Wenn ja: Häng den Encoder direkt an Port-Pins.
Wenn nein: Könntest Du z.B. einen zweiten, kleinen AVR spendieren, der 
nichts anderes tut, als den Drehgeber auszuwerten und dessen Zustand 
"mundgerecht" an den Haupt-AVR zu melden.

von criztalize (Gast)


Lesenswert?

Ich würde es natürlich eig auch ganz gerne so wie von euch vorgeschlagen 
machen aber ich MUSS das so machen weil mir das so vorgesetzt wurde.
Sprich ich muss das ding irgendwie mit I2C auswerten daneben muss aber 
auch noch das LCD funktionieren und ich darf rein gar nichts an der 
Hardware ändern.
Wie ich das mache : Ich habe keine Ahnung.

von Marwin (Gast)


Lesenswert?

criztalize schrieb:
> ich MUSS das so machen weil mir das so vorgesetzt wurde.

Komisch, der Thread fing damit an, dass du was bauen moechtest. Die 
Frage ist nun, wie viel Hilfe du noch bekommst, wenn die Leute merken, 
dass du sie belügst.

von Peter D. (peda)


Lesenswert?

Du kannst natürlich einen ATtiny25 nehmen und damit nur den Encoder 
auslesen und über I2C abfragen.

Ich dachte nur, daß man den Haupt-MC auch etwas vom LCD entlasten kann, 
also die Delays, E-Pin wackeln, Nibble Zerlegung usw.
Der ATtiny24 wäre mit dem Encoder ja nicht ausgelastet.


Peter

von Bronco (Gast)


Lesenswert?

criztalize schrieb:
> Sprich ich muss das ding irgendwie mit I2C auswerten daneben muss aber
> auch noch das LCD funktionieren und ich darf rein gar nichts an der
> Hardware ändern.

Wenn die Hardware fest steht, ist es eigentlich ganz einfach:
1. Du fragst die Portpins des PCA8574 in einem festen Zeitraster ab.
Dieses Zeitraster wird dadurch festgelegt, was Du in der Software 
realisieren kannst, d.h. wenn noch ein LCD und ein EEPROM und eine RTC 
an diesem I2C-Bus hängen und Dein AVR noch wichtigere Dinge zu tun hat, 
dann kommst Du am Ende eben nur auf z.B. 100Hz. Wichtig ist, daß die 
Abfrage immer genau in diesem Zeitraster erfolgt, also nicht schwankt.
2. Diese 100Hz legen dann fest, welche Drehzahl Du am Encoder maximal 
erkennen kannst. D.h. wird der Encoder schneller gedreht, gehen Dir 
Flanken verloren und Du erkennst die Drehung gar nicht oder falsch. Aber 
das kannst Du nicht ändern.
3. Dann kannst Du festlegen, daß der Encoder nicht schneller gedreht 
werden darf. Wenn das nicht akzeptiert wird (von Deinem Auftraggeber), 
soll er Dir ein andere Hardware geben. Er kann verlangen, daß Du alles 
tust, um diese Abtastung möglichst schnell zu machen, aber Du kannst 
nicht die Grenzen der Hardware sprengen.

von criztalize (Gast)


Lesenswert?

Marwin schrieb:
> criztalize schrieb:
>> ich MUSS das so machen weil mir das so vorgesetzt wurde.
>
> Komisch, der Thread fing damit an, dass du was bauen moechtest. Die
> Frage ist nun, wie viel Hilfe du noch bekommst, wenn die Leute merken,
> dass du sie belügst.

Weil man mir dann wohl gar keine Lösungvorschläge gegeben hätte, wenn 
das ganze so nicht geht und ich hätte dann doch lieber mehrere 
verschiedene Lösungswege die ich dann auch auf andere sachen anwenden 
kann.
Ja aber ich gebe zu es war ein Fehler. Mir selber geht es nur um den 
Lern Erfolg, weil mir das eigentlich auch Spaß macht.

Peter Dannegger schrieb:
> Du kannst natürlich einen ATtiny25 nehmen und damit nur den Encoder
> auslesen und über I2C abfragen.

Das Problem ist das alles über den einen MC erfolgen soll d.h. über I2C 
auch den Drehgeber abtasten und das LCD soll auch noch mit texten 
gefüttert werden ebenfalls über I2C.
Das ganze funktioniert über Taster zwar aber anscheinend gibt es 
irgendwie beim abtasten über I2C Probleme.

> Ich dachte nur, daß man den Haupt-MC auch etwas vom LCD entlasten kann,
> also die Delays, E-Pin wackeln, Nibble Zerlegung usw.
> Der ATtiny24 wäre mit dem Encoder ja nicht ausgelastet.
>
>
> Peter

Ich finde den Weg nicht schlecht aber mir sind die Hände gebunden.

von Uwe (de0508)


Lesenswert?

Guten Morgen,

criztalize schrieb:
> Ich finde den Weg nicht schlecht aber mir sind die Hände gebunden.

dann müsstest Du alle führ und wieder darlegen und entsprechend Deiner 
Beurteilung des Problems und seiner Lösung einen Vorschlag unterbreiten.

Entweder man entspricht diesem oder anderenfalls müsstest Du Dich aus 
der Problemlösung zurückziehen.
Da Du dann unter diesen ursprünglichen Bedingungen keine Lösung 
anbieten könntest.

von criztalize (Gast)


Lesenswert?

Danke schonmal an Bronco.
Aber wie genau farge ich die Poortpins denn ab bzw setze ich welche ?
Mit der send byte funktion kommt nichts raus sprich ich kann so nichtmal 
ein einfaches LED Modul ansprechen.
Wie soll das dann mit der read_byte funktion dann klappen ?

von Bronco (Gast)


Lesenswert?

criztalize schrieb:
> Aber wie genau farge ich die Poortpins denn ab bzw setze ich welche ?
Daß wir die Probleme Deines Konzepts diskutieren, ist eine Sache.
Aber Deine Hausaufgaben mußt Du schon alleine machen!

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.