Forum: Mikrocontroller und Digitale Elektronik PIC18F2420 - Timer1 zum Dimmen LED einstellen


von Dominik (Gast)


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?

von Dominic A. (neo123)


Lesenswert?

Ich würde T1CONbits.TMR1ON = 1; //Timer ON erst an den Schluss der 
Initialiserung setzten.
Weiterhin wird das TMR0 Flag nicht zurückgesetzt und auch kein neuer 
Preset in die Counterregister geladen.

von Dominik (Gast)


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.

von Dominic A. (neo123)


Lesenswert?

So:
1
TMR1H = 0;             // preset for timer1 MSB register
2
TMR1L = 0;             // preset for timer1 LSB register

Was machst du den sonst noch alles in der While Schlaufe?

von Max H. (hartl192)


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.

: Bearbeitet durch User
von Dominic A. (neo123)


Lesenswert?

Max H. schrieb:
> Also läuft der Timer alle 2^16µs (=65.5ms) über. Die LED blinkt also mit
> 7.6Hz.

Nicht ganz der Timer läuft im 8Bit Modus. Also 256us und somit bei 
3.9kHz.

von Max H. (hartl192)


Lesenswert?

Dominic A. schrieb:
> Nicht ganz der Timer läuft im 8Bit Modus
Ich kenne deinen PIC18 nicht, aber bei meinem PIC18 hat der Timer1 nur 
einen 16bit Modus.

BTW: Falls du MPLAB verwendest: Simuliere den Code mal mit MPLABsim. 
Dann kannst du dir in der StopWatch genau ansehen wie viele Zyklen/Zeit 
der PIC für was braucht

: Bearbeitet durch User
von Dominic A. (neo123)


Lesenswert?

Ja klar sorry, hast natürlich recht. War irgendwie mit den Gedanken wo 
anders.

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.