Hallo liebe Leute ich habe eine Frage bezüglich des Schieberegisters. Ich verwende ATmega162 für meine bachelorarbeit "Adaptierung von Inkrementalgebern durch eine Zusatzschaltung zu Absolutgebern" Der Geber hat eine Scheibe mit 360 Strichzahl, Code: Incremental, optisch. Nachdem ich die Rechteckimpulse mittels µC Atmega162 (Timer-Interrupt) eingelesen und ausgewertet, möchte ich die ausgearbeitete Eingangsimpulse an eine SSI Schnittstelle bereitstellen. Dafür nutze ich die schon integrierte SPI-Funktion von µC aus. das Problem liegt daran, dass der Schieberegister nur 8-Bits Breit ist, während die Bits die zu übertragen sind, liegen zwischen 8 und 9 Bitt (tja pro Um. 360 schlitze). Wie findet ihr wenn ich sie auf zweimal übertrage, indem ich eine Vereinbarung mit dem Empfänger abschließe, dass die erste Schiebezyklus nur einen Teil von Nutzdate beinhaltet und er soll mit dem zweiten Schiebezyklus den Rest abholen???? oder findet es besser, wenn ich die Lösung von Kaskadierbaren Schieberegister adaptiere? oder ihr habt bessere Idee??? Vielen Danke für euren Ratschlag
Kmrish Akram schrieb: > Wie findet ihr wenn ich sie auf zweimal übertrage, indem ich eine > Vereinbarung mit dem Empfänger abschließe, dass die erste Schiebezyklus > nur einen Teil von Nutzdate beinhaltet und er soll mit dem zweiten > Schiebezyklus den Rest abholen???? Die Vereinbarung sollte schon längst festgelegt sein, und zwar in den Spezifikationen deines Geräts. Denn es sollte beim Programmieren schon klar sein, wie und mit welchen Protokoll die Daten aus der Schaltung übertragen werden. Falls nicht, wär mein Vorschlag, das Signal auf 16 Bit (als 2 Byte) aufzupumpen, um schön im System zu bleiben.
Ich würde auch 2 Register nehmen. Kosten doch nichts und ist die sauberste Lösung, wenn Du diese Daten wirklich parallel dem Empfänger mitteilen willst. Die unschöne Alternative wäre ein zusätzlicher PortPin als Bit 8. Aber dann kannst Du rein technisch die Daten nie synchron ausgeben.
Danke für die schnelle Antwort das habe ich mir auch gedacht, dass die einfachste Lösung wäre die Bits auf 16-Bit Register aufzupumpen. Im Datenanhang findet man einen Schaltplan, findet ihr die Beschaltung der Zwei Bausteine (Max1486) korrekt? oder soll ich was noch dazu einfügen? Weiterhin steht im Datasheet, dass der SPDR(SPI Data Register)den Fileregister mit dem Schieberegister verbindet. Ausgehend von dieser Information soll ich ein Software schreiben, womit dass SPDR den Fileregister mit deren neuen zusätzlichen Max1486 verbindet. weil ja von nun an der Schieberegister ist nicht was in dem µC integriert ist, sonder was extern eingeschlossene Schieberegister(Max1486). Die Frage, weißt jemand wie kann ich sowas realisieren? Danke für eure Hilfe
Keine Ahnung, was du genau machen willst, aber in der Schaltung im Anhang gibt es kein Max1486. Und warum brauchst du die 74HC165? Der Atmega162 hat doch genügend Ports, um das direkt am Microcontroller ausgeben zu können?
Alles schön und gut, aber was soll das? Warum klennst du nicht die Pins direkt vom AVR an den Bus? MfG Falk
Hallo von Anfang an habe ich gesagt, ich möchte die Datenbits an eine SSI Schnittstelle zur Verfügung stellen. Da der Schieberegister des Mikrokontrollers nur 8 Bitbreit ist, wurde mir empfohlen, einen kaskadierbaren Schieberegister( die sind 74HC165D) zu verwenden. { Weiterhin steht im Datasheet, dass der SPDR(SPI Data Register)den Fileregister mit dem Schieberegister verbindet. Ausgehend von dieser Information soll ich ein Software schreiben, womit dass SPDR den Fileregister mit deren neuen zusätzlichen Max1486 verbindet. weil ja von nun an der Schieberegister ist nicht was in dem µC integriert ist, sonder was extern eingeschlossene Schieberegister(Max1486). Die Frage, weißt jemand wie kann ich sowas realisieren? } undsomit sind die chips (74HC165D)von nun an der Schieberegister des µC. Ist das Korrekt, wenn nict warum? und was kann man anders anbieten?
C-Proger schrieb: > Warum nimmst du überhaupt ein Timer-Interupt? Timer-Interrupt ist in diesem Fall(Drehimpulsgeber) besser als Externe-Interrupt.
Falk Brunner schrieb: > Alles schön und gut, aber was soll das? Warum klennst du nicht die Pins > direkt vom AVR an den Bus? deine Frage habe ich nicht verstanden,sorry! Die lins von 15 bis 23 stellen die Datenbits parallel dar.diese Sind eigentlich die mögliche Zustände des Gebers. > > MfG > Falk
Frank Buss schrieb: > Keine Ahnung, was du genau machen willst, aber in der Schaltung im > Anhang gibt es kein Max1486. Und warum brauchst du die 74HC165? Der > Atmega162 hat doch genügend Ports, um das direkt am Microcontroller > ausgeben zu können? Ja schon sie hat genug Ports, aber bezüglich spi/ssi kann sie nur 8-Bit zur Verfügung stellen nicht mehr
Hi >Ja schon sie hat genug Ports, aber bezüglich spi/ssi kann sie nur 8-Bit >zur Verfügung stellen nicht mehr Na und, 2x8 Bit sind auch 16 Bit. Aber vielleicht solltest du mal erklären, welche Daten mit welcher Schnittstelle wohin gesendet werden soll. Hier scheint einige Konfusion zu bestehen. MfG Spess
Spess53 schrieb: > Hi > >>Ja schon sie hat genug Ports, aber bezüglich spi/ssi kann sie nur 8-Bit >>zur Verfügung stellen nicht mehr > > Na und, 2x8 Bit sind auch 16 Bit. Aber vielleicht solltest du mal > erklären, welche Daten mit welcher Schnittstelle wohin gesendet werden > soll. Hier scheint einige Konfusion zu bestehen. Hallo erstmal Danke für deine Antwort. ja schon, aber in dem Fall brauche ich zwei schiebezyklus: die erste für die erste 8-Bit und die Zwiete für den Rest. oder nicht? ich kann die ganze Datenbits nicht in einzige Schiebetzyklus rausschicken oder? weil ja der Register nur für 8-Bit geeignet ist, nicht mehr. deswegen taucht diese Idee(Ersetzen des Shift-register von µC durch kaskadierbare Schieberegister) auf. Dies habe ich von folgenden Link verstanden: http://www.mikrocontroller.net/articles/AVR-Tutorial:_Schieberegister habe ich Recht?
Hi >Dies habe ich von folgenden Link verstanden: >http://www.mikrocontroller.net/articles/AVR-Tutori... >habe ich Recht? Nein. Du willst eine 16Bit Parallel-nach-Seriell-Wandlung, dort ist aber eine Seriell-nach-Parallel-Wandlung beschrieben (falls ich das richtig verstanden habe). >ja schon, aber in dem Fall brauche ich zwei schiebezyklus: die erste für >die erste 8-Bit und die Zwiete für den Rest. oder nicht? ich kann die >ganze Datenbits nicht in einzige Schiebetzyklus rausschicken oder? weil >ja der Register nur für 8-Bit geeignet ist, nicht mehr. Man kann eine SPI beliebiger Länge auch in Software realisieren. > Aber vielleicht solltest du mal >erklären, welche Daten mit welcher Schnittstelle wohin gesendet werden >soll. Hier scheint einige Konfusion zu bestehen. Beantworte erst mal die Frage. MfG Spess
Spess53 schrieb: > Hi >> Aber vielleicht solltest du mal >>erklären, welche Daten mit welcher Schnittstelle wohin gesendet werden >>soll. Hier scheint einige Konfusion zu bestehen. > > Beantworte erst mal die Frage. Hallo Welche Daten Die Drehimpulse des Gebers(Inkrem. Opt)sind meine Daten Mit welcher Schnittstelle Die Schnittstelle ist SSI; Welche meiner Schaltung mit anderen Peripheries verbindet. wohin gesendet wohin? wurde nicht festgelegt, aber wir sind davon ausgegangen, dass die meisten Absolut-Geber Lassen sich mit anderen Peripherie über SSI verbinden, und weil der Ziel der Schaltung die Adaptierung Inkr.-Geber in Absolutgeber ist, wurde festgelegt, dass die Schaltung über SSI verfügen sollen.
Hi Ich versuche es mal auf den Punkt zu bringen: Dein Sensor hat eine SSI-Schnittstelle, die du mit einem µC einlesen willst? MfG Spess
Spess53 schrieb: > Ich versuche es mal auf den Punkt zu bringen: Dein Sensor hat eine > SSI-Schnittstelle, die du mit einem µC einlesen willst? Er will einen Inkrementalwertgeber per AVR in einen Absolutwertgeber mit SSI-Schnittstelle verwandeln.
Rudolph schrieb: > Spess53 schrieb: >> Ich versuche es mal auf den Punkt zu bringen: Dein Sensor hat eine >> SSI-Schnittstelle, die du mit einem µC einlesen willst? > > Er will einen Inkrementalwertgeber per AVR in einen Absolutwertgeber mit > SSI-Schnittstelle verwandeln. genau richtig, vollgetroffen.
Wozu dann der Parallel-zu-Seriell-Wandler (man beachte die Reihenfolge), der oben dargestellt wird? Das hat doch alles direkt am Controller Platz, (16x rein) und eine Art Serielle Schnittstelle programmieren die das nach belieben rausrückt sollte doch auch kein großes Thema mehr sein, dann kannst du dir dein "emuliertes Schieberegister" so groß machen wie es dir passt.
Simon K. schrieb: > Was ist das denn bitte für ein Schaltplan? Der von jemandem, der zwar gelesen hat, dass man Schaltplanzeichnungen nicht als JPEG posten soll, aber nicht verstanden hat, warum dem so ist: er hat das JPEG mitsamt den Artefakten danach noch in ein GIF umgewurschtelt. Nun ist es bescheiden zu lesen und auch gleich noch größer als das JPEG war ...
Möglicherweise hat meine Fähigkeit zwischen den Zeilen zu lesen nachgelassen oder ich bin noch benebelt vom Rutsch ins neue Jahr, aber ich kann mir beim besten Willen keinen Reim darauf machen, was die beiden 165 in der Schaltung machen sollen. kmrish: Das Schieberegister, welches du für eine SSI brauchst, wird in Software realisiert! Da existiert keine Hardware dafür!
> kmrish: Das Schieberegister, welches du für eine SSI brauchst, wird in > Software realisiert! Da existiert keine Hardware dafür! HALLO ich habe mir folgendes vor. Sobald die fallende Flanke erfasst ist, liest der MATR die SPI-Daten ein. Der MASTR liest zuerst der MSB und endet mit LSB. Die Datenbits werden wie folgendes aufgeteilt: Es wird pro Umdrehung 2-paket jeweils 8-Bits gesendet. Paket-1: Bit-1: Start Bit-2: Direktion Zustand Richtung 0 Rechts 1 Links Bit-3 bis 7:Impulszahl Bit-8: Ende Paket-2: Bit-1 bis 2: Start Bit-3: Direktion Bit- 4 bis 7: Impulszahl Bit-8: Ende was meint ihr?
Kmrish Akram schrieb: > was meint ihr? Das es immer unverständlicher wird, was du da eigentlich bauen sollst/willst Fragen wir doch einmal so: welchen Geber verwedest du eigentlich. Villeicht übersehen wir da ja auch etwas. Dein Mega: Ist der Master oder ist der Client am SPI? Meinem Verständnis nach, muss er Client sein. d.h. der Mega zählt die Impulse, summiert sie auf wobei er rechts/links natürlich berücksichtigt und auf Anfrage vom Master gibt er den aktuellen Zählerstand über SPI bekannt. So habe ich deine Aufgabenstellung im Eröffnungsposting aufgefasst. Aber wie gesagt: heute scheint nicht mein großer Tag im raten zu sein.
HALLO Karl heinz > Das es immer unverständlicher wird, was du da eigentlich bauen > sollst/willst das macht mich sehr traurig, wenn ich meine Frage unverständlich stelle. wie kann ich die Frage noch deutlicher stellen? Bitte helfe mir:) !!! > Fragen wir doch einmal so: welchen Geber verwedest du eigentlich. > Villeicht übersehen wir da ja auch etwas. Panelcoder TYP PC9 (Auflösung 360; Impulsfrequenz max.200KHz) > > > Dein Mega: Ist der Master oder ist der Client am SPI? SLAVE-MODE > > Meinem Verständnis nach, muss er Client sein. d.h. der Mega zählt die > Impulse, summiert sie auf wobei er rechts/links natürlich berücksichtigt > und auf Anfrage vom Master gibt er den aktuellen Zählerstand über SPI > bekannt. Richtig > > So habe ich deine Aufgabenstellung im Eröffnungsposting aufgefasst. Aber > wie gesagt: heute scheint nicht mein großer Tag im raten zu sein. hmmmm schade
Kmrish Akram schrieb: >> Dein Mega: Ist der Master oder ist der Client am SPI? > SLAVE-MODE Also doch. Was faselst du dann 3 Postings weiter oben vom Master? Der interessiert doch niemanden. Dein Mega muss auf Anfrage den aktuellen Zählerstand rausrücken. Da interessiert kein links/rechts oder sonst was. Zählerstand! Und nein, der CLient sendet von sich aus gar nichts! Auch nicht bei jeder Umdrehung. Der wartet bis er vom Master gefragt wird.
@ Kmrish Akram (kmrish) >> Dein Mega: Ist der Master oder ist der Client am SPI? >SLAVE-MODE Dann ist dein Ansatz mit dem EXTERNEN Schieberegistern ala 74HC165 untauglich. Dein AVR kann ohne Zusatzaufwand SPI Slave sein. Siehe Datenblatt. Allerdings kann er immer nur 8 Bit/Byte übertragen, 9 Bit geht nicht. Muss man 16 Bit nehmen und halt die oberen 7 Bit ungenutzt lassen. Wenn es WIRKLICH 9 Bit sein müssen, muss man das Ganze in Software nachbilden und "per Hand" sprich CPU raustakten. Das ist aber deutlich langsamer als die verwendung des SPI-Moduls im AVR. Eine Alternative wäre das USI-Modul in einigen AVRs, dort kann man relativ schnell beliebige Bitbreiten ausgeben. Ich hoffe der Nebel lichtet sich. Siehe auch Drehgeber MFG Falk
Kmrish, ich glaube, du hast nicht verstanden, was Du überhaupt machen sollst / willst. Und das ganze wird dann deine Bachelorarbeit? Für "Adaptierung von Inkrementalgebern durch eine Zusatzschaltung zu Absolutgebern" bekommt man bereits einen Bachelor? Nun gut, wenn es denn so ist. Um es der allgemeinen Verunsicherung hier mal Herr zu werden, versuche ich deine Anforderungen mal klarzustellen: Dein Problem bezieht sich nur auf die Ausgabe eines Wertes, der sich im Bereich 0..360 befindet. Die Eingabe hast Du ja bereits fertig und ist somit nicht Teil der Problemstellung. Du weißt, dass Du für "360" 9 Bit brauchst, die über eine serielle Schnittstelle (SSI) nach außen geführt werden. Du hast im Datenblatt gelesen, dass dein µC eine solche Schnittstelle hat, diese aber nur 8 Bit breit ist. Somit willst Du eine externes Schieberegister verwenden. Das ist natürlich totaler Blödsinn! In der endgültigen Beschaltung holst sich ein weiteres Device die Daten von deinem Kontroller seriell ab. Hierzu liefert dieser externe Host deinem µC ein Clock-Signal. Deine Aufgabe ist es nun, die Nutzdaten über einen Port-Pin dem Host in Abhängigkeit des bereitgestellten Taktes auszugeben. Hierzu brauchst Du KEINE externe Hardware! Die Clock-Leitung vom Host schließt Du an einen Interrupt deines µC an. Innerhalb der Interrupt-Routine legst Du dann jeweils das nächste Bit aus deinem IN SOFTWARE realisierten Schieberegister an einen Port-Pin deiner Wahl! Ein solches Schieberegister sieht z.B. so aus:
1 | uint8_t count; |
2 | uint16_t data; |
3 | ...
|
4 | if (data & 1) |
5 | PORTB |= (1<<PB0); |
6 | else
|
7 | PORTB &= ~(1<<PB0); |
8 | data >>= 1; |
9 | |
10 | if (--count == 0x00) |
11 | {
|
12 | // "aktuellen Zählerwert in data kopieren"
|
13 | // count wieder auf 9 setzen
|
14 | }
|
Natürlich ist das nur ein Beispiel und man muss noch gewisse Dinge zur Synchronisation beachten. Aber das Prinzip sollte klar sein. Fabian
@ Fabian (Gast) >gelesen, dass dein µC eine solche Schnittstelle hat, diese aber nur 8 >Bit breit ist. Somit willst Du eine externes Schieberegister verwenden. >Das ist natürlich totaler Blödsinn! Mit solchen absoluten Aussagen sollte man etwas sparsamer umgehen. Wenn gleich der Ansatz hier in der Tat wenig sinnvoll ist. >Die Clock-Leitung vom Host schließt Du an einen Interrupt deines µC an. Hier wird es schon etwas abwegig. Wenn man per Interrupt auf jedes Bit regaieren will, wird es noch langsamer. >Synchronisation beachten. Aber das Prinzip sollte klar sein. Aus mal eben halbgar hingeworfenen Brocken wird selten etwas klar. MFG Falk
@Falk Ich erwarte von Jemanden, der seine Bachelorarbeit schreibt ein gewisses Grundverständnis. Falk Brunner schrieb: > Hier wird es schon etwas abwegig. Wenn man per Interrupt auf jedes > > Bit regaieren will, wird es noch langsamer. Hab ich irgendwo überlesen, dass die maximale Taktrate spezifiziert wurde?
Kmrish Akram schrieb: > das macht mich sehr traurig, wenn ich meine Frage unverständlich stelle. > wie kann ich die Frage noch deutlicher stellen? Bitte helfe mir:) !!! Mir geht es wie Fabian. Ich denke, du hast nicht mal den Hauch eines Schimmers wie das eigentlich alles funktionieren soll. Und da rede ich jetzt nicht von irgendwelchen Details, die unklar sind, sondern vom Großen und Ganzen. Und da bin ich jetzt irgendwo in einer Zwickmühle. Denn schliesslich sollst du für diese Arbeit einen akademischen Titel erhalten.
@Karl heinz Buchegger (kbuchegg) (Moderator) >Und da bin ich jetzt irgendwo in einer Zwickmühle. Denn schliesslich >sollst du für diese Arbeit einen akademischen Titel erhalten. Bachelor, der Cheeseburger unter den Titeln ;-)
HALLO Karl heinz > Und nein, der CLient sendet von sich aus gar nichts! Auch nicht bei > jeder Umdrehung. Der wartet bis er vom Master gefragt wird. das weiss ich schon, sogar detalierter Vorgehensweise Bei Slave-MODE kann sich das SPI-Interface in folgenden Zuständen befinden: Zustand 1: SS-Pin Logic-High, SCK-Pin Logic-High. Zustand 2: SS-Pin Logic-High, SCK-Pin Logic-Low. Zustand 3: SS-Pin Logic-Low, SCK-Pin Logic-Low. Zustand 1 In diesem Zustand ist die SPI-Einheit passive. Während sich die SPI in diesem Zustand befindet, kann der Inhalt von SPDR (SPI Data Register) aktualisiert werden. SPDR ist ein Schreib/Lesen Register, das zur Datenübertragung zwischen File Register und Schieberegister verwendet wird. Zustand 2 Die SPI tritt In diesem Zustand ein, wenn Kontroller Logik eine fallende Flanke des Taktsignals, welches durch MSTR-CPU generiert wird, erfasst. Vorsicht!!! Die Daten werden NICHT übertragen, wenn der Master über SCK-Leitung einen Impuls schickt, sonder erst wenn der SS-Pin auf Low gesetzt wird. Zustand 3 In diesem Zustand fängt der Slave an, den Inhalt des Schieberegisters dem MSTR zu senden. Sobald die Übertragung eines Bytes vollendet ist, wird ein Ende-Flag (SPIF)gesetzt. Es kann auch so programmiert, dass ein Interrupt ausgelöst wird, solange ein Byte vollständig übertragen wird. Das nächste Byte wird in SPDR geschrieben, erst wenn ein Schiebezyklus beendet. (Wie lang ist das Schiebezyklus) so reich t das? das ist nicht mein PROBLEM
Kmrish Akram schrieb: > das weiss ich schon, sogar detalierter :-) Ich glaube ehrlich gesagt nicht, dass du das WEISST. Du hast es abgeschrieben, aber du weißt nicht was die Worte bedeuten. Der ganze Thread von ganz oben bis zu deinem vorletzten Posting ist eine einzige Aussage: "Ich hab keine Ahnung was ich tue. Bitte helft mir" Das fängt bei der Hardware an und hört bei der Software auf. > das ist nicht mein PROBLEM Und was genau ist dann dein Problem? Nur um das Klrzustellen: Was du machen sollst/musst ist für einen interessierten Nichtakademiker eine Arbeit auf maximal 2 Nachmittage.
Fabian schrieb: > Hab ich irgendwo überlesen, dass die maximale Taktrate spezifiziert > wurde? Zumindest für den Drehgeber hat er maximal 200 kHz geschrieben. Falls das auch per Interrupt ausgewertet wird, kann es je nach Microcontroller schon recht knapp werden. Wenn der Microcontroller aber nichts anderes macht, dann kann man beides, die Drehgeberauswertung und die SPI-Beantwortung, innerhalb einer Endlosschleife, per Statmachine gewürzt, leicht unterbringen. Wären wohl weniger als 30 Zeilen C-Code und könnte bei dem verwendeten Microcontroller bei 16 MHz Systemtakt durchaus bis einige 100 kHz SPI- und Drehgebertakt laufen. Man kann es sich aber auch einfach machen und ein geeignetes Datenformat überlegen, wie man es in zwei Bytes unterbringt, wenn es da keine Vorgaben gibt, denn dann kann man wahrscheinlich die SPI-Hardware verwenden (wobei im Datenblatt habe ich eben nur ein Slave-Beispiel gesehen, wo ein externer Master Daten zum Slave sendet, aber geht bestimmt auch in die andere Richtung). Ich denke ich werde auch mal einen Bachelor machen, wenn das so einfach ist :-)
Kmrish Akram schrieb: > HALLO Karl heinz > Vorgehensweise > Bei Slave-MODE kann sich das SPI-Interface in folgenden Zuständen > befinden: > Zustand 1: SS-Pin Logic-High, SCK-Pin Logic-High. > Zustand 2: SS-Pin Logic-High, SCK-Pin Logic-Low. > Zustand 3: SS-Pin Logic-Low, SCK-Pin Logic-Low. Merkwürdige Beschreibung von SPI. Wenn der SS-Pin auf High ist, dann sind die anderen Pins egal, warum daher in zwei Zustände aufteilen? Könnte man auch noch 4 Zustände draus machen, wenn man die Pegel von MOSI mit einbezieht, aber bringt natürlich nichts :-)
Frank Buss schrieb: > schon recht knapp werden. Wenn der Microcontroller aber nichts anderes > macht, dann kann man beides, die Drehgeberauswertung und die > SPI-Beantwortung, Ich frag sicherheitshalber mal nach Ist SSI eigentlich dasselbe wie SPI? Der TO spricht immer von SSI. Mit diesem Kürzel kann aber weder ich noch Google (ohne jetzt genauer geschaut zu haben) etwas anfangen. Edit: Etwas gefunden Beitrag "SSI Schnittstelle mit SPI realisieren?"
HALLO Falk Brunner Allerdings kann er immer nur 8 Bit/Byte übertragen, 9 Bit > geht nicht. Muss man 16 Bit nehmen und halt die oberen 7 Bit ungenutzt > lassen. JAWOHL;das ist mein Problem, VOLLTREFFER, DANKE DIR!!!!! also ungenutzt bedeutet NULL; > > Wenn es WIRKLICH 9 Bit sein müssen, WAS heisst wenn es wierklich??? das sind ja 360 Pulse, weil ja die Auflösung 360 und dafür muss unbedingt mehr als 8-Bit, ausser ween du mir anders sagst aber bitte mit Beweiss1 muss man das Ganze in Software > nachbilden und "per Hand" sprich CPU raustakten. Das ist aber deutlich > langsamer als die verwendung des SPI-Moduls im AVR. ok und was sagst du wenn ich in dem PROTOKOl Schreibe(ALSO VEREINBARUNG) dass die NUTZDATEN einer Umdrehung werden in zwei Paket jeweils 8-BIT( wie oben bereits gepostet) übertragen??? ist das realisierbar? empfehlst du mir so was zu tun? > > Eine Alternative wäre das USI-Modul in einigen AVRs, dort kann man > relativ schnell beliebige Bitbreiten ausgeben. hmmm auf ander AVR ZU SCHALTEN ist jetzt schon zu Spät. > > Ich hoffe der Nebel lichtet sich. ja schon und ich danke dir > > Siehe auch Drehgeber oh das habe ich oft durchgelesen, glaub mir!!! > > MFG > Falk
Karl heinz Buchegger schrieb: > Ich frag sicherheitshalber mal nach > Ist SSI eigentlich dasselbe wie SPI? > > Der TO spricht immer von SSI. Mit diesem Kürzel kann aber weder ich noch > Google (ohne jetzt genauer geschaut zu haben) etwas anfangen. > > Edit: Etwas gefunden > Beitrag "SSI Schnittstelle mit SPI realisieren?" Interessant ist dabei auch der Wikipedia-Artikel: http://de.wikipedia.org/wiki/Synchron-Serielle_Schnittstelle Ich denke übrigens nicht, daß das mit der SPI-Hardware des ATmega162 machbar ist, da der ja bei Flankenwechsel auf CS anfängt zu übertragen (mit jedem Taktimpuls), wenn ich das richtig verstanden habe. Ist aber auch trivial, sowas in C zu lösen, was aber natürlich auch ein wenig von der maximal benötigten SSI-Taktrate abhängt, die der Fragesteller uns noch nicht verraten hat. SSI per Software wären dann auch mit 9 Bits problemlos möglich, die laut SSI-Protkollbeschreibung erlaubt sind.
@ Kmrish Akram (kmrish) >JAWOHL;das ist mein Problem, VOLLTREFFER, DANKE DIR!!!!! >also ungenutzt bedeutet NULL; Du kannst sie auch auf Eins oder 0815 setzen, aber sie haben dennoch keine Information, weil der Wert konstant ist. ;-) >> Wenn es WIRKLICH 9 Bit sein müssen, >WAS heisst wenn es wierklich??? Wenn dein Gerät, welches per SSI die Position ausliest, nur mit 9 Bit klar kommt. Ist das gerät flexibel programmierbar, z.B. ein anderer Mikroontroller, kann man das ggf. ändern. >> nachbilden und "per Hand" sprich CPU raustakten. Das ist aber deutlich >> langsamer als die verwendung des SPI-Moduls im AVR. >ok und was sagst du wenn ich in dem PROTOKOl Schreibe(ALSO VEREINBARUNG) >dass die NUTZDATEN einer Umdrehung werden in zwei Paket jeweils 8-BIT( >wie oben bereits gepostet) übertragen??? Kann man machen, wenn die andernen (ICs) das erlauben. > ist das realisierbar? Ja. > empfehlst du mir so was zu tun? Siehe oben. >> Eine Alternative wäre das USI-Modul in einigen AVRs, dort kann man >> relativ schnell beliebige Bitbreiten ausgeben. >hmmm auf ander AVR ZU SCHALTEN ist jetzt schon zu Spät. Es ist selten zu spät. Es gibt viele AVRs, die zumindest pinkompatibel sind. @ Karl heinz Buchegger (kbuchegg) (Moderator) >Ich frag sicherheitshalber mal nach >Ist SSI eigentlich dasselbe wie SPI? Nö, aber fast ;-) >Der TO spricht immer von SSI. Mit diesem Kürzel kann aber weder ich noch >Google (ohne jetzt genauer geschaut zu haben) etwas anfangen. http://www.heidenhain.de/fileadmin/pdb/media/img/349_529-1B.pdf Seite 64. MFG Falk
HALLO LIEBER Fabian > Kmrish, ich glaube, du hast nicht verstanden, was Du überhaupt machen > sollst / willst. Und das ganze wird dann deine Bachelorarbeit? Schön für dich, dass du sowas glauben kannst. aber glaub mir, ob du das oder was anders glaubst, wird dir nichts weiterbilden. Tip für dich: glaub an sachen, die dir was bringt!! > Dein Problem bezieht sich nur auf die Ausgabe eines Wertes, der sich im > Bereich 0..360 befindet. Die Eingabe hast Du ja bereits fertig und ist > somit nicht Teil der Problemstellung. ja genau die Ausgabe eines Wertes ist mein PROBLEM > Du weißt, dass Du für "360" 9 Bit brauchst, die über eine serielle > Schnittstelle (SSI) nach außen geführt werden. Du hast im Datenblatt > gelesen, dass dein µC eine solche Schnittstelle hat, diese aber nur 8 > Bit breit ist. Somit willst Du eine externes Schieberegister verwenden. Das war meine erste Vorschlag, ich wusste nicht ob das vernünftige Lösung oder nicht deswegen habe ich die Frage gestellt > > Das ist natürlich totaler Blödsinn! ok das kann ja sein > > In der endgültigen Beschaltung holst sich ein weiteres Device die Daten > von deinem Kontroller seriell ab. Hierzu liefert dieser externe Host > deinem µC ein Clock-Signal. das habe ich ganz genau verstanden und zwar direkt von dem datenblatt des AVRs > Hierzu brauchst Du KEINE externe Hardware! ok > Die Clock-Leitung vom Host schließt Du an einen Interrupt deines µC an. das nein und bitte erlaub mir zu korregieren, es muss kein Interrupt ausgelöst werden, denn ja wenn spi-EINHEIT freigeschaltet ist, dann tastet der kontroller logic den SCK-Pin ab, und sobald eine fallende falnake erfasst wird, wird die NUTZDATEN rausgeschickt. das steht im DATENBLATT. In SPI Slave mode, the control logic will sample the incoming signal of the SCK pin. To ensure correct sampling of the clock signal, the minimum low and high periods should be: Low periods: Longer than 2 CPU clock cycles. High periods: Longer than 2 CPU clock cycles. > > Ein solches Schieberegister sieht z.B. so aus: ICH DANKE DIR VIEL MALS FÜR DEIN Code das ist wierklich jetzt eine HILFE VON DIR: Danke > >
1 | > uint8_t count; |
2 | > uint16_t data; |
3 | > ... |
4 | > if (data & 1) |
5 | > PORTB |= (1<<PB0); |
6 | > else |
7 | > PORTB &= ~(1<<PB0); |
8 | > data >>= 1; |
9 | >
|
10 | > if (--count == 0x00) |
11 | > { |
12 | > // "aktuellen Zählerwert in data kopieren" |
13 | > // count wieder auf 9 setzen |
14 | > } |
15 | >
|
> > Natürlich ist das nur ein Beispiel und man muss noch gewisse Dinge zur > Synchronisation beachten. Aber das Prinzip sollte klar sein. > > Fabian DANKE
Warum eigentlich nur 9 Bit? Ist es nicht gerade die Aufgabe vom inkrimentellem zum absoluten Zähler zu kommen. Wenn man da ein paar Umdrehungen zählen will sollte man doch lieber gleich zu 32 Bit greifen um etwas Luft zu haben.
Hängt von ab, wofür es gebraucht wird. Wenn es z.B. eine Lautstärkeeinstellung wäre, dann reichen die 360 Schritte. Wäre es ein Encoder an einem Motor für eine Streckenmessung, dann wäre das aber schon sinnvoll, den Zähler weiterlaufen zu lassen.
Hast recht. An einen so eingeschränkten Encoder hab ich nicht gedacht. Aber auch dann sollte man ein Bit mehr nehmen (10) weil man am Anfang nicht weiß wo man steht. Die 300 Schritte könnten links herum oder rechts herum kommen -> 600 Schritte die möglichst gezählt werden sollten.
Warum sollte man mehr zählen, als die Position angeben kann? Falls die Aufgabe ist, nur die absolute Position zurückzuliefern, dann dürfen es sogar nur die 360 Schritte sein. Etwas anderes wäre es natürlich, wenn es nur sehr langsam ausgelesen werden kann und man wirklich wissen will, in welcher Richtung es gedreht wurde.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.