- 3D-Druck Einstieg und Tipps         
Seite 3 von 4 ErsteErste 1234 LetzteLetzte
Ergebnis 21 bis 30 von 40

Thema: Frequenzgenerator Entwickeln ? !

  1. #21
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.113
    Anzeige

    E-Bike
    Zitat Zitat von mrmajo
    wenn ich mich selbst um die Registerrettung kümmern möchte, wie finde ich herraus welche Register ich retten muss?
    Stoppe den Bascom Simulator am ISR Label.
    Öffne die Register Ansicht (grüne R ganz oben)
    Steppe durch die Befehle bis zum Return
    Alle veränderte Register werden Rot dargestellt.
    Hinzu kommt noch SREG.
    In diesem Fall sähe es mit NOSAVE dann so aus:

    Timer_null:
    !PUSH R16
    !In R16, SREG
    !PUSH R16
    !PUSH R24
    !PUSH R25
    !PUSH R26
    !PUSH R27

    Timer0 = Taktwert
    Toggle Porta.0

    !POP R27
    !POP R26
    !POP R25
    !POP R24
    !POP R16
    !Out Sreg, R16
    !POP R16
    Return

    Ergebnis: 42 Takte, also etwa 12KHz.

  2. #22
    Neuer Benutzer Öfters hier
    Registriert seit
    21.12.2004
    Ort
    Bottrop
    Alter
    42
    Beiträge
    17
    Hallo,

    vielen Dank!
    Das werde ich mir die Tage mal anschauen.

    Gruß,
    Marco

  3. #23
    Benutzer Stammmitglied
    Registriert seit
    18.03.2007
    Ort
    NRW
    Beiträge
    62
    Zitat Zitat von Sauerbruch
    Wenn ich aber einen Vorgabewert von 254 gebe , errechne ich 500 khz mess aber nur ca 4 Khz.
    Der Knackpunkt ist der, dass mit dem Überlaufen des Timers die ISR bei weitem nicht sofort erreicht wird. Der Controller muss eine Menge an internen Registern "retten", bevor er sein Hauptprogramm verlässt und in die ISR geht. Wie for_ro und ich bereits gestern geschrieben haben, dauert es alleine schon 62 (!!) Taktzyklen, bis die ISR ausgeführt wird. Und weil diese Register nach dem Abarbeiten der ISR ale wieder zurückgeholt werden müssen, vergehen weitere 62 Taktzyklen, bevor über eine neue ISR überhaupt nur nachgedacht werden kann. Selbst wenn in der ISR (wie bei Deinem Code) fast nichts drinsteht, dauert das reine "Vorbereiten, Abarbeiten und Nacharbeiten" der ISR schon etwa 125 Taktzyklen! Die ISR kann deshalb also maximal 8000 mal pro Sekunde ausgeführt werden, was einer maximalen Frequenz von 4kHz entspricht.

    Wenn Du den Timer auf 254 vorlädst, wird zwar tatsächlich 2 Takte später der Interrupt ausgelöst. Das heißt aber nicht, dass bereits 2 Taktzyklen später der nächste Interrupt erfolgen kann - weil´s eben mindestens mal 125 Zyklen dauert, bis die ISR einschließlich aller "Hausaufgaben" erledigt ist. Und vorher kann´s keine neue ISR geben...

    Ist das ganze jetzt etwas klarer?

    Ok . jetzt hab ich's verstanden. Danke für die sehr aufschlussreiche Erklärung.

    Gruß Nase

  4. #24
    Benutzer Stammmitglied
    Registriert seit
    18.03.2007
    Ort
    NRW
    Beiträge
    62
    Zitat Zitat von Sauerbruch
    Wenn ich aber einen Vorgabewert von 254 gebe , errechne ich 500 khz mess aber nur ca 4 Khz.
    Der Knackpunkt ist der, dass mit dem Überlaufen des Timers die ISR bei weitem nicht sofort erreicht wird. Der Controller muss eine Menge an internen Registern "retten", bevor er sein Hauptprogramm verlässt und in die ISR geht. Wie for_ro und ich bereits gestern geschrieben haben, dauert es alleine schon 62 (!!) Taktzyklen, bis die ISR ausgeführt wird. Und weil diese Register nach dem Abarbeiten der ISR ale wieder zurückgeholt werden müssen, vergehen weitere 62 Taktzyklen, bevor über eine neue ISR überhaupt nur nachgedacht werden kann. Selbst wenn in der ISR (wie bei Deinem Code) fast nichts drinsteht, dauert das reine "Vorbereiten, Abarbeiten und Nacharbeiten" der ISR schon etwa 125 Taktzyklen! Die ISR kann deshalb also maximal 8000 mal pro Sekunde ausgeführt werden, was einer maximalen Frequenz von 4kHz entspricht.

    Wenn Du den Timer auf 254 vorlädst, wird zwar tatsächlich 2 Takte später der Interrupt ausgelöst. Das heißt aber nicht, dass bereits 2 Taktzyklen später der nächste Interrupt erfolgen kann - weil´s eben mindestens mal 125 Zyklen dauert, bis die ISR einschließlich aller "Hausaufgaben" erledigt ist. Und vorher kann´s keine neue ISR geben...

    Ist das ganze jetzt etwas klarer?

    Danke , damit hast du mir sehr geholfen, hab das Problem zwar noch nicht behoben, weiß aber jetzt , warum ich eines hatte.

  5. #25
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.01.2007
    Ort
    Göttingen
    Beiträge
    706
    Danke , damit hast du mir sehr geholfen, hab das Problem zwar noch nicht behoben, weiß aber jetzt , warum ich eines hatte.
    Na - dann sollte dieser zweite Schritt doch auch möglich sein, oder

    Du solltest einfach mal den "CTC"-Modus ausprobieren. CTC heißt "Clear Timer on Compare" - und das bringt die Sache auf den Punkt:

    Die zentrale Rolle spielt hier das "Output Compare"-Register, in das Du einen Wert zwischen 0 und 255 schreibst. Der Timer zählt nun so lange hoch, bis er den Wert dieses Registers erreicht hat. Ist "Gleichstand" erreicht, wird der Timer auf 0 gesetzt, ein Ausgang getoggelt (!) und das Spiel beginnt von vorne.

    Heißt also im Klartext: Je kleiner der Wert im Output-Compare-Register, umso höher die Ausgangsfrequenz.

    Beim Mega32 ist der zugehörige Ausgang B.3, und das Register heißt "OCR0" (weil´s ja für den Timer0 gilt).

    Im Gegensatz zu den Interrupt-basierten Methoden passieren hier die wesentlichen Dinge (Rücksetzen des Timers und Toggeln des Ausganges) auf Hardware-Basis, und das hat zwei große Vorteile:

    Erstens hält das ganze den Controller nicht von anderen Dingen ab. Er kann sich um ganz andere Sachen kümmern (z.B. Potis abfragen, LCD-Anzeigen bedienen etc., etc) - das Rechteck-Signal am OC-Ausgang wird sozusagen "von selbst" generiert.

    Zweitens geschehen das Rücksetzen des Timers und das Toggeln des Ausganges tatsächlich in einem einzigen Taktzyklus - d.h. das Spiel fängt sofort wieder von vorne an. Wenn Du z.B. in das Output-Compare-Register den Wert 5 schreibst (ganz direkt, also mit der Zeile OCR0 = 5), wird der Ausgang alle 5 Takte getoggelt - uns schon bist Du bei 100 KHz! Das, was Dich bei der Interrupt-Variante ausgebremst hat, nämlich die langwierige Register-Schieberei über mehr als 120 Zyklen, entfällt im CTC-Modus.

    Und mit Bascom kann man den CTC-Modus auch direkt wählen (wie ich auch erst durch diesen Thread gelernt habe)... for_ro hatte ein paar Beitrge vorher gepostet, wie man das macht.

    Viel Spaß beim Ausprobieren, und halt´ uns auf dem Laufenden!

    Daniel

  6. #26
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    2.214
    Wie hoch soll denn die Frequenz denn nun gehen.

    Schreib bitte nicht so hoch wie möglich.
    Mit einem passenden DDS Chip sind heutzutage 1GHz Sinus drin.

    Bei Frequenzen höher 2kHz Sinus wär ein DDS Chip meine erste Wahl.
    Ich hab mir den ATMEGA 16 DDS Generator nachgebaut und bin ziemlich enttäuscht. Das Teil soll angeblich bis 64kHz Sinus gehen, ab 2kHz schaut der Sinus aber grausam aus.
    Guck mal: http://www.scienceprog.com/avr-dds-s...generator-v20/
    Der Rechteck wird dort auch mit einem PWM Mode erzeugt, dabei sind aber die Sprünge, gerade bei den hohen Frequenzen brutal ( 8MHz, 4MHz, 1MHz ).
    Das geht sicher nocht etwas feiner, aber viel nicht!

    Guck mal bei ELV nach dem DDS 20.
    http://www.elv-downloads.de/service/...rd_V6_2_KM.pdf
    Da ist eine komplette Dokumentation inklusive Schaltplan drin.
    Die Generatorschaltung schaut mir einigermassen brauchbar und durchgerechnet aus.

    Den Controller und das Display könntest Du dabei gegen einen deiner Wahl austauschen.

    Der verwendete DDS Chip hat eine SPI Schnittstelle, die Du ja in Hardware bei einem ATMEGA Controller dabei hast.
    Zudem wären bei diesen Chips diverse Modulationsverfahren, wie FSK und PSK, relativ einfach zu implementieren.
    Bei Analog Devices gibts dafür sogar einen Calculator, der einem die benötigten Daten ausrechnet.

    Wobbeln wäre durch fortlaufende Änderung der Werte für die Frequenz hier auch nicht wirklich ein Problem.

    Die Endstufe mit dem AD811 würde ich durch einen AD8000 ersetzen, weil günstiger und höhere Bandbreite.

    Ein Highlight wär dann noch eine serielle Schnittstelle via FT232.
    Über die könnte man die Einstellwerte zusätzlich noch veränderbar machen - Sprich Betrieb vom PC aus.
    Oder das Teil als FSK Modulator nutzen um damit unidirektional Daten vom PC zu einem geeigneten Empfänger zu übertragen.


    Ich denk mal, so kommst Du zu einem Frequenzgenerator, der seinen Namen auch verdient.

  7. #27
    Benutzer Stammmitglied
    Registriert seit
    18.03.2007
    Ort
    NRW
    Beiträge
    62
    Zitat Zitat von Sauerbruch
    Danke , damit hast du mir sehr geholfen, hab das Problem zwar noch nicht behoben, weiß aber jetzt , warum ich eines hatte.
    Na - dann sollte dieser zweite Schritt doch auch möglich sein, oder

    Du solltest einfach mal den "CTC"-Modus ausprobieren. CTC heißt "Clear Timer on Compare" - und das bringt die Sache auf den Punkt:

    Die zentrale Rolle spielt hier das "Output Compare"-Register, in das Du einen Wert zwischen 0 und 255 schreibst. Der Timer zählt nun so lange hoch, bis er den Wert dieses Registers erreicht hat. Ist "Gleichstand" erreicht, wird der Timer auf 0 gesetzt, ein Ausgang getoggelt (!) und das Spiel beginnt von vorne.

    Heißt also im Klartext: Je kleiner der Wert im Output-Compare-Register, umso höher die Ausgangsfrequenz.

    Beim Mega32 ist der zugehörige Ausgang B.3, und das Register heißt "OCR0" (weil´s ja für den Timer0 gilt).

    Im Gegensatz zu den Interrupt-basierten Methoden passieren hier die wesentlichen Dinge (Rücksetzen des Timers und Toggeln des Ausganges) auf Hardware-Basis, und das hat zwei große Vorteile:

    Erstens hält das ganze den Controller nicht von anderen Dingen ab. Er kann sich um ganz andere Sachen kümmern (z.B. Potis abfragen, LCD-Anzeigen bedienen etc., etc) - das Rechteck-Signal am OC-Ausgang wird sozusagen "von selbst" generiert.

    Zweitens geschehen das Rücksetzen des Timers und das Toggeln des Ausganges tatsächlich in einem einzigen Taktzyklus - d.h. das Spiel fängt sofort wieder von vorne an. Wenn Du z.B. in das Output-Compare-Register den Wert 5 schreibst (ganz direkt, also mit der Zeile OCR0 = 5), wird der Ausgang alle 5 Takte getoggelt - uns schon bist Du bei 100 KHz! Das, was Dich bei der Interrupt-Variante ausgebremst hat, nämlich die langwierige Register-Schieberei über mehr als 120 Zyklen, entfällt im CTC-Modus.

    Und mit Bascom kann man den CTC-Modus auch direkt wählen (wie ich auch erst durch diesen Thread gelernt habe)... for_ro hatte ein paar Beitrge vorher gepostet, wie man das macht.

    Viel Spaß beim Ausprobieren, und halt´ uns auf dem Laufenden!

    Daniel
    Danke,das ist eine wunderbare Erklärung.Hab jetzt im CTC-Modus ausprobiert,und es klappt wunderbar,komme jetzt bei 1Mhz Takt auf 500Khz Ausgangsfrequenz,um jetzt einen möglichst großen Frequnzbereich abzudecken,muss ich den Vorteiler Software mäßig ändern ,dafür hatte ich jetzt aber noch nicht die Zeit.(Geschenke auspacken usw).
    Dann versuche ich noch die Frequenz zu messen um sie dann auf dem Display darzustellen.

    Wünsche erst einmal Schöne Weihnacht.

  8. #28
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.01.2007
    Ort
    Göttingen
    Beiträge
    706
    Hallo Nase,

    schön, dass es auf Anhieb mit dem CTC-Modus geklappt hat!

    An dieser Stelle sollte aber nochmal der kleine "Haken" des Verfahrens erwähnt werden, den wkrug in seinem Posting auch schon angesprochen hat:

    Am oberen Ende des Frequenzbereiches (also wenn OCR0 kleine Werte hat, z.B. 0, 1 oder 2) sind die Abstände zwischen den erzeugten Frequenzen ganz schön groß. Man kann das auch ohne Frequenzzähler durchspielen, denn die Toggle-Frequenz lässt sich aus der Taktfrequenz, dem Prescaler und dem Wert im OCR-Register errechnen:

    f = Taktfrequenz / (2 * Prescaler * (1 + OCR))

    Für Taktfrequenz = 1 MHz, Prescaler = 1 und OCR = 0 ergibt sich eine Ausgangsfrequenz von 1 MHz / (2 * 1) = 500 KHz. Das hattest Du ja auch schon festgestellt.

    Wenn Du OCR jetzt jeweils um 1 erhöhst, kommst Du auf Werte von Taktfrequenz / 4, Taktfrequenz / 6, Taktfrequenz / 8 usw.

    Das heißt, Deine Frequenzen am oberen Rand des Spektrums wären 500 kHz, 250 kHz, 166 kHz, 125 kHz - und das sind ja schon ziemliche Sprünge.

    Die niedrigste Frequenz wäre dann übrigens 1 MHz / (2 * (255 + 1)) = 1 MHz / 512, also knapp 2 KHz. Wenn Du niedrigere Frequenzen generieren möchtest, musst Du einen geeigneten Prescaler wählen.

  9. #29
    Benutzer Stammmitglied
    Registriert seit
    18.03.2007
    Ort
    NRW
    Beiträge
    62
    Hab es jetzt so hingebogen , das ich die OCR0 Werte nur im oberen Bereich nutze und dann den Prescaler softwaremäßig umstelle, so komme ich auf ein Frequenzbereich von 15 Hz bis 500 Khz. wobei die Frequenzsprünge im unteren Bereich sehr klein sind bis auf den höhreren Bereich , da bleiben sie immer noch in den von dir genannten Sprünge.

  10. #30
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.113
    Zitat Zitat von nase
    ... sind bis auf den höhreren Bereich , da bleiben sie immer noch in den von dir genannten Sprünge.
    Das kannst du noch verbessern, indem du eine höhere Taktfrequenz benutzt.
    Bei 16MHz hast du z.B. die Stufen 500KHz, 471KHz, 444KHz, 421KHz usw.
    Bei 20MHz hast du z.B. die Stufen 500KHz, 476KHz, 455KHz, 435KHz usw.

Seite 3 von 4 ErsteErste 1234 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen