Hallo liebe Spezialisten!
Ich habe nach dem folgenden Problem schon ziemlich viel recherchiert,
bin aber noch nicht wirklich weitergekommen. Vielleicht kann mir jemand
von euch einen Tipp geben. Hier mein Problem:
Ich versuche einen PIC16F886 zum Laufen zu bringen, habe mit dem PIC
Controllern aber bisher noch keine Erfahrung. Deshalb habe ich mit einer
einfachen Übung begonnen - eine blinkende LED(am Ende soll eine
Servo-Steuerung mittels ADC herauskommen).
Konkret habe ich das Problem, dass der PIC in meinem Testaufbau nicht
mit der eingestellten Frequenz läuft.
Bei der minimalen Oszillatorfrequenz von 31kHz passt alles, Theorie und
Praxis zeigen bei einem 500ms Delay ein Blinken mit 2 Hz.
Bei höheren Frequenzen wird das 500ms Delay aber viel zu lang. Bei 4MHz
um den Faktor 133 und bei 8MHz um den Faktor 303!
Eine Vermutung war ein Problem mit der Spannungsquelle oder ständige
Resets, aber auch mit einem 5V Labornetzteil tritt das Problem auf.
Ich bin für zweckdienliche Tipps wirklich sehr dankbar!
Hier der C-Code (im MPLAB mit XC8 Compiler)
1 | /*
|
2 | * Speed Test
|
3 | */
|
4 |
|
5 | /******************************************************************************/
|
6 | /* Config Word
|
7 | /******************************************************************************/
|
8 | // CONFIG1
|
9 | #pragma config FOSC = INTRC_CLKOUT// Oscillator Selection bits (INTOSC oscillator: CLKOUT function on RA6/OSC2/CLKOUT pin, I/O function on RA7/OSC1/CLKIN)
|
10 | #pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT enabled)
|
11 | #pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled)
|
12 | #pragma config MCLRE = ON // RE3/MCLR pin function select bit (RE3/MCLR pin function is MCLR)
|
13 | #pragma config CP = OFF // Code Protection bit (Program memory code protection is disabled)
|
14 | #pragma config CPD = OFF // Data Code Protection bit (Data memory code protection is disabled)
|
15 | #pragma config BOREN = OFF // Brown Out Reset Selection bits (BOR enabled)
|
16 | #pragma config IESO = ON // Internal External Switchover bit (Internal/External Switchover mode is enabled)
|
17 | #pragma config FCMEN = ON // Fail-Safe Clock Monitor Enabled bit (Fail-Safe Clock Monitor is enabled)
|
18 | #pragma config LVP = ON // Low Voltage Programming Enable bit (RB3/PGM pin has PGM function, low voltage programming enabled)
|
19 |
|
20 | // CONFIG2
|
21 | #pragma config BOR4V = BOR21V // Brown-out Reset Selection bit (Brown-out Reset set to 2.1V)
|
22 | #pragma config WRT = OFF // Flash Program Memory Self Write Enable bits (Write protection off)
|
23 |
|
24 | #if defined(__XC)
|
25 | #include <xc.h>
|
26 | #elif defined(HI_TECH_C)
|
27 | #include <htc.h>
|
28 | #endif
|
29 |
|
30 | #include <stdint.h>
|
31 | #include <stdbool.h>
|
32 |
|
33 | #define _XTAL_FREQ 8000000 //processor clock frequency
|
34 |
|
35 | /******************************************************************************/
|
36 | /* Main Program */
|
37 | /******************************************************************************/
|
38 | void main(void)
|
39 | {
|
40 | /* Configure the oscillator for the device */
|
41 | OSCCON=0x01111001; //8MHz
|
42 |
|
43 | //all output
|
44 | TRISA = 0;
|
45 | TRISB = 0;
|
46 | TRISC = 0;
|
47 |
|
48 | PORTA = 0;
|
49 | PORTB = 0;
|
50 | PORTC = 0;
|
51 |
|
52 | RC0 = 1; //rc0 is used to detect resets
|
53 | __delay_ms(1);
|
54 | RC0 = 0;
|
55 |
|
56 | while(1)
|
57 | {
|
58 | RC3 = !RC3; //mainloop
|
59 | __delay_ms(500);
|
60 | }
|
61 | }
|