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ß
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 | }
|
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.