Forum: Mikrocontroller und Digitale Elektronik PWM an Ausgangspin erzeugen


von Step H. (step_h)


Lesenswert?

Hallo,

ich versuch krampfhaft ein PWM Signal an einem Ausgangspin meines 
Controllers zu erzeugen.

Ich verwende einen AT89C5131 von Atmel.

Wie ich die einzelnen Pins anspreche das sie 1/0 sind habe ich 
rausgefunden.
Leider sind meine Programmierkenntnisse überschaubar.

Ich möchte dieses Signal nutzen um einen Servo anzusteuern aber das ist 
noch Zukunftsmusik.

Zuerst möchte ich einen Pin als Pwm Pin festlegen und ein Signal 
erzeugen das ich messen kann.

Mir fehlt leider die Idee wie der C51 Syntax dafür aussehen könnte.

Für eure Hilfe wäre ich dankbar.....

von Sven J. (svenj)


Lesenswert?

Moin,

dürfte bei der Kiste das "PCA" programmable counter array erledigen.

Wenn du die Pins schon toggeln kannst, ist dir das setzen von Registern 
bekannt. Such dir in der Doku den Teil über die PCA und fütter die 
Register, insbersondere CCPAM, um die Zähler in den PWM Modus zu 
bringen.

Die Ausgangspins sind allerdings nicht frei wählbar, jeder Zähler hat 
einen festen Ausgang: CEXn, wobei n von 0 bis 4 geht.


--
 SJ

von Step H. (step_h)


Lesenswert?

Hi,

danke erstmal auch wenn mich deine Antwort erstmal überfordert hat.

Meinst du mit füllen der Register, dass ich Diese dann im Quellcode über 
Interrupts aufrufen muss oder bin ich da komplett auf dem Holzweg?!

von Karl H. (kbuchegg)


Lesenswert?

Step Han schrieb:
> Hi,
>
> danke erstmal auch wenn mich deine Antwort erstmal überfordert hat.
>
> Meinst du mit füllen der Register, dass ich Diese dann im Quellcode über
> Interrupts aufrufen muss oder bin ich da komplett auf dem Holzweg?!

Na ja.
du wirst ja wohl schon irgendwas mit deinem µC gemacht haben, oder 
nicht?
zb eine Popel-LED eingeschaltet oder ausgeschaltet. einen Pin abgefragt. 
Irgendwas.

Dazu musstest du Werte in ein Register schreiben, bzw. ein einzelnes Bit 
gezielt in einem Register auf 1 oder 0 setzen.

Und hier sind das auch nur Register. In dem Fall dann eben 
Konfigurationsregister. Du schreibst in einem bestimmten Register ein 
bestimmtes Bit auf 1 und das bewirkt dann etwas.
Was das bewirkt steht im Datenblatt, in dem du die Beschreibung aller 
für eine bestimmte Funktionalität wichtigen Register findest. Dort 
wählst du die Funktionalität aus, die du haben willst, stellst fest 
welche Bits in welchem Register zu setzen sind und ... dann setzt du sie 
einfach in deinem Programm.
genauso wie du zum Ein/AUsschalten einer LED eben wieder anderer Bits in 
einem anderen Register gesetzt hast.

von Step H. (step_h)


Lesenswert?

Danke....

das heisst also wenn im Datenblatt steht "PWM(CCAPMn.1) enables the 
pulse with modulation mode"  dann muss ich dieses Register auf "1" 
setzen um es anzusprechen....??

Wie lautet denn dann der Befehl im Quellcode?
Mit welchen Befehlen lege ich die Zeiten im PWM-Mode fest??

Benötige ich grundsätzlich keine Interrupts um PWM auszugeben??

BZW. geht das alles im Hauptprogramm.....

von fly (Gast)


Lesenswert?

Im Tutorial gibt es sogar was über PWM und Servos.

von Sven J. (svenj)


Lesenswert?

Moin,

wenn du Fragen zum "Quellecode" stellst, solltest du fairerweise 
zumindest die Sprache und das ggf. den verwendeten Compiler angeben.

Ansonsten funktioniert das genauso wie auch das beschreiben der Register 
der I/O Pins.

Warum bist du eigentlich so auf Interrupts fixiert? Die PCA ist eine 
eigene Einheit im Controller. Wird über die Register parametriet, sprich 
eingestellt, und KANN auch Interrupts erzeugen. Nur wozu? Die Zeiten 
werden über das Compare Register gesteurt; die Abbildung ist da recht 
hilfreich.

--
 SJ

von Step H. (step_h)


Lesenswert?

Sorry,

ich verwende RIDE 7 und die Sprache ist C51....

ich bin keineswegs auf Interrups fixiert....
Ich dachte man kann die Register nur so ansprechen...

Kann mir bitte jemand ein kleines Beispiel zeigen wie der Syntax zum 
Aufruf eines Gegisters aussieht....

Ich habe folgende Angaben aus dem Datenblatt: PCA Time/counter Module 4
                                              CCAPMN.1 enables PWM mode
                                              CEX

nur weis ich nicht wie ich etwas mit diesen Angaben anfange....

von Sven J. (svenj)


Lesenswert?

Moin,

das ist leider sehr davon abhängig, wie das dein Compiler macht, bzw. 
wie die Libraries gestaltet sind.

Gegenfrage:
wie hast du denn die Ports geschaltet? Normalerweise sind das auch 
Register und genauso lassen sich auch die Steuerregister der PCA setzen.

Aus dem Fragment das du angegeben hast läßt sich kaum etwas ableiten, 
die mittlere Zeile bedeutet halt, das im Registr CCAPMN das 1te. bit 
gesetzt werden muss um das entprechenden Modul in den PWM Modus zu 
versetzen.

CEX ist der Ausgang eines der Module.
(Wenn ich das Sheet so grob überfliege)

--
 SJ

von Step H. (step_h)


Lesenswert?

Hi,

danke für die Antwort...

ich hab den Quellcode jetzt grad nicht zur Hand aber ich habe:

#define LEDPort P1 // P1 ist eine LED Reihe mit den LEDs P1.....P7, ist 
im .h der Schule so festgelegt

P1 = 0x00 // alle LEDs aus


dann: jeweils einzelene LEDs in einer while Schleife auf 1 bzw 0 
gesetzt.

Den Wert der LEDs kann dann durch einen Befehl(weis ich grad nicht) an 
die Pins übergeben werden, die in Reihe zu den LEDs liegen.....

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.