Hallo,
vielen Dank!
Das werde ich mir die Tage mal anschauen.
Gruß,
Marco
Stoppe den Bascom Simulator am ISR Label.Zitat von mrmajo
Ö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.
Hallo,
vielen Dank!
Das werde ich mir die Tage mal anschauen.
Gruß,
Marco
Zitat von Sauerbruch
Ok . jetzt hab ich's verstanden. Danke für die sehr aufschlussreiche Erklärung.
Gruß Nase
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, oderDanke , damit hast du mir sehr geholfen, hab das Problem zwar noch nicht behoben, weiß aber jetzt , warum ich eines hatte.
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
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.
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).Zitat von Sauerbruch
Dann versuche ich noch die Frequenz zu messen um sie dann auf dem Display darzustellen.
Wünsche erst einmal Schöne Weihnacht.
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.
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.
Das kannst du noch verbessern, indem du eine höhere Taktfrequenz benutzt.Zitat von nase
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.
Lesezeichen