Forum: Mikrocontroller und Digitale Elektronik PWM PIC16F873A


von SaKiDi (Gast)


Lesenswert?

Hey ihr,

ich habe eine Problem, dass bei dem PIC16F873A die PWM nicht zum laufen 
bekomme, bzw. nicht weiß wie ich die Register beschreiben muss.

Gibt es hier jemand, der mir einen Beispielcode posten kann?

Für einen ganz normale PWM mit extrenem Oszilator.

Danke schon mal

Grüße Sam

von ms (Gast)


Lesenswert?

Hallo,

einmal Initialisieren:
Timer2:
  bcf STATUS,RP0
  clrf T2CON
  clrf TMR2
  bsf STATUS,RP0
  movlw D'249'    ;@4MHz ca. 250Hz
  movwf PR2
  bcf STATUS,RP0
  bsf T2CON,T2CKPS1
  bsf T2CON,TMR2ON
PWM1:
  bcf  STATUS,RP0
  clrf CCPR1L
  movlw B'00001100'
  movwf CCP1CON

in Programmschleife:

PWM Wert in Register laden:
  movlw LOW ???
  movwf CCPR1L
  movlw HIGH ???
  movwf CCPR1H


Gruß MS

von SaKiDi (Gast)


Lesenswert?

Hallo MS,

Danke für deine Info.

Ich habe nur leider vergessen, dass ich das Beispiel in C-Code benötige.

Früße Sam

von ms (Gast)


Lesenswert?

Hallo,

Tip:
Der Microchip Code Configurator (MCC) stellt dir in MPLABX
C-Code für HW-Module zusammen

Gruß MS

von SaKiDi (Gast)


Lesenswert?

Danke,

leider kann ich den MCC nicht starten...

Grüße Sam

von Thomas E. (picalic)


Lesenswert?

SaKiDi schrieb:
> leider kann ich den MCC nicht starten...

Tja, wahrscheinlich hat der Lehrer Dir die Aufgabe absichtlich für den 
PIC16F873A gestellt, damit Du Dir den Code nicht einfach vom MCC 
erzeugen lassen kannst. Ein wichtiges Lernziel ist nämlich, sich anhand 
von Hersteller-Dokumentation, wie z.B. Datenblätter, selbst Wissen zu 
erarbeiten. Wenn man damit mal anfängt und dann evtl. konkrete Fragen 
hat und nicht nur einfach "geht nicht" als Info zur Verfügung stellt, 
gibt es bestimmt hier auch Hilfestellungen.

von Teo D. (teoderix)


Lesenswert?


von SaKiDi (Gast)


Lesenswert?

Hallo Thomas,

ich muss dich enttäuschen, es ist ein Bastelprojekt, um Impulszeiten 
darzustellen, welche ich auf Knopfdruck ändern sollen.

Leider habe ich aber mit dem PIC16F873A ein generelles Problem, das ich 
die PWM nicht zum laufen bekomme.

Hätte mit jemand ein Beispiel oder Hilfreiche Tipps?

Grüße

Beitrag #5623022 wurde von einem Moderator gelöscht.
von Fred R. (Firma: www.ramser-elektro.at/shop) (fred_ram)


Lesenswert?

Hast du dich auf Sprut.de in die Materie eingelesen?

von PICs? How quaint! (Gast)


Lesenswert?

Im Datenblatt in Kapitel 8.3, Abschnitt 8.3.3 steht genau was gemacht 
werden muss um PWM zu konfigurieren:

http://ww1.microchip.com/downloads/en/DeviceDoc/39582C.pdf

Erstens, für PWM ist nur TIMER2 vorgesehen.

TIMER2 Prescaler muß konfiguriert werden. Siehe Abschnitt 7.0. bits 0-2 
sind dafür zuständig. Bit2 muß gesetzt werden um T2 einzuschalten. Bits 
0/1 sind für den Prescaler verantwortlich. Für Prescaler Wert von 16, 
schreib in T2CON den Wert 0x07. Damit läuft der T2 mit einem Viertel 
aeiner Quarzfreqenz dividiert durch den Prescaler Wert.

Für Schritt 1 ist Tabelle 8.3 zuständig wo man die Periode der PWM 
vorwählen kann. Diese Tabelle gibt einige Beispiele dafür. Für diesen 
Wer ist PR2 zuständig. Z.B. PR2= 0xFF für 1.22kHz mit Timer2 Prescaler 
Wert von 16 T2CON.

Zum setzen der PWM sind Register CCPR1L and CCP1CON<5:4> zuständig um 
mit 10-bit Breite den PWM Periodenwert zu setzen. Dazu sind zwei 
Register notwendig da 10-bit nicht in CCPR1L passen. So müssen also die 
oberen zwei bits in Bitstellen 5/4 im CCP1CON Register plaziert werden.

Die CCP1CON bits müssen geORed und geANDed werden um die restlichen Bits 
nicht zu beeinflussen.

Zum setzen: CCP1CON |= (1<<5) | (1<<4);
Zum Rücksetzen CCP1CON &= 0xCF; um bits 5 und 4 auf Null zu setzen. Das 
muß vor dem Setzen der Bits passieren.

Der PWM output pin muss noch als Ausgang mit dem assozierten TRIS 
Register aktiviert werden. (Port TRIS bit dazu auf null setzen).

Versuch das mal mit eigenen Code. Da die Addressen/Zeiger auf die SFR 
register in den meisten Compiler header Dateien schon vordefiniert sind, 
brauchst Du nur diese Register nach Studium dieser Register im 
Datenblatt die Bits setzen oder rückstellen.

Z.B PR2 = 0XFF;

Zum setzen/Rücksetzen ohne andere Bits zu zerstören mache das mit OR und 
AND Operators und Bit shiften.

CCP1CON |= (1<<n) |... wo n die Bit Offset von Null bestimmt. N=1 
bezieht sich auf das zweite Bit von rechts gezählt. Null ist das erste 
Bit(LSB).

Die Bitsymbole kannst Du mit #define selber definieren wenn die Header 
Datei es nicht schon machte. Z.B.

#define TIM2ON 2

Dann, TIM2CON |= (1<<TIM2ON); // Turn T2 on

Endlich sieht das dann so aus in Deinem Programm:

...

T2CON |= (1<<TIM2ON) | (1<<T2CKPS1); // Timer 2 ein mit Prescaler =16
PR2=0xFF; // PWM Periode 1.22 KHz (Tabelle 8.3)
// Für Pwm Wert von 50%, Wert ist 511 (0x01FF)
CCPR1L = 0xFF; // 8-Bit Portion von 511
CCP1CON = (1<<4); // MSB bits 8 und 9
...
TRISC &= ~0x02; // setze RC2 als Ausgang

Die PWM ist dann auf RC2 ausgegeben. Wenn Du dann ein LED an pin RC2 
anschließt kannst Du die Helligkeit mit dem Wert der PWM steuern.

von kyrk.5 (Gast)


Lesenswert?


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.