PIC24 - PWM led dimmen

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Chris89
  • Registratie: Oktober 2005
  • Laatst online: 07-10 15:49
Ben zelf weer eens aan het knutselen geweest. Vandaag wilde ik op een PIC24FJXXGB002 een LED proberen te dimmen via PWM.

Me code is als volgt:
C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
int main(void) {
PPSUnLock;
PPSOutput(PPS_RP7, PPS_OC1);
PPSLock;
 
OC1CON1 = 0;        
OC1CON2 = 0;
OC1R = 0x1f3f;  //7999  
OC1RS = 0x3e7f;  //15999    
OC1CON2bits.SYNCSEL = 01011;   //Timer1     
OC1CON1bits.OCTSEL = 100;     //Timer1      
OC1CON1bits.OCFLT = 0;     //PWM OCFB Fault condition has not occurred (this bit is used only when OCM<2:0> = 111)  
OC1CON2bits.OCINV = 0;       //OCx output is not inverted       
OC1CON1bits.OCM = 0x6;     //Edge-Aligned PWM mode on OCx       
 
T1CON = 0;
TMR1 = 0x00;       //Clear timer register   
PR1 = 0xFFFF; 
IPC0bits.T1IP = 0x01;    //Setup Timer1 interrupt for desired priority level
                                   // (This example assigns level 1 priority)   
IFS0bits.T1IF = 0;     //Interrupt request has not occurred 
IEC0bits.T1IE = 0;       //Interrupt request is not enabled     
 
T1CONbits.TON = 1;       //Starts 16-bit Timer1     
 
    while (1)
        {
 
        }
}


Alleen het werkt niet helemaal, led gaat wel branden maar wordt niet gedimt...
Heb al wat geprobeerd met de cycle en periode maar helaas helpt dat niet...

[ Voor 7% gewijzigd door Chris89 op 16-05-2014 19:40 ]


Acties:
  • 0 Henk 'm!

  • Sissors
  • Registratie: Mei 2005
  • Niet online
Wat gebeurd er met de Timer1 interrupt? Doet die nog wat met het dimniveau? Want een constante 50% dim is niet altijd even duidelijk als er geen identieke LED op 100% naast zit.

Acties:
  • 0 Henk 'm!

  • Chris89
  • Registratie: Oktober 2005
  • Laatst online: 07-10 15:49
Hoe bedoel je? Hoe kan ik hem zichtbaar maken dan?

Acties:
  • 0 Henk 'm!

  • Sissors
  • Registratie: Mei 2005
  • Niet online
Een led op 50% ziet er nog redelijk normaal uit als je niks ernaast hebt om mee te vergelijken, als hij op 10% zit is het wel duidelijk (wel opletten dat je niet inverteerd en hij 90% is).

Maar je hebt ook een timer interrupt, ik neem aan dat die iets doet?

Acties:
  • 0 Henk 'm!

  • Chris89
  • Registratie: Oktober 2005
  • Laatst online: 07-10 15:49
Hoe ziet dat er dan uit in code? En moet ik dan geen interrupt gebruiken?
Weet het ondertussen niet meer... van alles al gedaan...
maar het werkt niet...

Acties:
  • 0 Henk 'm!

  • Sissors
  • Registratie: Mei 2005
  • Niet online
Van Timer 1 wordt er een interrupt aangezet. Die interrupt zal iets doen, wat zit niet in de code die je hier hebt neergezet. En wat heb je dan van alles al gedaan? En zit er geen handleiding bij die code ofzo? Zelfs als hij werkt is het toch wel handig als je weet waarom hij werkt.

Acties:
  • 0 Henk 'm!

  • Ploink
  • Registratie: April 2002
  • Laatst online: 21-08 13:05
