delay.h Probleme mit 40MHz / Hi-Tech Pro C

OP (Firma: www.pcb-devboards.de) #1376591
Lesenswert?

Hallo,

was muss ich in der delay.c und delay.h ändern, damit es mit 40Mhz 
läuft.
Zur Zeit läuft es bis 12Mhz, ich brauch aber 40MHz. Das sind die delays 
von eine Hitech C Compiler,

Delay.h:
1
#ifndef    XTAL_FREQ
2
#define    XTAL_FREQ    10MHZ        /* Crystal frequency in MHz */
3
#endif
4

5
#define    MHZ    *1000L            /* number of kHz in a MHz */
6
#define    KHZ    *1            /* number of kHz in a kHz */
7

8
#if    XTAL_FREQ <= 12MHZ
9

10
#define    DelayUs(x)    { unsigned char _dcnt; \
11
              _dcnt = (x)*((XTAL_FREQ)/(12MHZ)); \
12
              while(--_dcnt != 0) \
13
                  continue; }
14
#else
15

16
#define    DelayUs(x)    { unsigned char _dcnt; \
17
              _dcnt = (x)/((12MHZ)/(XTAL_FREQ))|1; \
18
              while(--_dcnt != 0) \
19
                  continue; }
20
#endif
21

22
extern void DelayMs(unsigned int);


Delay.c:
1
#include    "delay.h"
2

3
void
4
DelayMs(unsigned int cnt)
5
{
6
#if    XTAL_FREQ <= 2MHZ
7
    do {
8
        DelayUs(996);
9
    } while(--cnt);
10
#endif
11

12
#if    XTAL_FREQ > 2MHZ    
13
    unsigned char    i;
14
    do {
15
        i = 4;
16
        do {
17
            DelayUs(250);
18
        } while(--i);
19
    } while(--cnt);
20
#endif
21
}
OP (Firma: www.pcb-devboards.de) #1376816
Lesenswert?

Kann mir keiner helfen???

Ich hab noch ein Beispiel Code, er geht aber auch nicht bei 40MHz .
Keine änderung von 4Mhz auf 40Mhz bei:

#define XTAL_FREQ  40000000
#define XTAL_FREQ  4000000

1
#define XTAL_FREQ  40000000
2

3
#define __delay_us(x) _delay((unsigned long)((x)*(XTAL_FREQ/4000000UL)))
4
#define __delay_ms(x) _delay((unsigned long)((x)*(XTAL_FREQ/4000UL)))
5

6
#define DelayS(T) {unsigned char i; for (i=0; i<T*10; i++) __delay_ms(10); __delay_ms(10); __delay_ms(10); __delay_ms(10); __delay_ms(10); __delay_ms(10); __delay_ms(10); __delay_ms(10); __delay_ms(10); __delay_ms(10);}
7

8
void main (void)
9
{
10
.
11
.
12
DelayS(1);
13
.
14
.
15
}

Ich hab es nachgerechnet, theoretisch muss sich was ändern, wenn man 
statt 4Mhz 40Mhz einträgt. Praktisch geht es nicht.
#1376831
Lesenswert?

Du darfst auf gar keinen Fall sagen, mit welcher Hardware Du arbeitest. 
Sonst können Dir die Leute viel besser helfen. Und das willst Du doch 
nicht, oder? ;-)

Ansonsten, schon mal diese Zeilen in der delay.h geändert oder nur das 
erste define?
1
#define    DelayUs(x)    { unsigned char _dcnt; \
2
              _dcnt = (x)/((12MHZ)/(XTAL_FREQ))|1; \
3
              while(--_dcnt != 0) \
4
                  continue; }

Was passiert, wenn man hier 40 anstatt 12 einträgt?
Und hat der Schwingquarz Deiner ominösen unbekannten Hardware 10 
Megahertz, oder mehr, oder weniger?
OP (Firma: www.pcb-devboards.de) #1376849
Lesenswert?

Okay, die Hardware ist BIGPIC5 Board mit PIC18F8722.
Ein Quarz ist auch drinne 10MHz :-))
Die HSPLL is eingeschaltet, also habe ein Multiplikator x4 = 
Arbeitsfrequenz von 40Mhz.

Und dazu benötige ich passende Delay:
DelayUs(x)
DelayMs(x)

Leider gehen diese beide Beispiele von mir nicht mit 40Mhz.
Mit 10Mhz (HS statt HSPLL) gehen ohne Probleme.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren