Forum: Mikrocontroller und Digitale Elektronik Signalwechsel ATMeg


von Krach-Bumm (Gast)


Lesenswert?

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.

von mue_c (Gast)


Lesenswert?

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.

von Krach-Bumm (Gast)


Lesenswert?

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.

von Mr. Tom (Gast)


Lesenswert?

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.

von mue_c (Gast)


Angehängte Dateien:

Lesenswert?

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):

von Falk B. (falk)


Lesenswert?

@ 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.

von mue_c (Gast)


Lesenswert?

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?

von Falk B. (falk)


Lesenswert?

@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).

von Spess53 (Gast)


Lesenswert?

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

von mue_c (Gast)


Lesenswert?

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.

von Falk B. (falk)


Lesenswert?

@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.

von Falk B. (falk)


Lesenswert?

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.

von mue_c (Gast)


Lesenswert?

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.

von Krach-Bumm (Gast)


Lesenswert?

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.

von Falk B. (falk)


Lesenswert?

Poste dein Programm als Anhang, das kann man dann erweitern.

von Krach-Bumm (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Krach-Bumm (Gast)


Lesenswert?

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.

von mue_c (Gast)


Angehängte Dateien:

Lesenswert?

Für den Mega16 bei 16MHz sieht das so aus.

von Krach-Bumm (Gast)


Lesenswert?

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.

von Krach-Bumm (Gast)


Lesenswert?

Das die Pins anders belegt sind für OC1A auf BP1 und OC2 auf PB3 habe 
ich schon den DB entnommen.

von mue_c (Gast)


Lesenswert?

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.

von Krach-Bumm (Gast)


Lesenswert?

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.

von Krach-Bumm (Gast)


Lesenswert?

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.

von Krach-Bumm (Gast)


Lesenswert?

Hallo mue_c liest Du noch mit? ich komm nicht weiter.

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.