Een interrupt is niet nodig voor zoiets simpels als PWM dimmen.
Al wat je nodig hebt is een timer in PWM mode op ongeveer 100Hz (optimaal voor rgb color mixing, voor een enkele led mag het hoger) en de output naar de juiste pin sturen.
Heb je de code van het internet of zelf geknutseld mbv de datasheet? Dat laatste leer je het meest van en als je een beetje ervaring hebt opgedaan met datasheets dan kom je er altijd wel uit.

Acties:
  • 0 Henk 'm!

  • Sissors
  • Registratie: Mei 2005
  • Niet online
Behalve als het uit de datasheet is gecopy paste (gedeeltes zijn dat iig) zonder te weten waarom het zo is opgeschreven, dan heb je hetzelfde als code van het internet.

Maar inderdaad, vandaar dat ik me afvraag waar de interrupt routine is, en wat die doet.

Acties:
  • 0 Henk 'm!

  • Chris89
  • Registratie: Oktober 2005
  • Laatst online: 07-10 15:49
Dermate van de datasheet, ben ik gaan kijken of het ging werken.
Helaas werkte dat niet en ben ik verder gaan zoeken op het internet.
*Site van Microchip heeft een aantal code voorbeelden en de XC16 libary

De interrupt is dus niet nodig zie ik nu zelf ook, anders had ik een ISR aan moeten maken.

Nu is echter mijn vraag, klopt mijn pwm configuratie en mijn dutty cycle/periode?
Hierboven zeggen jullie 100Hz, is voldoende? Als periode?
Ik wil 1 enkele led aansturen in mijn geval.

[ Voor 8% gewijzigd door Chris89 op 14-05-2014 00:38 ]


Acties:
  • 0 Henk 'm!

  • Sissors
  • Registratie: Mei 2005
  • Niet online
100Hz is zat als periode ja. Maar de vraag is nog steeds of je zeker bent dat het niet werkt, en daar kan je achterkomen of met een scope, of door eens de duty cycle te wijzigen.

Acties:
  • 0 Henk 'm!

  • Chris89
  • Registratie: Oktober 2005
  • Laatst online: 07-10 15:49
OC1R en OC1RS heb ik verandert en dat werkt niet...
Zowel omhoog als omlaag aangepast...
Zie geen zichtbaar resultaat dat me led meer of minder brand.

100Hz als periode kan ik nog proberen.

Acties:
  • 0 Henk 'm!

  • Sissors
  • Registratie: Mei 2005
  • Niet online

Acties:
  • 0 Henk 'm!

  • _Mithrandir
  • Registratie: December 2002
  • Laatst online: 26-11-2024

_Mithrandir

tOOt TooT

Om een beter antwoord op je vraag te kunnen geven zou ik toch graag het schema willen zien en willen weten met welk programma je werk? MPLAB X met de XC16 compiler?

Verder mis ik in het programma nog iets als #<include pic24FJ64GB002.h>

En ik mis de initialisatie van je microcontroller

[ Voor 9% gewijzigd door _Mithrandir op 14-05-2014 09:54 ]

At dawn on the fifth day look to the east


Acties:
  • 0 Henk 'm!

  • ocwil
  • Registratie: Mei 2007
  • Laatst online: 25-09 16:29
_Mithrandir schreef op woensdag 14 mei 2014 @ 09:50:
En ik mis de initialisatie van je microcontroller
Inderdaad oscillator initialisatie mist ook

~ Portal 2 maps: linkje ~ LoL (EUW): Ocwil ~


Acties:
  • 0 Henk 'm!

  • Chris89
  • Registratie: Oktober 2005
  • Laatst online: 07-10 15:49
Okee zal even iets meer volledig zijn. Blijkbaar ben ik niet volledig geweest.
EDIT: MPLABX - XC16 compiler

Dit is wat ik wil dus:
YouTube: PIC Tutorial - PWM Led

Nu mijn volledige code het volgt:
C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <p24FJ64GB002.h>
#include <PPS.h>

