Forum: Mikrocontroller und Digitale Elektronik PWM initialisieren PIC24F


von Blinky (Gast)


Lesenswert?

Hallo zusammen,

ich befasse mich seit ein paar Wochen mit der Programmierung des 
PIC24FJ64GA004 von Mircochip.
Nun stehe ich vor der Aufgabe eine PWM zu erzeugen, die ich über einen 
Ausgangs-Port ausgeben muss.
Da ich mich vorher noch nie damit beschäftigt hatte, habe ich mich im 
Handbuch über die Initialisierung schlau gemacht und bin dort auf 
folgende Beispielinitialisierung gestossen:

// The following code example will set the Output Compare 1 module
// for interrupts on the continuous pulse event and select Timer 2
// as the clock source for the compare time-base. It is assumed
// that Timer 2 and Period Register 2 are properly initialized.
// Timer 2 will be enabled here.
OC1CON = 0x0000; // Turn off Output Compare 1 Module
OC1CONbits.OCM = 0x0005; // Load new compare mode to OC1CON
OC1R = 0x3000; // Initialize Compare Register1 with 0x3000
OC1RS = 0x3003; // Initialize Secondary Compare Register1 with 0x3003
IPC0bits.OC1IP0 = 1; // Setup Output Compare 1 interrupt for
IPC0bits.OC1IP1 = 0; // desired priority level
IPC0bits.OC1IP2 = 0; // (this example assigns level 1 priority)
IFS0bits.OC1IF = 0; // Clear Output Compare 1 interrupt flag
IEC0bits.OC1IE = 1; // Enable Output Compare 1 interrupts
T2CONbits.TON = 1; // Start Timer2 with assumed settings

als Ausgangsport verwende den Pin RP18

_TRISC2=0; //RP18 output
_RP18R=18 //OC1


Das Compilieren funktioniert einwandfrei.
Doch beim anschließenden Debug-Versuch mit dem ICD3 bekomme ich nach 
Klicken auf den RUN-Button sofort die Rückmeldung "TARGET HALTED" und 
und das Debuggen wird abgebrochen.

Meine Frage nun: Was mache ich falsch?

Vielen Dank schon mal im voraus für Eure Hilfe!

Gruß
von Markus L. (ichkg)


Lesenswert?

du hast vermutlich vergessen den Interruptroutine für OC1 zu 
Programmieren
1
void __attribute__((__interrupt__)) _OC1Interrupt(void);
2
void __attribute__((__interrupt__, auto_psv)) _OC1Interrupt(void)
3
{
4
   IFS0bits.OC1IF = 0;   //Clear the OC1 interrupt flag
5
}
von Anja (Gast)


Lesenswert?

Blinky schrieb:
> Meine Frage nun: Was mache ich falsch?

Warum willst du unbedingt PWM mit der CCP-Unit anstelle Timer3 und der 
PWM-Unit machen?
Im folgenden ein Beispiel für den PIC24FJ64GA002 (die Pin-Bezeichnungen 
können ggf. abweichen).

Gruß Anja
1
/*
2
* PIC24FJ64GA002 13.1072 MHz Fcy (6.5536 MHz XTAL)
3
*/
4
    #define T3CON_INIT 0x8000 /* Start Timer with Prescaler 1:1 */
5
6
    TRISA = 0x0000;  /* PORTA as output */
7
    TRISB = 0x0200;  /* PORTB as output RXD as input */
8
    LATA  = 0x0000;
9
    LATB  = 0x0000;
10
11
    TMR3  = 0;
12
    PR3   = -1;          /* period = full 16 bit PWM */
13
    T3CON = T3CON_INIT;  /* start timer */
14
    /* set up OC1CON for PWM0 */
15
    OC1CON   = 0x0E; /* use Timer3 for PWM0 fault pin disabled */
16
    OC1RS    = 0x0000;  /* 0% Duty */
17
18
    /* set up OC2CON for PWM1 */
19
    OC2CON   = 0x0E; /* use Timer3 for PWM1 fault pin disabled */
20
    OC2RS    = 0x8000;  /* 50% Duty */
21
22
    /* set up OC3CON for PWM2 */
23
    OC3CON   = 0x0E; /* use Timer3 for PWM2 fault pin disabled */
24
    OC3RS    = 0xF800;  /* 97 % Duty */
25
26
    /* unlock PPS routing registers */
27
    __builtin_write_OSCCONL(OSCCON & 0xbf);
28
29
    /* routing OC PINs */
30
    PPSOutput(PPS_RP5, PPS_OC1);  /* OC1 = RP5 */
31
    PPSOutput(PPS_RP6, PPS_OC2);  /* OC2 = RP6 */
32
    PPSOutput(PPS_RP7, PPS_OC3);  /* OC3 = RP7 */
33
34
    /* lock PPS routing registers */
35
    __builtin_write_OSCCONL(OSCCON | 0x40);
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.