www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik TIMER: Verzögerung erzeugen


Autor: Patrick (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Guten Tag,

ich benötige für den Temperatursensor DS1820 verschiedene Verzögerungen.
Ich hab mir überlegt dies mit einem Timer zu machen. Den Timer habe ich 
bereits zum laufen gebracht.

unsigned char ds1820_reset(void)
{
  char a,presence;

  P4_0=0;
  P4_DIR=0xFF;

  delay(480);

  P4_DIR=0x00;

  delay(66);

  presence = P4_0;

  delay(480-66);

  a=presence;

  return a;
}   // 0=presence, 1 = no part

Ich hab da ein Problem mit der Umsetzung. Eine delay Funktion habe ich 
ja nicht. Kann mir jemand sagen wie ich dies mit einem Timer realisieren 
könnte?

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
naja, als erstes solltest du mal sagen, um welchen MC es sich handelt, 
wie schnell der getaktet ist, ob du einen freien Timer nur für diese 
Aufgabe hast (eigentlich Verschwendung, aber wenn er sonst gar nichts zu 
tun hätte, kann man auch einen nehmen) und wie genau die die Zeiten 
eingehalten werden sollen.
Wenn du es wirklich nur als Totzeit brauchst (also die Wartezeit nicht 
anderweitig nutzen willst/kannst/brauchst, erfüllen Warteschleifen 
denselben Zweck. Das sollte man dann aber mit dem inline-Assembler tun.

Autor: Patrick (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich verwende einen 8bit Mikrocontroller von Infineon. Der Typ lautet 
XC888.

Autor: Patrick (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Mikrocontroller läuft intern mit 24 Mhz.
Das mit der For Schleife funktioniert nicht. Ich weiss auch nicht waran 
es liegen könnte. Ich brauche ja Verzögerungen zum Beispiel von 66us, 
480us.

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was für eine for() Schleife ?

Autor: Patrick (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

void delay1(int useconds)
{
 int s;
 for (s=0; s<useconds;s++);
}

void delay2(int useconds)
{
 int s;
 for (s=0; s<useconds;s++)
 {
  _nop_();
 }
}

void main(void)
{

 while(1)
  {
    P4_0=1;
    delay1(5);
    P4_0=0;
 
  }
}

Mit dem Oszi sehe ich einen kurzen Puls, der 7,5ms lang ist.
Ich komme da nicht auf Mikrosekunden.

Autor: Patrick (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich kann machen was ich will, ich komme nicht unter den 
Millisekundenbereich.

Autor: Der Dude (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Deine delayschleifen werden normalerweise vom Compiler wegoptimiert. 
Verwendest Du GCC?

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie lange dauert das denn ?

void main(void)
{

 while(1)
  {
    P4_0=1;
    _nop_();
    P4_0=0;

  }
}

Autor: Patrick (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Alle 650us kommt ist ein Puls zu sehen. Der Puls ist ungefähr 110us 
breit.
Als Compiler verwende ich Keil uVision Version 3.

Ich hab mal die Resetfunktion so implementiert:
unsigned char ds1820_reset(void)
{
  unsigned char err;
  err = 0xFF;

  P4_DIR=0x02;     
  P4_1 = 1;

  P3_7 = 1;  
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  P3_7 = 0; 
   
  P4_DIR=0x00;

  P3_6 = 1;
  P3_6 = 0;

  err = P4_1;     // get presence signal
  
  P3_5 = 1;
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  P3_5 = 0;

  if( (P4_1) == 0 )
    err = 1;


  return err;           // presence signal returned
}   // 0=presence, 1 = no part

Mit dem Port3 überprüfe ich, ob die Zeitverzögerungen so einigermaßen 
stimmen. Port4 Pin1 ist die Datenleitung des DS1820 angeschlossen.
Ich bekomme bei der Ausführung dieser Funktion immer eine 1 raus.

Autor: Patrick (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
holger:
Alle 650us ist ein Puls zu sehen. Der Puls ist ungefähr 110us
breit.

Der Dude:
Als Compiler verwende ich Keil uVision Version 3.

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn dein uC wirklich mit 24MHz läuft und für
drei simple Befehle jeweils 36us braucht,
dann hast du irgendwo etwas falsch eingestellt.
Schau mal ins Datenblatt !

Autor: Patrick (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich weiss nicht wo ich da genau schauen muss.
Zuvor habe ich schonmal überüft wie die Systemfrequenz steht. Laut 
EEinstellung liegt diese bei 24Mhz. Extern habe ich einen Resonator von 
8Mhz angeschlossen.

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Ding läuft doch in Zeitlupe mit ungefähr 27kHz.

Schau mal in Kapitel:

Clock Generation Unit

Mehr kann ich dir dazu nicht sagen. Ich kenn den XC888 nicht.

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oder hast du einfach Schrott gemessen ?
Wenn es 110ns sind dann sind wir ungefähr bei
24MHz.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich sach mal auch, das Ding läuft definitiv nicht mit 24MHz.

Hier gibts auch viele mit 8051 Erfahrung, aber die benutzen in der Regel 
die wesentlich bekannteren Atmels, z.B. AT89C51CC03, AT89LP4052 (ich 
auch).

Zu speziellen XC888 Eigenheiten kann ich Dir daher nicht helfen.


Für die standard 8051 hab ich hier funktionierenden Code:

http://home.tiscali.de/peterd/appl/soft/c51/thcloc...

Wenn Du den XC888 entsprechend runtertaktest, sollte er auch da laufen.


Peter

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Wenn es 110ns sind dann sind wir ungefähr bei
>24MHz.

Da hab ich mich gerade gewaltig verrechnet.
Und wenn ich ins Datenblatt sehe dann läuft der
intern sogar mit 96MHz.

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Upps 96MHz stimmt doch nicht:

3.8.2 Clock Management
The CGU generates all clock signals required within the microcontroller 
from a single
clock, fsys. During normal system operation, the typical frequencies of 
the different
modules are as follow:
• CPU clock: CCLK, SCLK = 24 MHz
• Fast clock (used by MultiCAN): FCLK = 24 or 48 MHz
• Peripheral clock: PCLK = 24 MHz
• Flash Interface clock: CCLK2 = 48 MHz and CCLK = 24 MHz

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das nächste interessante ist das hier:

While the standard 8051 processor
is designed around a 12-clock machine cycle, the XC886/888 CPU uses a 
2-clock
machine cycle. This allows fast access to ROM or RAM memories without 
wait state.
Access to the Flash memory, however, requires an additional wait state 
(one machine
cycle). The instruction set consists of 45% one-byte, 41% two-byte and 
14% three-byte
instructions.


Auf 110us für drei Befehle komme ich damit aber auch nicht :(

Autor: Patrick (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also ich weiss nicht was ich jetzt tun sollte. Ich bin total verwirrt.
Das mit der Warteschleife funktioniert nicht sowie mit dem Timer und der 
Datenpin vom DS1820 liefert ständig +5V.

Autor: Patrick (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Mikrocontroller basiert doch auf dem 8051. Dies bedeutet 12 
Taktzyklen entspricht einem Befehl oder?

Autor: Patrick (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also der Mikrocontroller macht mich noch ganz verrückt. Mit den AVR 
Mikrocontrollern kann ich besser umgehen.

Autor: Patrick (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...vielleicht mache ich auch beim Messen mit dem Oszi was falsch.
Ich verwende hier ein Tektronix TDS220.

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Der Mikrocontroller basiert doch auf dem 8051. Dies bedeutet 12
>Taktzyklen entspricht einem Befehl oder?

Nein, siehe oben.
Dein uC läuft mit 24MHz. Ein Machinenzyklus ist 24MHz/2.
Also 12MHz. Sagen wir einfach mal 10MHz um einfacher zu rechnen.

 P4_0=1;
  _nop_();
 P4_0=0;

Das sind für mich drei Befehle.
Sagen wir mal die brauchen alle zwei Zyklen plus
ein Waitstate fürs holen aus dem Flash.

3  3  100ns sind 900ns.
900ns * 1.2 sind 108ns. Schon ziemlich dicht an 110ns :)

>...vielleicht mache ich auch beim Messen mit dem Oszi was falsch.

Undersampling ? Dreh den Zeitbasisknopf doch mal weiter nach rechts.

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>900ns * 1.2 sind 108ns.

So ein Quatsch ! Sind 1.08us.
Ich geh schlafen.

Autor: Patrick (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aber ich komme messtechnisch nicht auf die obige Zeit von ungefähr 
110us.

Die Register für die Einstellung der System Clock:

OSC_CON = 0x05; // external oscillator
CMCON   = 0x00; // clock divider: fsys/4

Autor: Patrick (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Keiner hier der sich gut mit dem XC88x auskennt?

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.