Forum: Mikrocontroller und Digitale Elektronik delay.h Probleme mit 40MHz / Hi-Tech Pro C


von Hermann U. (Firma: www.pcb-devboards.de) (gera82)


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
}

von Hermann U. (Firma: www.pcb-devboards.de) (gera82)


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.

von Mark B. (markbrandis)


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?

von Hermann U. (Firma: www.pcb-devboards.de) (gera82)


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.

von Gregor B. (gregor54321)


Lesenswert?

Kommentare in delay.h sagen:
The maximal possible delay is 262.14 ms / F_CPU in MHz.
The maximal possible delay is 768 us / F_CPU in MHz.

von zocc (Gast)


Lesenswert?

Blockierende Programmierung sollte man sich gar nicht erst angewoehnen.

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.