hey leute!
kenn mich nicht so gut aus und wollte fragen, ob sich jemand mein
programm ansehen könnte!
möchte per software eine PWM erstellen! leider macht der controller gar
nix!
könnte mir jemand sagen, was ich falsch mache??
hätte da noch eine frage zu den interrupt nummern!
woher weiß ich denn, welche nummer für welchen interrupt ist?
hab nen at89s4051 aber im datenblatt hab ich da auch nix gefunden...
Danke!!
mfg
chris
> möchte per software eine PWM erstellen! leider macht der controller gar nix!
Was heisst "er macht gar nix?" Er läuft nicht, oder dein Programm tut
nicht? Kannst du ne LED oder so ansteuern, dass du siehst, ob er
überhaupt tut?
> könnte mir jemand sagen, was ich falsch mache??
Ja, kann ich...
Du schaltest die beiden Timer in den Counter-Betrieb (TMOD = 0x55), was
du brauchst ist der Timer-Betrieb. (TMOD = 0x11).
Was heisst "per Software"? Willst du wirklich von Hand eine PWM
erzeugen, oder mit der integrierten PWM Funktion?
Falls PWM Funktion:
Datenblatt, Seite 14, Kapitel 16. Da steht alles beschrieben.
> woher weiß ich denn, welche nummer für welchen interrupt ist?
Unter der Annahme, dass du den Keil C51 Compiler verwendest:
Guckst du hier: http://www.keil.com/support/docs/1150.htm
Und hier: http://www.keil.com/appnotes/files/apnt_103.pdf
Hoffe, ich konnte helfen :)
Falls noch Fragen sind, her damit.
Ralf
danke ralf für die hilfe :)
das problem ist das, ich brauche 2 PWM, kann aber mit dem kontroller nur
eine erzeugen über die beiden timer! jetzt brauch ich eine alternative!!
LEDs kann ich ansteuern, hab ich auch schon gemacht!
und wenn ich mit der PWM arbeite, funkt es auch!
danke, jetzt funktionierts :)
jetzt muss ich es nur mehr so umschreiben, dass ich es für 2 pwm nutzen
kann :)
VIELEN DANK FÜR DIE HILFE :)
> das problem ist das, ich brauche 2 PWM, kann aber mit dem kontroller nur> eine erzeugen über die beiden timer! jetzt brauch ich eine alternative!!
Ah, okay. Jetzt wirds klarer, weil 2 PWMs, das hab ich nicht gewusst.
Hm, gibt es irgendwelche Gemeinsamkeiten der beiden PWMs? Z.B. gleiche
Frequenz. Dann könntest du Timer0 in Mode3 setzen und hast zwei
getrennte 8-Bit-Timer, macht zusammen mit Timer1 drei Timer. Allerdings
ist Timer 1 dann ein bisschen in der Funktion eingeschränkt.
Je nachdem, wie genau die ganze Sache werden muss, kannst du es auch mit
beiden Timern normal lösen. Wenn beide PWMs die gleiche Frequenz haben,
macht ein Timer die Grundfrequenz, und triggert damit den anderen Timer.
Der andere Timer handelt beide PWMs ab.
Es geht auch mit nur einem Timer, je nach Ansatz und Anforderung an die
Genauigkeit.
Ralf
naja die anforderungen sehen so aus, dass ich 2 PWM für servo regler
brauche!
die brauchen eine periodendauer von T = 20 ms und die pulsweite variert
von 1-3 ms glaub ich! aber dein vorschlag hört sicher sehr gut an, werd
das mal versuchen! das einzige, was noch schwierigkeiten machen könnte
ist das signal, es wird nämlich über bluetooth und ner RS232 auf den µC
übertragen, muss also immer das jeweilige signal (impuls) anpassen!
gibts für die timer geschichten vll irgendwo was fertiges zum
ausprobieren/testen?
danke
chris
Okay, dann könnte ein Ansatz für Verwendung von einem Timer wie folgt
aussehen:
Der Timer wird auf 1ms Sekunden eingestellt. Du verwendest für jeden
Servo zwei Variablen + eine Variable für das Zählen von 20ms.
In den Servo-Variablen steht die Anzahl ms, für die der zugeordnete
Portpin auf high gehen soll. Du brauchst jeweils zwei Variablen, eine
für das Hauptprogramm, eine für den Interrupt (wg. Synchronisation).
Bei jedem Timer-Interrupt vergleichst du die Servo-Variablen auf 0. Sind
sie ungleich 0, setzt du den Portpin und zählst sie runter. Ist eine 0
geworden, löscht du den entsprechenden Portpin. Ist eine Variable 0, so
machst du nix (für den entsprechenden Servo).
Du musst im Timer-Interrupt auch prüfen, ob du die 20ms erreicht hast,
dazu brauchst du die zusätzliche Variable. Wenn du 20 Durchläufe
erreicht hast, holst du die Werte der Servovariablen des Hauptprogramms
in die Variablen des Interrupts und das Spiel geht von vorne los.
Du könntest auch eine Servovariable nehmen, das hat aber den Nachteil,
dass dir ein Servo zweimal innerhalb der 20ms angehen könnte, wenn das
Hauptprogramm die Werte neu schreibt.
Hoffe, das hilft ;)
Ralf
> ...die pulsweite variert von 1-3 ms
Sorry, zu spät registriert. In dem Fall musst du natürlich dafür sorgen,
dass die Variablen nicht auf 0 geprüft werden, sondern auf 1.
Desweiteren ist die Auflösung eines Servos natürlich mit einem
1ms-Timers bescheiden (Voll links/rechts oder Mittelstellung). Dazu
müsstest du dann eine kleinere Zeitbasis mit dem Timer machen (z.B.
250µs), und die entsprechenden Werte natürlich vergrößern (also nicht
auf 20ms prüfen, sondern auf 20ms/TB -> TB = Zeitbasis des Timers).
Ralf
danke ralf!
hat mir sehr geholfen!
hatte eigentlich auch den selben gedanken! ;)
bin noch net ganz fertig mit den programm, aber ich denke es müsste
funktionieren!!
thx
Hi Chris,
die Lösung ist nicht erprobt, da gibts sicher noch
Optimierungsmöglichkeiten, oder sogar bessere Ansätze.
Aber du kannst ja deine Ergebnisse hier bzw. in der Codesammlung posten.
Wäre nett, wenn du uns (mich) auf dem laufenden hältst...
Ralf
chris wrote:
> naja die anforderungen sehen so aus, dass ich 2 PWM für servo regler> brauche!> die brauchen eine periodendauer von T = 20 ms und die pulsweite variert> von 1-3 ms glaub ich!
Du kannst die Pulse einfach nacheinander erzeugen.
In die 20ms passen dann bis zu 6 Impulsausgänge.
Peter
hey leute!
hab das mit der soft PWM versucht, aber da geht gar nix :(
weiß auch leider nicht, wo ich meinen fehler mache!
kann mir wer helfen??
bin am verzweifeln!
hoffe ihr könnt mit der beschreibung des programmes was anfangen!
nach mehreren versuchen, hab ichs noch immer nicht hinbekommen!
denke, mein fehler liegt in der periodendauer!
verwende einen quarz mit 12,5 MHz
der wird intern druch 12 dividiert (maschinen zyklus)
bleibt 1 MHz, ergibt einen zyklus von rund 1µs
ich hoffe so weit hab ichs noch richtig!
wenn ich jetzt zb eine T = 20 ms brauche, muss ich von meine 65535 -
20000 rechnen, oder? ergibt 45535 und das wäre dann mein startwert für
den timer
stimmt das? bin schon ganz durcheinander...
mfg
chris