_CONFIG1(WDTPS_PS1 & FWPSA_PR32 & WINDIS_OFF & FWDTEN_OFF & ICS_PGx1 & GWRP_OFF & GCP_OFF & JTAGEN_OFF)
_CONFIG2(POSCMOD_NONE & I2C1SEL_PRI & IOL1WAY_OFF & OSCIOFNC_ON & FCKSM_CSDCMD & FNOSC_FRCPLL & PLL96MHZ_ON & PLLDIV_DIV2 & IESO_ON)
_CONFIG3(WPFP_WPFP0 & SOSCSEL_SOSC & WUTSEL_LEG & WPDIS_WPDIS & WPCFG_WPCFGDIS & WPEND_WPENDMEM)
_CONFIG4(DSWDTPS_DSWDTPS3 & DSWDTOSC_LPRC & RTCOSC_SOSC & DSBOREN_OFF & DSWDTEN_OFF)

int main(void) {
PPSUnLock;
PPSOutput(PPS_RP7, PPS_OC1);
PPSLock;
 
OC1CON1 = 0;         
OC1CON2 = 0;
OC1R = 0x1f3f;  //7999    
OC1RS = 0x3e7f;  //15999    
OC1CON2bits.SYNCSEL = 01011;   //Timer1        
OC1CON1bits.OCTSEL = 100;     //Timer1        
OC1CON1bits.OCFLT = 0;       //PWM OCFB Fault condition has not occurred (this bit is used only when OCM<2:0> = 111)    
OC1CON2bits.OCINV = 0;       //OCx output is not inverted        
OC1CON1bits.OCM = 0x6;     //Edge-Aligned PWM mode on OCx        
 
T1CON = 0;
TMR1 = 0x00;       //Clear timer register    
PR1 = 0xFFFF; 
IPC0bits.T1IP = 0x01;    //Setup Timer1 interrupt for desired priority level
                                   // (This example assigns level 1 priority)    
IFS0bits.T1IF = 0;       //Interrupt request has not occurred    
IEC0bits.T1IE = 1;       //Interrupt request is enabled        
 
T1CONbits.TON = 1;       //Starts 16-bit Timer1        
 
    while (1)
        {
 
        }
}


Wat wordt er bedoelt met oscillator?
Is dat deze config:

code:
1
2
3
_FOSCSEL(FNOSC_FRC & IESO_OFF);
_FOSC(FCKSM_CSECME & OSCIOFNC_ON & POSCMD_HS);
_FICD(JTAGEN_OFF & ICS_PGD1);

Acties:
  • 0 Henk 'm!

  • ocwil
  • Registratie: Mei 2007
  • Laatst online: 25-09 16:29
Dat is inderdaad die config dus dat lijkt wel in orde
heb je al geprobeerd te kijken wat er gebeurd bij verschillende PWM instellingen?
Als je een scope hebt kun je eventueel ook even kijken of het goeie signaal er wel uitkomt.

~ Portal 2 maps: linkje ~ LoL (EUW): Ocwil ~


Acties:
  • 0 Henk 'm!

  • Chris89
  • Registratie: Oktober 2005
  • Laatst online: 07-10 15:49
Helaas heb ik geen scope tot me beschikking...
Anders had het inderdaad een stuk makkelijker geweest.

OC1R, OC1RS, PR1 al gewijzigd door andere waarden maar geen resultaat.

Nu lees ik wel in de datasheet dat timer2 de default timer is, misschien goed om hem om te gooien naar timer2... Denk echter dat niet zo uitmaken.

Acties:
  • 0 Henk 'm!

  • 1337aldi
  • Registratie: April 2004
  • Laatst online: 05-10 22:32
Uit de datasheet:

Edge-Aligned PWM
- If OCxR and OCxRS are loaded with 0000h,
the OCx pin will remain low (0% duty cycle).
- If OCxRS is greater than OCxR, the pin will
remain high (100% duty cycle).

Is het laatste niet van toepassing? OCxRS > OCxR?

