Forum: Mikrocontroller und Digitale Elektronik PIC läuft zu langsam


von Loisl (Gast)


Angehängte Dateien:

Lesenswert?

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
}

von Peter C. (peter_c49)


Lesenswert?

ohne deinen code angeshen zu haben,
oder aus dem Bildle einen Schaltplan zu erdenken,
würde ich als erstes die dicke 5mm LED (Orange) entfernen,
bzw ihr einen ca 1KiloOhm in serie gönnen.

von Thomas E. (picalic)


Lesenswert?

Servus,

Loisl schrieb:
> OSCCON=0x01111001

die Zahl ist viel zu lang und OSCCON wird sicher nicht mit dem 
beabsichtigten Wert geladen!
(0x.... bedeutet hexadezimal, nicht binär!)

von Loisl (Gast)


Lesenswert?

maaah - Ihr seids ein Wahnsinn.
Thomas, genau das war das Problem, die Zuweisung muss natürlich 
OSCCON=0b01111001 heißen. Ich hab das echt zwei Tage erfolglos gesucht. 
Vielen vielen Dank!!

Peter, danke für den Hinweis mit der gelben LED, aber da ist schon ein 
Widerstand dahinter, das sieht man bei der Perspektive allerdings nicht.

Jetzt kann ich beruhigt schlafen gehen.

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.