Tag Forum, hat jemand eine Idee, wie mit einem 8515 a. eine feste Frequenz aber mit b. einem variablen Puls-Pausenverhältnis erzeugen kann? Das Puls Pausenverhältnis soll von aussen über ein 4bit Wort einstellbar sein. Dank schon mal, Günter König
Hi Andreas, ich glaube, es ist gelungen. Hatte da noch mal eine Idee und die scheint zu funktionieren.Ich kann jetz unterschiedliche Werte für das Puls - Pausenverhältnis einstellen. Aber wie meintest du das mit den Timern? Gruß, Günter
Hi der AT90S8515 kann mit dem Timer 1 ein PWM-Signal mit bis zu 10-Bit per Hardware erzeugen. D.h. du beschreibst ein paar Register und der Rest macht der Chip für dich. Matthias
Moin Matthias, wie meinst du denn das "beschreib ein paar Register..." ? Leider habe mich mich mit den Timerfunktionen noch nie auseinandergesetzt. Gibts ein paar Beispiele? Gruß, Günter
Hi TCCR1A = 0xF3; OCR1A = 256; OCR1B = 768; TCCR1B = 0x01; Dann solltest du an Pin 15 und an Pin 29 eine PWM mit 25% bzw. 75% Puls/Pausen-Verhältnis haben. Matthias
Hallo Matthias, habe es mal ausprobiert und klappt gut. Feste Frequenz und Duty Cycle variabel. Soweit alles klar, aber leider liege ich mit der Frequenz im günstigsten Fall bei 244 Hz (4MHz Takt). Ich benötige aber einen Wert zwischen 70 und 100 Hz. Mit der Einstellung über TCCR1B klappt das nicht. Ich habe das Teilerverhältniss jetzt auf $02 stehen (/8), die nächste Stufe wäre /64. Gibt es da noch einen Trick? Auf jeden Fall danke erstmal, du hast mir auf jeden Fall mächtig gewaltig geholfen, Gruß, Günter
Hi Teiler durch 64 und Auflösung reduzieren 4000000/64=62500Hz 62500/510=122Hz (TCCR1A = 0xF1) 62500/1022=61Hz (TCCR1A = 0xF2) Matthias
Alles klar Matthias, das hatte ich mittlerweile schon soweit rausgefunden. Nun aber sei mir doch noch eine Frage gestattet: Welche Gesetzmäßigkeit steckt dahinter? Wie sind die Abhängigkeiten der Registerinhalte OCR1A und OCR1B auf das Puls-Pausenverhältnis? Ich habe da schon einige Zeit probiert, finde aber den Faden nicht...... Ich hatte mal eben einen Motor angeschlossen (über FET-Schalter), brummt zwar etwas bei 61Hz, zieht aber ganz gut durch. 122Hz sind etwas zu hoch. So denn, Günter
Hi Matthias, wie ist es nun mit den Zusammenhängen? Ganz so einfach ist das wohl doch nicht. Gruß, Günter
Ließ dir mal das Datasheet durch. Da steht alles gut beschrieben. Die genaue Funktion ist von den PWM-Bits abhängig. Normale PWM zählt z.B. hoch, bis der OCR Wert erreicht ist. Dann schaltet er den OCR-Pin um, zählt weiter bis TOP(0xFFFF). Dann zählt er wieder runter schaltet beim erreichen von OCR den Pin wieder um, zähl bis er bei 0 ist. -> Beginnt von vorne. Netman
Hi Netmann, ich habe da mal was über PWM gefunden und das .asm Listing etwas angepasst. Das funktioniert auch recht anständig soweit, das ich beliebige Frequenzen ("Bereiche") mit beliebigem Tastverhältnissen erzeugen kann. Das ist eigentlich genau das was ich auch wollte. Ich habe das Listing mal angehängt weil leider eines nicht funktioniert, nämlich: ändere ich über die .set Direktrive die Impuls/Pausen Zeiten in der Main-Schleife ein weiteres mal, sind diese Werte sofort gültig. Beispiel: zu Beginn der Main-Schleife steht .set impuls = 200 .set Pause = 6466 und nach einer Warteschleife (z.B. 500mS) folgt .set impuls = 3333 .set pause = 3333 dann ist diese letzte Einstellung sofort gültig. Es liegt sofort eine Frequenz von 76 Hz mit einem Tastverhältniss von 50% an PD5 an. Eigentlich sollte es so sein, das zuerst eine Frequenz von 76 Hz mit Tastverhältnis von 3% anliegen soll. (Zu einem späteren Zeitpunkt wird anstelle der Warteschleife eine Abfrage eines Eingangsports stehen von dem die Werte Impuls/Pause abhängen). Kann mir da jemand nochmal helfen? Dank und Gruß, Günter
.set ist eine Assemblerdirektive, d.h. der Assembler setzt überall wo er im Assemblercode das Wort "impuls" findet die Konstante (!) 3333 ein. Logisch dass man diese zur Laufzeit nicht ändern kann. Um eine variable PWM zu realisieren musst du diese Konstanten durch Register(paare) ersetzen und die Befehle ändern welche diese Konstanten verwenden (ldi -> mov, subi -> add, sbci -> adc).
Hallo Andreas, wenn ich das richtig verstanden habe, handelt es sich bei .equ und .set um Direktriven wobei die Anweisung .equ sich so verhält wie du beschriebst. Ich meine bei .set kann ich die Werte während des Laufs ändern. oder unterliege ich einem grandiosem Irrtum??? Günter
Vielleicht helfen die beiden folgenden Beispiele: 1) .set bla = 1 ldi r16, bla .set bla = 99 ldi r16, bla Hier wird einmal 1 und einmal 99 in das Register geladen. 2) .set bla = 1 ; für alle bla bis zum nächsten set wird 1 ; eingesetzt unterprogramm: ldi r16, bla ; hier steht also eine 1, egal was später passiert ret main: rcall unterprogramm .set bla = 99 ; dieses .set interessiert keinen, da ab hier ; kein "bla" mehr vorkommt! rcall unterprogramm Hier wird zwei mal 1 in das Register geladen. Klar?
Danke Andreas, aber bedeutet das nicht, das wenn ich folgendes schreibe: main: .set bla = 1 rcall UP1 ldi r16, bla ret delay, irgendwas .set bla = 99 rcall UP1 ldi r16, bla ret delay, wieder irgendwas rjmp main das wechselweise in R16 1 und 99 geschrieben wird?
Ja, aber das Unterprogramm UP1 merkt keinen Unterschied ob bla beim Aufruf als 1 oder als 99 definiert ist.
mmmmmmh, seltsam, eine Ausgabe auf einem Port würde also immer das gleiche Bitmuster (00000001) ergeben?
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.