Acties:
  • 0 Henk 'm!

  • Chris89
  • Registratie: Oktober 2005
  • Laatst online: 07-10 15:49
zo juist heb ik het volgende geprobeerd:

OC1R = 200;
OC1RS = 100;
geen verschil

en heb deze geprobeerd:

OC1R = 800;
OC1RS = 1600;
geen verschil

LED gaat alleen aan en voor de rest wordt hij niet gedimt...

LED is trouwens als volgt aangesloten:

RP7_pin --> weerstand --> LED --> VSS
To configure the output compare module for
edge-aligned PWM operation:
  • 1. Configure the OCx output for one of the
    available Peripheral Pin Select pins.
  • 2. Calculate the desired on-time and load it into the
    OCxR register.
  • 3. Calculate the desired period and load it into the
    OCxRS register.
  • 4. Select the current OCx as the synchronization
    source by writing 0x1F to SYNCSEL<4:0>
    (OCxCON2<4:0>) and ‘0’ to OCTRIG
    (OCxCON2<7>).
  • 5. Select a clock source by writing to the
    OCTSEL2<2:0> (OCxCON1<12:10>) bits.
  • 6. Enable interrupts, if required, for the timer and
    output compare modules. The output compare
    interrupt is required for PWM Fault pin utilization.
  • 7. Select the desired PWM mode in the OCM<2:0>
    (OCxCON1<2:0>) bits.
  • 8. If a timer is selected as a clock source, set the
    TMRy prescale value and enable the time base by
    setting the TON (TxCON<15>) bit.
Volgens mij doe ik het bovenstaande. Of zie ik iets over het hoofd?

[ Voor 62% gewijzigd door Chris89 op 14-05-2014 19:26 ]


Acties:
  • 0 Henk 'm!

  • _Mithrandir
  • Registratie: December 2002
  • Laatst online: 26-11-2024

_Mithrandir

tOOt TooT

In de datasheet van de Microcontroller wordt verwezen

“PIC24F Family Reference Manual”,Section 6. “Oscillator” (DS39700).

Die kun je hier vinden op de site van microchip, daar staat uitgebreid in beschreven hoe de Output Compare werkt en hoe de PWM functie van de OC werkt.

Als je dat goed doorleest moet je er wel uitkomen

[ Voor 10% gewijzigd door _Mithrandir op 15-05-2014 09:42 ]

At dawn on the fifth day look to the east


Acties:
  • 0 Henk 'm!

  • maikel
  • Registratie: Januari 2001
  • Laatst online: 19:36
Als je net zoiets wilt als in het filmpje, dus dat je LED in een loopje steeds van 'uit' langzaam feller wordt, zul je in je programma ook iets moeten schrijven om je PWM-frequentie te veranderen.
De code zoals je nu hebt, stelt, als ik het goed lees, slechts één keer een frequentie in. Op die snelheid gaat je LED dus knipperen (wat zo snel gaat dat het lijkt alsof ie, al dan niet gedimd, aan is). Hoe fel de LED brandt, wordt daarna niet meer aangepast. Hierdoor zul je dus ook geen verschil zien.

Het makkelijkst is om in je while-loop een pauze te zetten en na een bepaalde tijd de instellingen van je timer, en daarmee de PWM-frequentie, te wijzigen.
In pseudo-code:
code:
1
2
3
4
5
6
7
8
9
10
11
12
timer1 = <config settings>;
int level = 0;
while (1)
{
  timer1.toggle = level; // stel in waarbij de timer de uitgang schakelt van laag naar hoog
  delay(10); //wacht 10 ms
  level++;
  if (level > 255)
  {
    level = 0;
  }
}


Hiermee wordt dus het schakelpunt van je timer steeds iets verlegd, waardoor de uitgang steeds langer hoog blijft. Hierdoor blijft je LED steeds langer aan en lijkt ie dus feller.

Acties:
  • 0 Henk 'm!

  • Chris89
  • Registratie: Oktober 2005
  • Laatst online: 07-10 15:49
Dan komt het toch als volgt op neer:

code:
1
2
3
4
5
6
7
8
9
10
11
12
timer1 = O1CR;
int level = 0;
while (1)
{
  timer1.toggle = level; // stel in waarbij de timer de uitgang schakelt van laag naar hoog
  delay(10); //wacht 10 ms
  level++;
  if (level > 255)
  {
    level = 0;
  }
}


Of snap ik het niet meer??

@_Mithrandir
Deze heb ik er al bijgepakt maar dat heeft me niet veel geholpen

Acties:
  • 0 Henk 'm!

  • Damic
  • Registratie: September 2003
  • Laatst online: 20:52

Damic

Tijd voor Jasmijn thee

Volgens mij doe je ergens iets niet juist, bekijk deze pagina eens http://www.waitingforfrid..._LED_brightness_using_PWM ;) is wel met een pic18F4550 maar kan gemakkelijk aangepast worden voor jou noden.

Al wat ik aanraak werk niet meer zoals het hoort. Damic houd niet van zijn verjaardag


Acties:
  • 0 Henk 'm!

  • maikel
  • Registratie: Januari 2001
  • Laatst online: 19:36
Chris89 schreef op donderdag 15 mei 2014 @ 16:32:
Dan komt het toch als volgt op neer:

code:
1
2
3
4
5
6
7
8
9
10
11
12
timer1 = O1CR;
int level = 0;
while (1)
{
  timer1.toggle = level; // stel in waarbij de timer de uitgang schakelt van laag naar hoog
  delay(10); //wacht 10 ms
  level++;
  if (level > 255)
  {
    level = 0;
  }
}


Of snap ik het niet meer??

@_Mithrandir
Deze heb ik er al bijgepakt maar dat heeft me niet veel geholpen
Niet helemaal. Die 'timer1' was niet echt bedoeld als varabele, maar als pseudo-code voor OCR1.
Op die plek moet dus de code komen om OCR1 correct in te stellen. Deze code stond al in je eerdere posts.
Hetzelfde geldt voor die 'timer1.toggle'. Dat moet ook een specifiek register worden waarbij je de waarde waarop OCR1 schakelt tussen hoog en laag ingeeft.
Aangezien ik geen ervaring met PIC's heb, durf ik niet te zeggen hoe al die registers precies heten. Vandaar de pseudo-code. :) De juiste registers moet je wel uit de datasheet kunnen halen.

[ Voor 3% gewijzigd door maikel op 15-05-2014 17:48 ]


Acties:
  • 0 Henk 'm!

  • 1337aldi
  • Registratie: April 2004
  • Laatst online: 05-10 22:32
Nog iets wat me opvalt:
OC1CON2bits.SYNCSEL = 01011; //Timer1
OC1CON1bits.OCTSEL = 100; //Timer1

Deze waarden staan nu als decimaal in je code, ik denk dat je ze in binaire notitie wilt hebben? Zo ja, dan moet er '0b' voor staan, zoals OC1CON1bits.OCTSEL = 0b100;

Acties:
  • 0 Henk 'm!

  • Chris89
  • Registratie: Oktober 2005
  • Laatst online: 07-10 15:49
@1337aldi allebei al geprobeerd maakt niet veel uit...
@Damic Zal morgen hem even herschrijven naar mijn pic, kijken of het werkt.
Zal dan wel de code posten ;)

Acties:
  • 0 Henk 'm!

  • Chris89
  • Registratie: Oktober 2005
  • Laatst online: 07-10 15:49
Ondertussen vandaag lekker bezig geweest in het zonnetje en heb even die van Damic erbij gepakt.

Ik kom uit op het volgende:

C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
#include <p24FJ64GB002.h>
#include <PPS.h>



unsigned char pwmCounter = 0;
unsigned char ledActualBrightness = 0;
unsigned char ledTargetBrightness = 0;

