Hallo, ich habe mir mit dem AD9835 einen DDS Funktionsgenerator gebaut, der auch soweit läuft. Ich wollte noch die Funktion des Wobbeln´s mit einfügen, weiss aber nicht so recht wie. Die eingabe der Start und Endfrequenz ist ja kein problem, aber wie schaffe ich es, das der MC kontinuirlich zwischen diesen Frequenzen hin und her wandert ? Programmiert ist das ganze mit Bascom. Bitte um hilfe ! Danke!!
Timer aufsetzen, der in regelmässigen Zeitabständen einen Interrupt auslöst. Im Interrupt die Vorgabefrequenz um einen bestimmen Betrag erhöhen oder erniedrigen.
Ob du das kannst, weis ich nicht :-) Prinzipiell kann man das, klar. Ich empfehle mal einen Blick ins Handbuch bzw. die online Hilfe zu werfen.
Wenn ich die Wobbelgeschw. in Hz angebe, wie berechne ich daraus die Timerwerte ?
Dazu musst du erst mal sagen, in welchem Modus du den Timer betreiben willst. Wenn's nicht BASCOM wäre, hätte ich den CTC Modus des Timer 1 vorgeschlagen (Timer zählt bis zu einem vorgegebenem Wert, wenn Wert erricht: Timer auf 0 zurücksetzen und Interrupt auslösen). Wie dieser Modus bei BASCOM heist musst du schon selbst rausfinden. Um auszurechnen wie weit der Timer zählen soll und welchen Vorteiler: Du hast die Wobbelfrequenz. In einem Wobbeldurchgang muss die Freuenz einmal von langsam nach schnell und wieder zurück verändert werden. In wievielen Stufen gedenkst du das zu tun? Wenn du das weist, kannst du dir ausrechnen, wieviel Zeit von einer Freuenzänderung zur nächsten vergehen muss. DIe Taktfrequenz deines µC kennst du. Du jetzt weist in welchen Zeitabständen du einen Interrupt brauchst kannst du über die Prozessorfreuenz (und einem ev. Vorteiler) ausrechnen wie weit der Zähler zählen muss. Diesen Wert als Endwert für den CTC Modus vorgeben und fertig. Keine Angst: Die notwendigen Berechnungen gehen über die 4 Grundrechnungsarten nicht hinaus. Mit ein bischen nachdenken folgt eins völlig logisch aus dem anderen. Man muss nur ein bischen nachdenken was man da eigentlich tut und was man erreichen möchte.
Im angehangenen Testprogramm zählt er zwar hoch, aber nicht runter ???? Warum ??? Ist nicht leicht mit den Timern.... $regfile = "m8def.dat" $crystal = 7372800 Dim Fstart As Long , Fende As Long , F1 As Long Dim I As Byte , Z As Byte Cls Fstart = 1000 Fende = 2000 I = 0 Z = 10 Config Timer1 = Timer , Prescale = 64 On Timer1 Timer_irq Const Timervorgabe = 54016 Enable Timer1 Enable Interrupts Do Upperline Lcd "F=" ; F1 Loop Timer_irq: Timer1 = Timervorgabe If I = 0 Then F1 = Fstart Fstart = Fstart + Z If Fstart = Fende Then I = 1 End If End If If I = 1 Then Fstart = Fstart - z If Fstart = F1 Then I = 0 End If End If Return
> Timer_irq: > Timer1 = Timervorgabe > > If I = 0 Then > F1 = Fstart > Fstart = Fstart + Z > > If Fstart = Fende Then > I = 1 > End If > End If > > If I = 1 Then > Fstart = Fstart - z > If Fstart = F1 Then > I = 0 > End If > End If Lass die Werte für Fstart und Fende in Ruhe. Du willst nur in jedem Timerinterrupt F1 hochzählen oder erniedrigen. Wenn das Richtungsflag auf 'nach oben' steht, willst du F1 erhöhen. Erreichst du dadurch Fende, dann wird die Richtung auf 'nach unten' umgeschaltet. Wird beim Runterzählen wieder Fstart erreicht, wird die Richtung wieder auf 'nach oben' umgestellt. In keinem Fall musst du aber Fstart oder Fende verändern. Das willst du auch nicht, denn das sind deine Eckdaten an denen die Richtung umgestellt wird. Im übrigen: Ist garantiert, dass Fstart + n * z (n ganzzahlig, z beliebig) immer Fende ergibt? Ich denke mal: eher nicht. Das heist es wird nicht sehr schlau sein, die Richtungsumschaltung dann zu machen wenn F1 exakt Fende ist. Bsp: FStart 1000 FEnde 2000 z 300 F1 nimmt dann die Werte an: 1000 1300 1600 1900 2200 Mit 2200 bist du schon grösser als die geforderten 2000. Allerdings war F1 niemals exakt gleich 2000 und daher wird auch die Umschaltung auf 'nach unten' nie durchgeführt.
Deine Grundidee war doch gar nicht schlecht. Nur die Ausführung war lausig :-) Timer_irq: Timer1 = Timervorgabe If I = 0 Then F1 = F1 + z if F1 >= Fende then I = 1 end if else F1 = F1 - z if F1 <= Fstart then I = 0 end if end if Wenn der Wobbler eingeschaltet wird, setzt du F1 auf Fstart und I auf 0
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.