Forum: Mikrocontroller und Digitale Elektronik variabler Frequenzteiler


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Jochen (Gast)


Lesenswert?

Hallo,

ich will mit einem AVR über dessen seriellen UART-Port Daten mit einer 
bestimmten Frequenz ausgeben. Es müssen allerdings zwei verschiedene 
Taktraten ausgegeben werden. Dazu braucht der AVR zwei umschaltbare 
Eingangsfrequenzen, 9,6MHz und 16MHz. Diese beiden Frequenzen wären ein 
Teiler von 48MHz. Da der AVR maximal 20MHz Taktfrequenz verträgt, kann 
ich einen 48MHz-Quarzoszillator nicht direkt anschließen, sondern müsste 
dessen Takt durch drei oder durch fünf teilen. Wie mache ich dies? Gibt 
es dafür einen Chip (74..) und, wenn ja, wie müsste er beschaltet 
werden? Zwei Pins des AVRs wären fürs Umschalten frei.

Danke

von Sven B. (scummos)


Lesenswert?

Also durch Zweierpotenzen teilen kann man gut mit einem Counter, z.B. 
74AC163 wenn ich das Datenblatt richtig lese. Durch fünf ist schon 
kniffliger ...
Kannst du keinen µC mit integriertem Teiler benutzen oder einfach zwei 
Oszillatoren verbauen?

von Jim M. (turboj)


Lesenswert?

Hat ATMEL keine Mikrocontroller mit integrierter PLL? Würde die Sache 
stark vereinfachen...

Kann ein AVR überhaupt eine Frequenz am UART ohne Jitter (Pause zwischen 
Bytes) ausgeben?

von Jochen (Gast)


Lesenswert?

Sven B. schrieb:
> Also durch Zweierpotenzen teilen kann man gut mit einem Counter,
> z.B.
> 74AC163 wenn ich das Datenblatt richtig lese. Durch fünf ist schon
> kniffliger ...
> Kannst du keinen µC mit integriertem Teiler benutzen oder einfach zwei
> Oszillatoren verbauen?

Ich kann leider nur AVRs programmieren und die vertragen 48MHz nicht.
Wie könnte ich denn zwischen zwei Oszillatoren umschalten?

von Jakob (Gast)


Lesenswert?

Aus TTL-Zeiten ist mir noch bekannt, dass man mit Presettable
Binary Counter-n, wie 74160/-161 durch 2, 3, 4, 5,..15 teilen
konnte. Sollte mit 74HCxx auch möglich sein.

Musste man da für 3, oder 5 den Preset auf 12 / 10 stellen?
Dann würden 2 Port-Pins reichen.

Muss ich mal nachsehen...

von Harry L. (mysth)


Lesenswert?

74HC4017 und MR wahlweise mit Q3 (für Teiler durch 3) oder Q5 (für 
Teiler durch 5) verbinden.

: Bearbeitet durch User
von Jochen (Gast)


Lesenswert?

Jim M. schrieb:
> Hat ATMEL keine Mikrocontroller mit integrierter PLL? Würde die
> Sache stark vereinfachen...

Zumindest der MEGA1284 hat dies nicht.

> Kann ein AVR überhaupt eine Frequenz am UART ohne Jitter (Pause zwischen
> Bytes) ausgeben?

Die USART im SPI-mode ist double-buffered; somit sollte dies kein 
Problem sein.

von Jakob (Gast)


Lesenswert?

An 74HC4017 habe ich auch gedacht.
Erst mal wollte ich ihm keine 48 MHz zutrauen, doch bei
5 V / 25° schafft er das wohl.

Aber, ohne zusätzliche Logik kannst du ihn (auch) nicht
vom AVR aus umschalten.

von Sebastian S. (amateur)


Lesenswert?

Anno Tobak konnte das der SN7490. Möglicherweise gibt es den auch in den 
aktuellen Prozessen. Der konnte u.a. Div 5 und Div2 (Div 10).
Ob allerdings mit einem so "holprigen" Takt irgendetwas anzufangen ist, 
wage ich zu bezweifeln.

: Bearbeitet durch User
von holger (Gast)


Lesenswert?

When applying an external clock, it is required to avoid sudden changes 
in the applied clock frequency
to ensure stable operation of the MCU. A variation in frequency of more 
than 2% from
one clock cycle to the next can lead to unpredictable behavior. If 
changes of more than 2% is
required, ensure that the MCU is kept in Reset during the changes.

von Jakob (Gast)


Lesenswert?

Mit einem Counter 74hc4017, oder 74hc93 o.ä. plus einem quad NAND,
oder NOR sollte das zu bewerkstelligen sein.

Man muss doch nur (über die NANDs, oder NORs vom AVR gesteuert)
die 3, oder 5 dekodieren und damit den Reset auslösen.
Der RESET-Puls (vielleicht mit RC etwas gedehnt) geht an den
ext-Clk-Input für die UART des AVR.