unsigned char fadeCounter = 0;

void delay_ms(unsigned int Time) {
    unsigned int i, j;
    for (i = 0; i <= Time; i++) {
        asm("nop");
        for (j = 0; j <= 1140; j++) //1ms
        {
            asm("nop");
            asm("nop");
        }
    }
}

// Low priority interrupt procedure

void __attribute__((interrupt, shadow, no_auto_psv)) _T1Interrupt(void) {

    // Is this timer0 interrupting?
    if (IFS0bits.T1IF) {
        // Perform the PWM brightness control
        if (ledActualBrightness > pwmCounter) {
            RPOR3bits.RP7R = 1;
        } else {
            RPOR3bits.RP7R = 0;
        }

        pwmCounter++;
        if (pwmCounter > 19) {
            pwmCounter = 0;
        }

        // Perform fading control
        if (ledTargetBrightness >= ledActualBrightness) {
            ledActualBrightness = ledTargetBrightness;
        } else {
            fadeCounter++;
            if (fadeCounter == 24) {
                ledActualBrightness--;
                fadeCounter = 0;
            }
        }

        // Get ready for the next interrupt
        PR1 = 255 - 187; // Reset the timer0 counter (TMR0L vervangen door PR1)

    }
}

void main(void) {

    PPSUnLock;
    PPSOutput(PPS_RP7, PPS_OC1);
    PPSLock;

    // Enable interrupts with priority
    //IPEN = 1;

    // Set up timer0
    IPC0bits.T1IP = 0; // Set timer0 interrupt to low priority
    IFS0bits.T1IF = 0; // Clear the timer0 interrupt flag
    PR1 = 255 - 187; // Reset the timer0 counter

    T1CON = 0b11000101; // Timer0 on, 8-bit and 1:64 prescaler
    T1CONbits.TON = 1;
    IEC0bits.T1IE = 1; // Enable the timer0 interrupt

    // Enable interrupts
    //GIEH = 1;         // Global enable all high priority interrupts
    //GIEL = 1;         // Global enable all low priority interrupts

    while (1) {
        // On full brightness
        ledTargetBrightness = 19;

        // Pause for a bit
        int pause;
        for (pause = 0; pause < 10000; pause++) {
            delay_ms(200);
        }

        // Off
        ledTargetBrightness = 0;

        // Pause for a bit
        for (pause = 0; pause < 10000; pause++) {
            delay_ms(200);
        }
    }
}


Nu heb ik dus helemaal niks meer... LED gaat niet eens meer aan...
En volgens mij is het vrijwel hetzelfde als het voorbeeld

Acties:
  • 0 Henk 'm!

  • Damic
  • Registratie: September 2003
  • Laatst online: 20:52

Damic

Tijd voor Jasmijn thee

Btw ik heb die pic pwm code niet geschreven. Waarom staan je interrupts eigenlijk af?

[ Voor 31% gewijzigd door Damic op 18-05-2014 22:31 ]

Al wat ik aanraak werk niet meer zoals het hoort. Damic houd niet van zijn verjaardag


Acties:
  • 0 Henk 'm!

  • Chris89
  • Registratie: Oktober 2005
  • Laatst online: 07-10 15:49
De functies die daar worden gebruikt kan ik niet meer vinden in het de PIC24 libary.
Heb hem dus weg gelaten, maar ik enable de timer interrupt wel door:
IEC0bits.T1IE = 1; // Enable the timer0 interrupt

Acties:
  • 0 Henk 'm!

  • Chris89
  • Registratie: Oktober 2005
  • Laatst online: 07-10 15:49
Niemand die nog iets weet om te helpen?!

Acties:
  • 0 Henk 'm!

  • Ploink
  • Registratie: April 2002
  • Laatst online: 21-08 13:05
