mikrocontroller.net

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


Autor: Hermann U. (Firma: !www.pcb-devboards.de) (gera82)
Datum:

Bewertung
0 lesenswert
nicht 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:
#ifndef    XTAL_FREQ
#define    XTAL_FREQ    10MHZ        /* Crystal frequency in MHz */
#endif

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

#if    XTAL_FREQ <= 12MHZ

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

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

extern void DelayMs(unsigned int);


Delay.c:
#include    "delay.h"

void
DelayMs(unsigned int cnt)
{
#if    XTAL_FREQ <= 2MHZ
    do {
        DelayUs(996);
    } while(--cnt);
#endif

#if    XTAL_FREQ > 2MHZ    
    unsigned char    i;
    do {
        i = 4;
        do {
            DelayUs(250);
        } while(--i);
    } while(--cnt);
#endif
}

Autor: Hermann U. (Firma: !www.pcb-devboards.de) (gera82)
Datum:

Bewertung
0 lesenswert
nicht 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

#define XTAL_FREQ  40000000

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

#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);}

void main (void)
{
.
.
DelayS(1);
.
.
}

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

Autor: Mark Brandis (markbrandis)
Datum:

Bewertung
0 lesenswert
nicht 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?
#define    DelayUs(x)    { unsigned char _dcnt; \
              _dcnt = (x)/((12MHZ)/(XTAL_FREQ))|1; \
              while(--_dcnt != 0) \
                  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?

Autor: Hermann U. (Firma: !www.pcb-devboards.de) (gera82)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Gregor B. (gregor54321)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: zocc (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Blockierende Programmierung sollte man sich gar nicht erst angewoehnen.

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.