Erfordert etwas Boolsches Tüfteln.
Aber heute nicht mehr...

von Axel S. (a-za-z0-9)


Lesenswert?

Jochen schrieb:
> ich will mit einem AVR über dessen seriellen UART-Port Daten mit einer
> bestimmten Frequenz ausgeben. Es müssen allerdings zwei verschiedene
> Taktraten ausgegeben werden. Dazu braucht der AVR zwei umschaltbare
> Eingangsfrequenzen, 9,6MHz und 16MHz.

Das glaube ich nicht. Überhaupt ist es eine ziemlich blöde Idee <tm>, 
ausgerechnet die Taktfrequenz des ganzen Controllers umzuschalten, nur 
weil man verschiedene Baudraten auf der UART Schnittstelle braucht.

Beschreib lieber dein eigentliches Problem und nicht das was du für die 
Lösung hältst (und womit du nicht weiterkommst).

von Jochen (Gast)


Lesenswert?

Danke für diese vielen guten Tipps.
Das Ganze ist doch komplizierter als ich dachte. Vielleicht überlege ich 
noch mit 74HC163 oder 74HC193.
Vielleicht könnte man kurz vor dem Umschalten der Frequenz den Watchdog 
einschalten. Stürzt der AVR beim Umschalten nicht ab, dann könnte er den 
Watchdog wieder abschalten und weiter machen; andernfalls würde ihn der 
Watchdog aus dem Absturz wieder erwecken. Das ist aber alles deutlich 
komplizierter als gedacht. Die minimale Länge der Low- oder High-Phase 
des externen Taktsignals muss auch noch 20ns sein. Auch dies ist nicht 
so einfach...

von Jochen (Gast)


Lesenswert?

Axel S. schrieb:
> Beschreib lieber dein eigentliches Problem und nicht das was du für die
> Lösung hältst (und womit du nicht weiterkommst).

Ich überlege gerade, ob man mit einem AVR nicht ein Floppy-Disk-Laufwerk 
ansprechen kann. Die Taktrate ist mit 250kHz bei DD und 500kHz bei HD 
nicht das Problem. Das Problem ist die Precompensation, die bei DDs 
125ns ist. Dies sollte mit 8MHz zu erreichen sein. Bei HDs sollte dies 
die halbe Zeit sein, was mit 16MHz möglich sein sollte.
Bei 3.5"-Laufwerken dreht sich die Disk sowohl bei DD- als auch bei 
HD-Laufwerken immer mit 300 U/min. Hier sind 16MHz immer richtig.
Schwieriger ist es bei 5.25"-Laufwerken:
Ein 5.25"-DD-Laufwerk hat 300 U/min. Hier ist 16Mhz (8MHZ) korrekt.
Ein 5.25"-HD-Laufwerk hat allerdings 360 U/min.
Für 5.25"-HD-Disks in HD-Laufwerken ist 16MHz perfekt.
Eine 5.25"-DD-Disk in einem HD-Laufwerk würde sich allerdings 20% zu 
schnell drehen (360 statt 300 U/min). Dadurch müssen auch alle Daten, 
inklusive 125ns-Precompensation, 20% schneller auf die Disk geschrieben 
werden, also 9,6 statt 8MHz.
Ich weiß, dass es sinnlos ist heutzutage über Floppydisks nachzudenken, 
aber es interessiert mich eben.

von Torben K. (tokuhila)


Lesenswert?

AVR haben bestimmt Baudratenregister. Aber hat das Floppydrive auch 
einen UART? Wäre mir neu.

von Dergute W. (derguteweka)


Lesenswert?

Moin,

Jochen schrieb:
> noch mit 74HC163 oder 74HC193.
> Vielleicht könnte man kurz vor dem Umschalten der Frequenz den Watchdog
> einschalten. Stürzt der AVR beim Umschalten nicht ab, dann könnte er den
> Watchdog wieder abschalten und weiter machen; andernfalls würde ihn der
> Watchdog aus dem Absturz wieder erwecken.

Schlechte Idee. Im Datenblatt steht ja: "unpredictable behaviour". Das 
heisst, er muss nicht abstuerzen; er kann sich einfach nur mal 
"verrechnen". Oder von irgendwo anders lesen als gedacht, oder irgendwo 
anders hinschreiben als gedacht. Da wird der Watchdog nicht mal leise 
knurren und trotzdem kann beliebiger Mumpitz die Folge sein.

Gruss
WK

von Jobst M. (jobstens-de)


Lesenswert?

Nimm einen DDS-Chip, welchen Du mit einem µC ansteuerst.
Oder eine PLL.
Aber doch nicht sooooo ...!


Gruß

Jobst

von chris (Gast)


Lesenswert?

Hallo,

eins verstehe ich noch nicht so ganz möchtest du den Pin nutzen worüber 
die UART kommuniziert oder nur die komplette UART??

Sollte zweiteres gemeint sein, gibs das Baudratenregister worüber 
verschiedene Geschwindigkeiten generiert werden können. Da muss man aber 
ins DB schauen welche Abweichungen bei welcher Taktfrequenz gewollt 
sind.

Sonst mal schauen wie die serielle Schnittstelle funktioniert
https://de.wikipedia.org/wiki/RS-232 denn im Bild mit dem 
SpannungsZeitverlauf sieht man es recht gut wie die Bits übertragen 
werden... ähnlich wie dem 1wire-Protokoll von Maxim

von Christoph db1uq K. (christoph_kessler)


Lesenswert?

Also 48 MHz mit einem alten 7490, das halte ich für ziemlich wacklig. 
Auch die Trickserei mit asynchronem Reset z.B. beim 4017 ist 
unzuverlässig. Besser ist der synchrone Reset beim schon genannten 163 
oder 193, der hat dann immer fast eine Taktperiode zur Vorbereitung 
Zeit. Nicht der 74161, der hat asynchronen Reset. Wenn möglich eine 
schnelle TTL-Familie, also AC, FCT, AS, F usw., die können eher 48 MHz.

von Stefan F. (Gast)


Lesenswert?

Die Xmega Controller haben einen PLL Taktgeber, den man auch im 
laufenden Betrieb umkonfigurieren kann.

Ob du damit auf die spezielle gewünschten Frequenzen kommst, kann ich 
allerdings nicht einschätzen. Ich hatte bisher nur eine Anwendung mit 
einem Xmega.

Xmega würde ich als gepimpte AVR's bezeichnen.

> Ich überlege gerade, ob man mit einem AVR nicht ein
> Floppy-Disk-Laufwerk ansprechen kann.

Da würde ich aber nicht das ganze Rad in allen Details neu erfinden 
wollen und einen fertigen Floppy Controller benutzen. Ich hatte mal 
einen Chip von Western Digital (WD1771) verwendet, den ich von einer 
alten I/O Karte für einen Floppy-Streamer abgezogen hatte.

von Christoph db1uq K. (christoph_kessler)


Lesenswert?

Mit 74xx163 geht es ohne zusätzliche Gatter, wenn man das oberste 
Zählbit mit dem synchronen Preset verbindet. Der ist active low, d.h. 
nach Zählerstand Null wird auf den Preset-Wert gesetzt. Für einen Teiler 
durch fünf werden also Zustände 12...15 und 0 durchlaufen, für Teilung 
durch drei nur 14,15,0. Preset also auf 12 oder 14, = 1100 oder 1110. 
Somit lässt sich der Teiler über das zweitniedrigste Presetbit 
umschalten, vermutlich ohne Störungen.

von Axel S. (a-za-z0-9)


Lesenswert?

Jochen schrieb:
> Axel S. schrieb:
>> Beschreib lieber dein eigentliches Problem und nicht das was du für die
>> Lösung hältst (und womit du nicht weiterkommst).
>
> Ich überlege gerade, ob man mit einem AVR nicht ein Floppy-Disk-Laufwerk
> ansprechen kann. Die Taktrate ist mit 250kHz bei DD und 500kHz bei HD
> nicht das Problem. Das Problem ist die Precompensation, die bei DDs
> 125ns ist.

Du möchtest also mit dem AVR direkt den Schreibdatenstrom erzeugen? 
Wieso glaubst du, ausgerechnet die UART wäre dazu hilfreich?

Wenn überhaupt, dann wäre das SPI das Werkzeug der Wahl. Mit hinreichend 
schnellem Takt und softwaremäßiger Vervielfachung der Datenbits könnte 
es den Datenstrom wohl erzeugen. Allerdings hast du dabei mindestens 
zwei Probleme:

1. der Aufwand, die Bits passend zu vervielfältigen, dürfte deinen AVR 
überfordern

2. da das SPI bei den AVRs senderseitig nicht gepuffert ist, hast du 
extreme Anforderungen an das Timing, weil du ja lückenlos senden mußt

von Lurchi (Gast)


Lesenswert?

SPI über die USART hat einen Puffer. Von daher macht UART schon etwas 
Sinn, auch wenn man die USART wohl eher im SPI Modus nutzen wird.

Die Precompensation ist eine analog Sache, also unabhängig vom Takt.

von MaWin (Gast)


Lesenswert?

Jochen schrieb:
> Das Problem ist die Precompensation,

Sooo genau kommt es auf die Precompensation nicht an. Ob nun 
präkompensiert 100ns oder 150ns verschoben der Flankenwechsel 
stattfindet ist egal.

Schlimmer ist das Synchronisieren beim Lesen. Man muss per PLL der 
Drehgeschwindigkeit der von jemand anderem Disk folgen damit man den 
Bitzustand immer inmittig der Bitwechsel ausliest.

Diese PLL kann man digital machen, aber dazu muss man die Zeitpunkte an 
denen der UART die Eingangsleitung abfragt einerseits kennen und 
andereseits zumindest beim nächsten Byte um us verschieben können.


Beispiel: Dein UART liest einen 500khz (2us) Datenstrom mit 500ns 
Auflösumg ein

00000111111110000111000001111111
 .   .   .   .   .   .   .   .

Man sieht, dass er knapp nach den Flankenwechseln abtastet. 
Zuverlässiger wäre das Lesen wenn er den Samplezeitpunkt um 500ns 
verschieben würde

00000111111110000111000001111111
  .   .   .   .   .   .   .   .

Das macht die PLL, typisch mit 16-facher Auflösung, nicht bloss 4 wie 
hier.

von Jakob (Gast)


Lesenswert?

Hätte nicht gedacht, dass es garnicht so leicht ist, mit einem,
oder auch zwei ICs und ein bis zwei Bit Ansteuerung 1/3, oder 1/5
einer HF-Frequenz > 40 MHz darzustellen.

Aber ich wundere mich über die hirnrissige Idee, den µC-Takt
umzuschalten!

Mega-AVRs haben einen XCK-Eingang für den Baudratengenerator.
Tiny-AVRs haben (Ausnahmen bestätigen die Regel) sowieso
keine UART.

von Jobst M. (jobstens-de)


Lesenswert?

Jakob schrieb:
> Hätte nicht gedacht, dass es garnicht so leicht ist, mit einem,
> oder auch zwei ICs und ein bis zwei Bit Ansteuerung 1/3, oder 1/5
> einer HF-Frequenz > 40 MHz darzustellen.

Ist auch nicht kompliziert. Aber man möchte es scheinbar kompliziert.
Stichworte für fertige 1-Chip-Lösungen wurden von mir genannt.


Hier noch ein Beispiel ohne HF und Spezialchips:
1
 _________                          ___________
2
|         |                        |           |
3
| 1,6 MHz |------------------------| øsoll     |
4
|_________|    __________          |        PD |------,
5
              |          |         |           |      |
6
         /    |       Q2 |---------| øist      |      |
7
     ,--o  o--| Q6       |         | _ _ _ _ _ |      |
8
     |        |          |         |           |      R
9
     |        |      CLK |----+----| Fout      |      |
10
     |        |          |    |    |           |      |
11
     '--------| R        |    |    |     VCOin |------+
12
              |__________|    |    |___________|      |
13
                  4017        V        7046           C
14
                                                      |
15
                          9,6 / 16MHz                GND


Gruß

Jobst

: Bearbeitet durch User
von Jochen (Gast)


Lesenswert?

> Schlechte Idee. Im Datenblatt steht ja: "unpredictable behaviour".

Stimmt; das hätte ich vorher nachlesen gesollt. Somit ist das Umschalten 
der Eingangsfrequenz eine ganz schlechte Idee, auch wenn es machbar 
wäre.

> Die Xmega Controller haben einen PLL Taktgeber, den man auch im
> laufenden Betrieb umkonfigurieren kann.

Es soll auf alle Fälle ein Hobby-Projekt werden, sodass ich keine 
SMD-Chips benutzen möchte. Somit scheidet ein Xmega leider aus.

> Ich hatte mal
> einen Chip von Western Digital (WD1771) verwendet, den ich von einer
> alten I/O Karte für einen Floppy-Streamer abgezogen hatte.

Es würde mich (momentan gedanklich) reizen alles mit einem leicht 
erhältlichen Chip zu erreichen.

Ich wollte eigentlich schon die USART im SPI-Modus benutzen; denke aber 
inzwischen, das selbst die zu langsam sein könnte.

> Schlimmer ist das Synchronisieren beim Lesen. Man muss per PLL der
> Drehgeschwindigkeit der von jemand anderem Disk folgen damit man den
> Bitzustand immer inmittig der Bitwechsel ausliest.

Ich hätte es gedanklich ohne PLL, nur in Software gemacht, ungefähr so:
ReadData ist z.B. mit Int0 verbunden. Jede fallende Flanke löst einen 
Interrupt aus. Es wird nicht die Interrupt-Routine angesprungen, sondern 
nur das Interrrup-Flag ausgewertet. Anhand der Zeit, die zwischen zwei 
Interrupsts (magnetischen Richtungswechseln) ist, würde entschieden, ob 
es ein 0- oder ein 1-Bit ist.

Danke für Eure wertvolle Hilfe.

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.