Ik heb geen kristallen bol, dus ik weet het niet.
Ik weet ook niet wat voor hardware je hebt, hoe en waar de LED is aangesloten en wat de klok frequentie is.
Ik zie wel een lap code en de vraag waarom het niet werkt. Er zijn zoveel factoren in het spel, als je dit wil gaan debuggen dan moet je simpel beginnen, niet met interrupt routines enzo.
Laat eerst maar eens een led gewoon knipperen, zoiets van
C:
1
2
3
4
5
6
while (1) {
  LED=1;
  delay_ms(200);
  LED=0;
  delay_ms(800);
}

De LED moet 1x per seconde flitsen. Als dat werkt en de timing klopt, probeer dan eens iets met PWM.
C:
1
2
3
4
5
6
7
pwm_setup();
while (1) {
  pwm_duty(90);
  delay_ms(200);
  pwm_duty(10);
  delay_ms(800);
}

Zo test je de PWM en of de polariteit goed is. De led brand zwak en moet 1x per seconde flitsen, is het andersom, dan is het signaal ergens geïnverteerd.
Meet ook de PWM frequentie als je de mogelijkheid daartoe heb. Je multimeter kan het misschien.

Pas als dat allemaal goed gaat kun je gaan spelen met de intensiteit en leuke fading effecten maken. Dan nog is de interrupt handler alleen nodig als je het werk naar de achtergrond wil verplaatsen om op de voorgrond andere dingen te doen.

ps: in je eerste post:
C:
10
OC1CON2bits.SYNCSEL = 01011;   //Timer1 

Moet dat niet binair 0b1011 of hex 0x0b zijn? ;)
Zelfde voor regel 11.

[ Voor 6% gewijzigd door Ploink op 24-05-2014 01:39 ]


Acties:
  • 0 Henk 'm!

  • maikel
  • Registratie: Januari 2001
  • Laatst online: 19:36
En wat doet het stukje
C:
1
2
3
4
5
if (ledActualBrightness > pwmCounter) { 
            RPOR3bits.RP7R = 1; 
        } else { 
            RPOR3bits.RP7R = 0; 
        } 

nu precies?

Ik gok dat het iets aan de timer verandert, maar ik zie nergens iets waarbij de PWM-frequentie wordt verhoogd/verlaagd. En dat is juist wat je wilt doen om je LED te laten faden.
Verder zie ik je alleen maar variabelen aanpassen.

Vergeet ook niet dat die PWM-interrupt met de frequentie van je timer wordt afgevuurd. Afhankelijk van je timerinstellingen kan dit dus enkele duizenden keren per seconde zijn. Die tellertjes gaan dan zo hard dat elk verschil in instellingen, te snel gaat om waar te nemen.
Met de PWM-timer geef je dus alleen aan hoe fel de LED brandt (de verhouding tussen de tijd dat de LED aan is en de tijd dat hij uit is). Wellicht wil je verder in die interrupt niet zoveel doen, aangezien dat dan dus veel te snel gaat.

Maar zoals Ploink hierboven al zegt: begin eerst eens met een LED laten knipperen.

Acties:
  • 0 Henk 'm!

  • Mouse5312
  • Registratie: Maart 2002
  • Laatst online: 03-10 09:23
Kijk even of je poort wel goed staat, dus analoog uit, etc:
(voorbeeld van een PIC24FJ128GA106)
// Disable analog on all pins
AD1PCFGL = 1;
AD1PCFGH = 1;

// PPS
// Unlock Registers
//PPSUnLock;
__builtin_write_OSCCONL(OSCCON & 0xbf);
// Configure Output Functions *********************
RPOR9bits.RP19R = 18; // Assign RP19 pin#6 to OC1 (output)

// Lock Registers
//PPSLock;
__builtin_write_OSCCONL(OSCCON | 0x40);

En controleer wat er nog meer op dat pinnetje aan functies zit en schakel dat uit (denk aan JTAG bijvoorbeeld)
Dit voorbeeld komt van mijn LED driver met 9 PWM outputs.
Pagina: 1