Forum: Compiler & IDEs Simulatorfehler mit Delay??


von Michael (Gast)


Lesenswert?

Hallo!

Ich hab ein Problem mit der delay funktion.
Ich möchte bei einer Frequenz von 10Mhz ein 16ms delay erzeugen.
So wie ich die Doku verstehe geht die delay funktion bei 10 MHz bis
26.2 ms. Bin also noch im gültigen berreich. Ich hab auch keine
Probleme beim compilieren. Ich benutze die version die man mit util/
includet. Wenn ich jetzt den Simulator anwerfe, dann wird immer nur der
erste Aufruf von delay ausgeführt. Jeder weitere wird übersprungen.
Fehler im Simulator? Fehler im bei mir? Kennt das jemand? Das ist mein
ertkontakt mit der delay Funktion. Hab die doku gelesen und viel im
Forum aber nix erklärendes gefunden. Ich hab unten mal ein Codefragment
angehängt das mein Problem ein bisschen zeigt. Bin für jeden Tipp
dankbar.

Gruß Michael


void init_LCD_Lib(){

  DDRC = 0xFF;  //alle Pins an Port C sind Output
  PORTC = 0x00; //Ausgang mit Nullen füllen

  _delay_ms(16.0); //<== wird ausgeführt

  bool eightBitInterface = false;
  bool twoLineDisplay = true;
  bool tenDots = true;

  _delay_ms(16.0); //<== wird übersprungen warum?!?!

  LCD_SetFunction(eightBitInterface, twoLineDisplay, tenDots);

}

von MasterFX (Gast)


Lesenswert?

Ich glaube dein Problem liegt darin, dass du eine Fließkommazahl an die
Funktion übergibst. Zwar sollte es eigentlich keine Probleme geben (da
einfach nur die Nachkommastellen abgeschnitten werden), dennoch würde
ich mal nen integer-Wert probieren.

von Michael (Gast)


Lesenswert?

Hi!
Die funktion erwartet doch einen double oder?
Ich habs mal versucht hat nix geholfen ....

von Michael (Gast)


Lesenswert?

Kann das an einer Compiler optimierung liegen?
Der Simulator will einfach die Zeile nicht ausführen...
Auf welcher  Compilereinstellung muß ich das ganze denn stehen haben?
Muß ich evtl noch was anderes machen außer den folgednen EIntrag in der
h dadei?

#include <avr/io.h>
#ifndef F_CPU
#define F_CPU 10000000UL     /* Quarz mit 10.0 Mhz  */
#endif
#include<util/delay.h>

von Steffen (Gast)


Lesenswert?

Hab gerade genau das gleiche Problem.

void shiftout(char DATA,char CLOCK, int dsp_char_out,int delay_clock, 
int delay_send)
{
  int n;

  for (n=0; n<7; n++)  {           // Sende 8 BIT
  PORTB |= (1 << CLOCK);         // CLOCK = 1
 _delay_ms(1);     // Zeit die der CLOCK ausgang auf
  PORTB &= ~(1 << CLOCK);        // Ausgabe des Schiebetakt, CLOCK = 0
  if (dsp_char_out & (0x80 >> n))  // Daten an Display ausgeben, 
MSBfirst
    {
      PORTB |= (1 << DATA);
    }

    else
    {
      PORTB &= ~(1 << DATA);
   }
  _delay_ms(1);     // Zeit die das Signal am PORT anliegt
 }

der Simulator führt die erste _delay_ms Funktion aus und überspringt 
dann aber die zweite.Wobei die Beiden ja genau die gleiche Delay Zeit 
haben.
Kann mir hierbei jemand helfen? Kann ich die delay-Funktion nur einmal 
verwenden, was ja eigentlich nicht sein kann?

von Optimierer 2007 (Gast)


Lesenswert?

Bei AVR Studio und WinAVR die Optimierung auf -Os einstellen

von Steffen (Gast)


Lesenswert?

Danke für die Hilfe. Leider hab ich die Einstellung im AVR Studio 
gefunden und auch so vorgenommen. Könnte mir bitte noch jemand sagen, wo 
ich die Einstellung im WinAVR vornehmen kann.
Danke!

von Steffen (Gast)


Lesenswert?

So hab jetzt auch die Einstellung im WinAVR gefunden und vorgenommen. 
Leider funktioniert der zweite Aufruf der delay Funktion immer noch 
nicht.
Wenn ich allerdings beim zweiten Aufruf _delay_us(1) schreibe, dann 
funktioniert es auf einmal... Kann mir irgendjemand sagen, wo da der 
Fehler liegt, bzw. wie ich es mit zweimal _delay_ms() zum laufen 
bekomme?

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.