PIC18F2420 - Timer1 zum Dimmen LED einstellen

Gast #3522444
Lesenswert?

Hallo,

ich baue derzeit eine Binäruhr und möchte die LEDs dimbar gestalten.

Der PIC wird mit einem 4.096 MHz Oscillation extern getaktet.
Für die Uhr habe ich mit dem Timer0 einen 4ms Takt
Daraus leite ich dann weitere Raster z.B. 100 ms ab.

Wenn ich die Ausgabe der LEDs dimmer will reicht die 4ms Zeitbasis nicht 
aus (flackert stark).

Daher würde ich gerne den Timer1 zum dimmen nutzen.

Hier mein Settings in der Init funktion:
1
    T1CONbits.TMR1ON = 1; //Timer ON
2
    T1CONbits.TMR1CS = 0; //Internal clock (FOSC/4)
3
    T1CONbits.T1OSCEN = 0; //Timer1 oscillator is shut off
4
    T1CONbits.T1CKPS1 = 0; //No Prescaler
5
    T1CONbits.T1CKPS0 = 0; //No Prescaler
6
    T1CONbits.RD16 = 0; // 8 bit counter
7
    T1CONbits.T1RUN =1;

Mein Main sieht zum Testen wie folgt aus:
1
void main(void) {
2

3
    Init();
4

5
    while (1) {
6

7
        if (INTCONbits.TMR0IF){ //FAST timer
8
            LED_Alarm_SET =~ LED_Alarm_SET;// Toggle LED ausgabe
9
        }
10
}

Die LED Flackert allerdings immer noch. Kann mir bitte jemand einen Tipp 
geben?
Gast #3522472
Lesenswert?

Habe es nun wie folgt eingestellt:
1
    T1CONbits.TMR1CS = 0; //Internal clock (FOSC/4)
2
    T1CONbits.T1OSCEN = 0; //Timer1 oscillator is shut off
3
    T1CONbits.T1CKPS1 = 0; //No Prescaler
4
    T1CONbits.T1CKPS0 = 0; //No Prescaler
5
    T1CONbits.RD16 = 0; // 8 bit counter
6
    T1CONbits.T1RUN =1;
7
    T1CONbits.TMR1ON = 1; //Timer ON

1
void main(void) {
2

3
    Init();
4

5
    while (1) {
6

7
        if (PIR1bits.TMR1IF){ //FAST timer
8
            LED_Alarm_SET =~ LED_Alarm_SET;
9
            PIR1bits.TMR1IF = 0;
10
        }

Flackert immer noch.

Frage: Wie wird  neuer Preset in die Counterregister geladen.
#3522712
Lesenswert?

Dominik schrieb:
> 4.096 MHz Oscillation
Dominik schrieb:
> T1CONbits.TMR1CS = 0; //Internal clock (FOSC/4)
F_timer=~1MHz; --> T=1µs
Also läuft der Timer alle 2^16µs (=65.5ms) über. Die LED blinkt also mit 
7.6Hz.
Mögliche Lösungen: TMR1 vorladen oder 8-bit Timer verwenden.

Dominic A. schrieb:
> TMR1H = 0;             // preset for timer1 MSB register
> TMR1L = 0;             // preset for timer1 LSB register
Wichtig Erst TMR1H beschreiben.

Dominik schrieb:
> if (PIR1bits.TMR1IF){ //FAST timer
>             LED_Alarm_SET =~ LED_Alarm_SET;
>             PIR1bits.TMR1IF = 0;
Das macht man normalerweise in der ISR.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren