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
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
Hallo MS, Danke für deine Info. Ich habe nur leider vergessen, dass ich das Beispiel in C-Code benötige. Früße Sam
Hallo, Tip: Der Microchip Code Configurator (MCC) stellt dir in MPLABX C-Code für HW-Module zusammen Gruß MS
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.
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.
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.
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.