Hallo Leute, ich stehe irgendwie auf dem Schlauch, Denkblokade oder so. Ich erzeuge mit dem PWM des AtMega 2 Frequenzen z.B. 10KHz und Puls/Pause 1/5 so wie 100 Hz 1/2 was ja nicht so schwer ist. Nun mein Problem, ich möchte das 10KHz Signal immer dann invertieren wenn beide Signale H sind, ich komm aber nicht drauf wie ich das mit Bascom anstellen soll. Mit Logig-IC habe ich das immer mit Gattern gemacht und die Signale mit NE556 erzeugt, jetzt soll es mit dem AtMega gehen weil da ja alles drin ist und ich damit auch weniger Platz benötige. Das ganze soll eine alte PLLSchaltung ersetzen. Ich benutze Bascom da ich ASM nicht kann, ich bin noch analog aufgewachsen und programiere noch nicht lange. Ich wäre froh wenn mir hier einer mit einen Lösungsansatz in Bascom auf die Sprünge helfen könnte.
Ich würde das 10KHz Signal mit PWM erzeugen. 1/5 DC bedeutet ja einen bestimmten PWM Wert, während das invertierte Signal dann der entsprechenden 4/5 Wert wäre. Das 100Hz Signal kannst du mit einem Timer erzeugen, also alle 5ms überlaufen lassen. In der ISR togglest du dann einen Ausgang, wenn du das Signal auch noch brauchst. Außerdem schaltest du noch zwischen den beiden PWM Werten für 1/5 DC und das invertierte 4/5 DC um.
Schon mal danke für die Antwort. Die Signale sind nicht das Problem, die erzeuge ich so wie Du schreibst. Ich beschreibe es noch mal. Das 10 KHz Signal hat ein Puls zu Pause Verhältnis von 1 zu 5, das Signal ist also kein Rechteck sondern die H Zeit ist kürzer als die L Zeit. Ich möchte keine unterschiedliche DC Höhe wie Du es wohl verstanden hast. Ich benutze Timer1, der als Zähler läuft der mit 10 KHz getaktet wird und auf einen Wert voreingestellt ist damit ich den Port unterschiedlich lang auf H schalten kann. Ich will es mal so ausdrücken 20% an, 80% aus, nur als Beispiel. Diesen Puls will ich mit einem zweiten Signal von 100 Hz verkünpfen, hier ist das Verhältnis z.B. 30% an und 70% aus. Dieses Signal macht der Timer2 als PWM. Nun soll sich das Verhältnis Plus/Pause des 10 KHz Signals umkehren solange das 100 Hz Signal H ist, also von z.B. 20% H und 80% L auf 80% H und 20% L dann wieder zurück zum alten Wert. Die Frequenz der Signale ist nur ca. wesentlich ist die Verknüpfung. Ich habe hier mal gelesen, dass das mit einer XOR Verknüpfung gemacht wurde, das Programm war aber in ASM und machte natürlich noch viel mehr was ich aber nicht brauche. Abgesehen davon das ich ASM auch nicht kann. Nur weis ich nicht wie so was in Bascom aussehen muss. Mein Programm ist mit Bascom geschrieben und macht auch noch was anderes ausser der Signalerzeugung, z.B. Tasten abfragen und einen Fotowiderstand auslesen. Ich habe ganz blauäugig gedacht Portx irgentwie XOR mit PortY ergibt an PortZ das gewünschte Signal und da komme ich nicht weiter. So eine Signalvernüpfung habe ich früher mit TTL-Gatter gelöst, daher der Gedanke. Da aber der MC schon den Rest macht und sicher auch das Gewünschte kann, wenn ich wüste wie ich ihm das beibringen soll, will ich nicht noch TTL IC verwenden. Ich hoffe das ich mein Problem nun verständlich geschildert habe und hoffe auf das Forum.
Krach-Bumm schrieb: > Nun soll sich das Verhältnis Plus/Pause des 10 KHz Signals umkehren > solange das 100 Hz Signal H ist, also von z.B. 20% H und 80% L auf 80% H > und 20% L dann wieder zurück zum alten Wert. Deswegen hat mue_c vorgeschlagen, mit jeder Flanke vom 100Hz-Signal beim 10kHz-Signal das Tastverhältnis umzuprogrammieren.
Hallo Krach-Bumm, ich habe es so verstanden (oben ist ein 122Hz Signal ca. 30% DC, unten ein 10KHz mit 20% DC, wenn 122Hz high und 80% DC, wenn 122Hz low):
@ Krach-Bumm (Gast) >Ich beschreibe es noch mal. Das 10 KHz Signal hat ein Puls zu Pause >Verhältnis von 1 zu 5, das Signal ist also kein Rechteck sondern die H >Zeit ist kürzer als die L Zeit. Auch das ist ein Rechteck. Rechteck heißt nicht, das man exakt 50% Tastverhältnis hat, auch wenn das umgangssprachlich manchmal so hingestellt wird. >Ich möchte keine unterschiedliche DC Höhe wie Du es wohl verstanden >hast. Ich benutze Timer1, der als Zähler läuft der mit 10 KHz getaktet >wird und auf einen Wert voreingestellt ist damit ich den Port >unterschiedlich lang auf H schalten kann. Ich will es mal so ausdrücken >20% an, 80% aus, nur als Beispiel. Gut. >Diesen Puls will ich mit einem zweiten Signal von 100 Hz verkünpfen, >hier ist das Verhältnis z.B. 30% an und 70% aus. Dieses Signal macht der >Timer2 als PWM. OK. >Nun soll sich das Verhältnis Plus/Pause des 10 KHz Signals umkehren >solange das 100 Hz Signal H ist, also von z.B. 20% H und 80% L auf 80% H >und 20% L dann wieder zurück zum alten Wert. Na dann nutze die ISR für den Compare Match am Timer 2, um den Compare-Wert für Timer 1 zu ändern. Das gleiche macht man mit dem Overflow von Timer 2, dort stellt man wieder den anderen Wert ein. Overflow ISR Timer 2: 100Hz PWM fängt an, 1. PWM-Wert für 10kHz PWM einstellen Compare Match ISR Timer 2: 100 Hz PWM schaltet von H auf L, 2. PWM-Wert für 10kHz PWM einstellen. >Nur weis ich nicht wie so was in Bascom aussehen muss. >Mein Programm ist mit Bascom geschrieben und macht auch noch was anderes >ausser der Signalerzeugung, z.B. Tasten abfragen und einen >Fotowiderstand auslesen. >Ich habe ganz blauäugig gedacht Portx irgentwie XOR mit PortY ergibt an >PortZ das gewünschte Signal und da komme ich nicht weiter. Geht so nicht. >Da aber der MC schon den Rest macht und sicher auch das Gewünschte kann, >wenn ich wüste wie ich ihm das beibringen soll, will ich nicht noch TTL >IC verwenden. Guter Ansatz. >Ich hoffe das ich mein Problem nun verständlich geschildert habe und >hoffe auf das Forum. Siehe oben.
Falk Brunner schrieb: > Na dann nutze die ISR für den Compare Match am Timer 2, um den > Compare-Wert für Timer 1 zu ändern. Das gleiche macht man mit dem > Overflow von Timer 2, dort stellt man wieder den anderen Wert ein. > > Overflow ISR Timer 2: 100Hz PWM fängt an, 1. PWM-Wert für 10kHz PWM > einstellen > > Compare Match ISR Timer 2: 100 Hz PWM schaltet von H auf L, 2. PWM-Wert > für 10kHz PWM einstellen. Ich habe jetzt nur den compare-Match zum Umschalten genommen. Bist du sicher, dass der OVF überhaupt eintritt?
@mue_c (Gast) >Ich habe jetzt nur den compare-Match zum Umschalten genommen. >Bist du sicher, dass der OVF überhaupt eintritt? Normaler PWM Timermodus -> echter Overflow CTC Timer Modus -> TOP Definition vom CTC (OCRA oder ICP1).
Hi
>Bist du sicher, dass der OVF überhaupt eintritt?
Kommt auf deinen PWM-Mode an. Bei den Modi mit fixem Top-Wert (8,9,10
und 16Bit) wird das TOV-Flag gesetzt. PWM-Modi mit OCRnA- oder
ICRn-Register als Top werden die Flags OCFnA bzw. ICFn gesetzt. Bei
freigegebenen Interrupts werden die auch ausgeführt.
MfG spess
Ah ok, laut DB setzt er bei normalen PWM bei Bottom das Flag. Dann geht das aber nicht mit der beschriebenen Funktionalität, weil das Umschalten des Signals ja beim Compare-Wert kommt, sowohl beim Rauf- als auch beim Runterzählen. Der OVF wäre dann auf halbem Weg. Da ist es doch einfacher, ich mache alles mit dem Compare Interrupt, so wie oben dargestellt, der ist synchron. Und wenn er exakte Frequenzen möchte, dann bliebe noch CTC. In der Compare2 ISR dann immer auch den Compare2-Wert umschalten.
@mue_c (Gast) >Dann geht das aber nicht mit der beschriebenen Funktionalität, weil das >Umschalten des Signals ja beim Compare-Wert kommt, sowohl beim Rauf- als >auch beim Runterzählen. Wieso? Fast PWM kennt kein Runterzählen. > Der OVF wäre dann auf halbem Weg. >Da ist es doch einfacher, ich mache alles mit dem Compare Interrupt, so >wie oben dargestellt, der ist synchron. Dann erreichst du aber nicht die Funktion.
Ach ja, man muss nicht mal den PWM-Wert ändern, es reicht, den PWM Modus auf invertiert/nicht invertiert zu ändern über die COMxy Bits.
Falk Brunner schrieb: > Wieso? Fast PWM kennt kein Runterzählen. Ich meinte mit "normalen PWM" Phase-correct PWM > > Dann erreichst du aber nicht die Funktion. Wieso, siehst du doch oben in dem Bild. Wobei immer mir immer noch nicht klar ist, ob es das ist, was Krach-Bumm möchte. Der Compare Interrupt wir genau dann ausgelöst, wenn das Signal umschaltet. Geht wahrscheinlich mit Fast-PWM auch. Aber da ist dann wieder kein Vorteil.
mue_c schrieb: > Hallo Krach-Bumm, > ich habe es so verstanden (oben ist ein 122Hz Signal ca. 30% DC, unten > ein 10KHz mit 20% DC, wenn 122Hz high und 80% DC, wenn 122Hz low): Genau so wie bei Dir soll das Signal aussehen, nur wie ich das mit Bascom machen soll ist mir nicht klar. Kannst Du das Prg. dafür mal hier einstellen, ist sicher auch für andere Anfänger eine Hilfe. Ich stamme noch aus der "Analogzeit" und programmiere noch nicht lange mit den Megas. AD und DA Wandler, Tastenabfragen, Signale mit dem Timer/Zähler erzeugen, Verzweigungen bekomme ich hin... Bei dem Rest den Falk s.U. beschreibt muss ich noch passen... ich habe es mit dem TCCR1A=00000000/TCCR1B=01000111 probiert weil der wohl für den Timer zuständig ist, Takt geht, mach aber wohl noch was falsch da ich nicht zum gewünschten Endergebnis komme... mit dem englischen Datenblatt komme ich mit meinen Englisch auch nicht richtig weiter. Der Takt für Timer1 als Zähler kommt über T1 (ich habe hier eine Led zur Kontrolle angeschlossen) vom Timer2. Timer2 stelle ich so ein " Config Timer2 = Pwm , Prescale = 1 , Compare Pwm = Clear Up " Die Interrupts habe ich mit "Enable Interrupts" freigegeben. Falk Brunner schrieb: > Na dann nutze die ISR für den Compare Match am Timer 2, um den > Compare-Wert für Timer 1 zu ändern. Das gleiche macht man mit dem > Overflow von Timer 2, dort stellt man wieder den anderen Wert ein. > > Overflow ISR Timer 2: 100Hz PWM fängt an, 1. PWM-Wert für 10kHz PWM > einstellen > > Compare Match ISR Timer 2: 100 Hz PWM schaltet von H auf L, 2. PWM-Wert > für 10kHz PWM einstellen. mue_c schrieb: > Ah ok, laut DB setzt er bei normalen PWM bei Bottom das Flag. > Dann geht das aber nicht mit der beschriebenen Funktionalität, weil das > Umschalten des Signals ja beim Compare-Wert kommt, sowohl beim Rauf- als > auch beim Runterzählen. Der OVF wäre dann auf halbem Weg. > Da ist es doch einfacher, ich mache alles mit dem Compare Interrupt, so > wie oben dargestellt, der ist synchron. > Und wenn er exakte Frequenzen möchte, dann bliebe noch CTC. In der > Compare2 ISR dann immer auch den Compare2-Wert umschalten. Wenn ich wüßte wie das in Bascom aussieht, wäre ich schon viel weiter... schon mal danke für die gute Hilfe... ich übe weiter.
Falk Brunner schrieb: > Poste dein Programm als Anhang, das kann man dann erweitern Hier sind meine Versuche bei denen so ein Signal wie auf dem Bild rauskommen soll. Den Rest muss ich nocht einbinden was aber erst Sinn mach wenn dieser Teil läuft. Die genauen Werte für die Timereinstellungen muss ich noch einstellen. Wie Ihr seht tue ich mich ein wenig schwehr oder stehe auf den Schlauch und sehe den Wald vor Bäumen nicht. Es wäre schön wenn hier einer den Codeschnipsel in Bascom reinstellt.
Hallo mue_c, das Signal auf dem Bild von Dir ist schon richtig. Kannst Du mir das Programm dazu mal hier reinstellen? ich bin noch nicht weiter gekommen, versuche das DB (leider in Englisch) zu verstehen wegen dem Tip mit dem comxy Bit ???? Ich denke das es dafür sicher keinen Befehl in Bascom gibt. Meinen Versuch habe ich hier eingestellt, ich versuche halt erst mal das Ding zu verstehen.
mue_c schrieb: > Für den Mega16 bei 16MHz sieht das so aus. Schon mal Danke für die Datei, ein kleines Problem habe ich noch... mein Bascom meckert bei den Befehlen: Line:8 Compare_a und bei Line:17 Clear_timer mit jeweils "Unknown Config parameter" Gibt es da bei den Bascomversionen Unterschiede? Meine ist die 2.0.7.1 Wenn ich den regfile ändere, läuft das Prg. dann auch auf einen Mega8? ich denke die unterscheiden sich nur im Speicher, stimmt das? Mal eine Frage am Rande, gibt es über Bascom und die AVR auch was in deutsch das auf die Befehle eingeht damit ich nicht immer so viel fragen muss.
Das die Pins anders belegt sind für OC1A auf BP1 und OC2 auf PB3 habe ich schon den DB entnommen.
In der 2.0.7.1 werden die Timer Optionen noch mit einem Leerzeichen anstelle des Unterstrichs verwendet. Es gibt natürlich noch ein paar mehr Unterschiede zwischen dem M8 und dem M16. Aber das Programm wird so laufen. Wenn du einen anderen Takt verwendest, musst du allerdings auch die Werte für ICR1, OCR1A und OCR2 proportional anpassen.
Danke mue_c, habe die Unterstriche durch Leerzeichen ersetzt und das Prg. läuft. Die Anspassung zum Mega8 habe ich auch hingekriegt, ist ja nur die andere Pinbelegung. Jetzt geht es an den genauen Takt da ich dem Mega8 mit 8 MHz ohne Quarz laufen lassen möchte. Da ich jetzt dein Prg. habe, komme ich bestimmt schnell weiter. Mit meinen Prg. habe ich sicher unnötige Klimmzüge versucht, lag wohl daran das ich mit dem englischen DB nicht zurecht kam. Noch eine Frage, ist meine Bascomversion stark veraltet? Die war bei meinem AVR-Buch dabei, ich werde mal nach einem Update suchen. Gibt es eigenlich eine Version in Deutsch? habe leider noch keine gefunden. Für das Buch muss ich ja die alte Version nutzen wegen der Prg. Beispiele und für hier besser die Neue. Gibt es da noch mehr Unterschiede? ich denke das ich da Probleme mit meinen restlichen Programmteil bekomme. Noch mal danke für die gute Unterstüzung hier. Das Forum ist für mich als Anfänger eine grosse Hilfe.
Hallo mue_c, ich brauche noch mal Deine Hilfe. Zu den 100 Hz. die der Timer2 erzeugt brauche ich als unterste Frequenz 50 Hz, das habe ich mit 8 MHz. Takt und Prescale 1024 sowie OCR2 auf 148 in etwa hinbekommen. Das Problem ist, das die Austastung bei 50 Hz nur 150 µS dauern darf weil die andere Frequenz hierbei ca. 15 KHz ist. Mit der kleinsten Diverenz bei OCR2 von 1 komme ich nur auf min. 250 µS, das ist leider zu lang. Kann man Timer1 und Timer2 tauschen? Timer1 hat ja 16 Bit und daher kleinere Schritte. Mit Timer2 kann ich ja die Takte bis ca. 15 KHz sicher auch erzeugen. Dann ist ein weiteres Problen dass, das vom Timer1 erzeugte Signal nicht stabil zur Austastung durch Timer2 ist, das Signal läuft so das sich die Dauer vor und nach der Austastung immer verändert, wie ich auf dem Scope sehe. Das mag die Auswerteschaltung nicht und ihr Signal jittert daher. Ich habe das alte TTL- Grab noch mal untersucht und festgestellt das ich das hohe Signal nur austasten muss und nicht extra umtasten, gelöst habe ich das in dem ich den Befehl in der ISR auf "Toggle TCCR1A1" geändert habe. Da war ich schon mal erfreut das ich das DB hier wohl verstanden hatte. Die Umschaltung in der alten Schaltung läuft über Zähler die den "hohen Takt" als Zeitgeber zählen, dann nach X Takten, die eben für z.B 50 Hz oder 100 Hz nötig sind, für die nächsten Y Takt die Austastung erzeugen. Ich denke, es könnte so sein das ein Timer den Takt erzeugt, der andere Timer zählt bis X erzeugt die Austastung und setz sich nach weiteren Y Takten zurück, geht so was? Die Umschlatung der einzelnen Frequenzen will ich lösen in dem ich die Werte für ICR1, Ocr1A, OCR2 als Variable definiere, Tasten abfrage und die Variale beim dücken der Taste entsprechend übergebe. Das ist aber erts der näschte Schritt, getestet habe ich diese "Funktion" schon mal, habe es hinbekommen. Jetzt muss ich erst noch mal an die Takte ran, mit Deinem "Grundprogramm" hast Du mir schon sehr gut geholfen. Auf den Mega8 habe ich das Prg. von Dir schon angepasst. Ich hoffe das ich Dich nicht mit meinen Anfängerfragen nerve.
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.