mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik PIC24F Timer interrupt mit 4xPLL


Autor: Hate M. (hate)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich verwende einen PIC24FV32KA301

alle 250ms soll ein Timer interrupt ausgelöst werden.

interner Oscilator
(8Mhz mit 4xppl = 32Mhz
32/2 = 16Mhz
mit einem Presc von 64 => alle 250ms => Period value =0xF424

nun ist es so das es ca alle 16 ms auftritt.


Woran kann das liegen. Werden für den Timer4 16 Mhz auch akzeptiert oder 
wird der interne 8Mhz genommen

Autor: morph1 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
0xF424 ist mal falsch, aber nicht die Ursache. 0xF423 wäre korrekt.

Ich denke da hats was mit dem prescaler. der ist wohl nicht auf 64 
sondern auf 8.

Ansonst müsste der PIC mit dem 8x Takt laufen und das ist eher 
unwahrscheinlich.

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hate M. schrieb:
> interner Oscilator
> (8Mhz mit 4xppl = 32Mhz
> 32/2 = 16Mhz

Ist die PLL auch wirklich eingeschaltet? IMHO mußte da man etwas mit 
"__builtin_write" machen.

MfG Klaus

Autor: Hate M. (hate)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Folgende Einstellungen habe ich vorgenommen hier jetzt mit einem 
Interrupt von 1s.:
Wenn ich nun messe kommt der Interrupt alle 4s. Leider finde ich einfach 
nicht heraus warum dies der Fall ist.


// FBS
#pragma config BWRP = OFF    // Boot Segment Write Protect->Disabled
#pragma config BSS = OFF    // Boot segment Protect->No boot program flash segment

// FGS
#pragma config GWRP = OFF    // General Segment Write Protect->General segment may be written
#pragma config GSS0 = OFF    // General Segment Code Protect->No Protection

// FOSCSEL
#pragma config FNOSC = FRC    // Oscillator Select->FRC
#pragma config SOSCSRC = ANA    // SOSC Source Type->Analog Mode for use with crystal
#pragma config LPRCSEL = HP    // LPRC Oscillator Power and Accuracy->High Power, High Accuracy Mode
#pragma config IESO = ON    // Internal External Switch Over bit->Internal External Switchover mode enabled (Two-speed Start-up enabled)

// FOSC
#pragma config POSCMOD = NONE    // Primary Oscillator Configuration bits->Primary oscillator disabled
#pragma config OSCIOFNC = OFF    // CLKO Enable Configuration bit->CLKO output disabled
#pragma config POSCFREQ = HS    // Primary Oscillator Frequency Range Configuration bits->Primary oscillator/external clock input frequency greater than 8MHz
#pragma config SOSCSEL = SOSCHP    // SOSC Power Selection Configuration bits->Secondary Oscillator configured for high-power operation
#pragma config FCKSM = CSDCMD    // Clock Switching and Monitor Selection->Both Clock Switching and Fail-safe Clock Monitor are disabled

// FWDT
#pragma config WDTPS = PS32768    // Watchdog Timer Postscale Select bits->1:32768
#pragma config FWPSA = PR128    // WDT Prescaler bit->WDT prescaler ratio of 1:128
#pragma config FWDTEN = OFF    // Watchdog Timer Enable bits->WDT disabled in hardware; SWDTEN bit disabled
#pragma config WINDIS = OFF    // Windowed Watchdog Timer Disable bit->Standard WDT selected(windowed WDT disabled)

// FPOR
#pragma config BOREN = BOR3    // Brown-out Reset Enable bits->Brown-out Reset enabled in hardware, SBOREN bit disabled
#pragma config LVRCFG = OFF    // Low Voltage Regulator Configuration bit->Low Voltage regulator is not available
#pragma config PWRTEN = ON    // Power-up Timer Enable bit->PWRT enabled
#pragma config I2C1SEL = PRI    // Alternate I2C1 Pin Mapping bit->Use Default SCL1/SDA1 Pins For I2C1
#pragma config BORV = V20    // Brown-out Reset Voltage bits->Brown-out Reset set to lowest voltage (2.0V)
#pragma config MCLRE = ON    // MCLR Pin Enable bit->RA5 input pin disabled,MCLR pin enabled

// FICD
#pragma config ICS = PGx2    // ICD Pin Placement Select bits->EMUC/EMUD share PGC2/PGD2

// FDS
#pragma config DSWDTPS = DSWDTPSF    // Deep Sleep Watchdog Timer Postscale Select bits->1:2,147,483,648 (25.7 Days)
#pragma config DSWDTOSC = LPRC    // DSWDT Reference Clock Select bit->DSWDT uses Low Power RC Oscillator (LPRC)
#pragma config DSBOREN = ON    // Deep Sleep Zero-Power BOR Enable bit->Deep Sleep BOR enabled in Deep Sleep
#pragma config DSWDTEN = ON    // Deep Sleep Watchdog Timer Enable bit->DSWDT enabled



#define _XTAL_FREQ  32000000UL

// RCDIV FRC/1; DOZE 1:8; DOZEN disabled; ROI disabled; 
CLKDIV = 0x3000;
// TUN Center frequency; 
OSCTUN = 0x0000;
// CF no clock failure; NOSC FRCPLL; SOSCEN disabled; CLKLOCK unlocked; OSWEN Switch is Complete; 
__builtin_write_OSCCONH((uint8_t) ((0x0100 >> _OSCCON_NOSC_POSITION) & 0x00FF));
__builtin_write_OSCCONL((uint8_t) ((0x0100 | _OSCCON_OSWEN_MASK) & 0xFF));
// Wait for Clock switch to occur
while (OSCCONbits.OSWEN != 0);

IPC6bits.T4IP = 1;

//TMR4 0; 
TMR4 = 0x0000;
//Period = 1 s; Frequency = 16000000 Hz; PR4 62500; 
PR4 = 0xF424;
//TCKPS 1:256; T32 16 Bit; TON enabled; TSIDL disabled; TCS FOSC/2; TGATE disabled; 
T4CON = 0x8030;


IFS1bits.T4IF = false;
IEC1bits.T4IE = true;


/*Enable the interrupt*/
IEC1bits.T4IE = true;

/* Start the Timer */
T4CONbits.TON = 1;

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hate M. schrieb:
> __builtin_write_OSCCONH((uint8_t) ((0x0100 >> _OSCCON_NOSC_POSITION) &
> 0x00FF));
> __builtin_write_OSCCONL((uint8_t) ((0x0100 | _OSCCON_OSWEN_MASK) &
> 0xFF));

Ich bin jetzt zu faul, die Bitfummeleien und casts nachzuvollziehen, bei 
mir heists schlicht
 _RCDIV = 0; // Postscaler 1/1
 __builtin_write_OSCCONH(0x01); // 8 MHz FRC with Postscaler and PLL (FRCPLL)
 __builtin_write_OSCCONL(0x01); // Start switch

MfG Klaus

Autor: Hate M. (hate)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Deinen Vorschlag hatte ich auch schon probiert. Ohne Erfolg. Es bleibt 
bei den 4s

Autor: morph1 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
#pragma config POSCFREQ = HS    // Primary Oscillator Frequency Range 
Configuration bits->Primary oscillator/external clock input frequency 
greater than 8MHz
#pragma config FCKSM = CSDCMD    // Clock Switching and Monitor 
Selection->Both Clock Switching and Fail-safe Clock Monitor are disabled

der fehler liegt genau hier :)

Autor: morph1 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
einerseits wählst du den falschen taktgeber aus und dann deaktivierst du 
auch noch das clockswitching, so das du es im code auch nicht mehr 
ändern kannst.

Autor: Hate M. (hate)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
morph1 schrieb:
> du den falschen taktgeber aus und dann deaktivierst du
> auch noch das clockswitching

OK vielen Dank jetzt ist funktioniert es.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.