Forum: Mikrocontroller und Digitale Elektronik was wenn Schieberegister kleiner ist?


von Kmrish A. (kmrish)


Lesenswert?

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

von Floh (Gast)


Lesenswert?

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.

von Fabian (Gast)


Lesenswert?

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.

von Kmrish A. (kmrish)


Lesenswert?

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

von Falk B. (falk)


Lesenswert?

Anhang?

von Kmrish A. (kmrish)


Angehängte Dateien:

Lesenswert?

oh sorry das war mein Fehler.
Bitte um Entschuldigung

von Frank B. (foobar)


Lesenswert?

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?

von Falk B. (falk)


Lesenswert?

Alles schön und gut, aber was soll das? Warum klennst du nicht die Pins 
direkt vom AVR an den Bus?

MfG
Falk

von C-Proger (Gast)


Lesenswert?

Warum nimmst du überhaupt ein Timer-Interupt?

von Simon K. (simon) Benutzerseite


Lesenswert?

Was ist das denn bitte für ein Schaltplan?

von kmrish (Gast)


Lesenswert?

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?

von Kmrish A. (kmrish)


Lesenswert?

C-Proger schrieb:
> Warum nimmst du überhaupt ein Timer-Interupt?
Timer-Interrupt ist in diesem Fall(Drehimpulsgeber) besser als 
Externe-Interrupt.

von Kmrish A. (kmrish)


Lesenswert?

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

von Kmrish A. (kmrish)


Lesenswert?

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

von Spess53 (Gast)


Lesenswert?

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

von Kmrish A. (kmrish)


Lesenswert?

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?

von Spess53 (Gast)


Lesenswert?

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

von Kmrish A. (kmrish)


Lesenswert?

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.

von Spess53 (Gast)


Lesenswert?

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

von Rudolph (Gast)


Lesenswert?

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.

von Kmrish A. (kmrish)


Lesenswert?

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.

von Andreas K. (derandi)


Lesenswert?

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.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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 ...

von Karl H. (kbuchegg)


Lesenswert?

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!

von Kmrish A. (kmrish)


Lesenswert?

> 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?

von Karl H. (kbuchegg)


Lesenswert?

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.

von Kmrish A. (kmrish)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Falk B. (falk)


Lesenswert?

@  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

von Fabian (Gast)


Lesenswert?

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

von Falk B. (falk)


Lesenswert?

@  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

von Fabian (Gast)


Lesenswert?

@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?

von Karl H. (kbuchegg)


Lesenswert?

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.

von Falk B. (falk)


Lesenswert?

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

von Kmrish A. (kmrish)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Frank B. (foobar)


Lesenswert?

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

von Frank B. (foobar)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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?"

von Kmrish A. (kmrish)


Lesenswert?

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

von Frank B. (foobar)


Lesenswert?

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.

von Falk B. (falk)


Lesenswert?

@  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

von Kmrish A. (kmrish)


Lesenswert?

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

von BoTaS (Gast)


Lesenswert?

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.

von Frank B. (foobar)


Lesenswert?

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.

von BoTaS (Gast)


Lesenswert?

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.

von Frank B. (foobar)


Lesenswert?

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
Noch kein Account? Hier anmelden.