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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.