Funktionen aufrufen aber wie?

OP #1401828
Lesenswert?

Hallo zusammen,

Nach dem jetzt endlich die Hardware läuft und auch die ersten 
Gehversuche (seit Jahren) mit dem C-Programmieren gelungen sind wollte 
ich jetzt mal das Programm Strukturieren und in Funktionen gliedern.

Aber irgendwie werden die Funktionen nicht abgearbeitet.

muss man für Funktionen noch eine Headerdatei einbinden?
Soweit ich weiß reicht dafür die <stdio.h>

Hier mal ein einfaches Beispeil für ein Blinklicht.
Aber selbst das geht nicht.
Kann mir bitte jemand helfen?


//**********************************************************
#include <avr/io.h>
#include <stdio.h>


void Zeit(void);              // Deklarationen


int main (void)
  {
  DDRB = 0xFF;


  while (1)
    {
     PORTB = 0xFF;
    Zeit();
    PORTB = 0x00;
    Zeit();
    }
        return 0;
        }
//*******************************************************
void Zeit (void)
    {
    unsigned int i=60000;

  while (i)
    {
    i = i-1;
    }
  }

//******************************************************

Danke schon mal im vorraus
mfg
N.O.
Gast #1401877
Lesenswert?

waaas?
aus welchem grund soll da der compiler was wegoptimieren? er entscheidet 
nicht was "sinnvoll" ist oder nicht....

wenn du festgelegte genaue zeiten brauchst ohne den uC dauern zu 
belasten, verwendest du besser einen timerinterrupt
OP #1401887
Lesenswert?

Das mit den Interrupts will ich mir später mal wieder in Erinnerung 
rufen.

Im Augenblick geht erst mal nur darum Funktionen aufrufen zu können.
und leider geht das bei mir nicht.

Die LED's leuchten für das Menschliche Auge Dauerhaft.
Und beim Simulieren sieht man das die Funktion gar nicht Abgeharbeit 
wir.

Sondern halt nur das Main Programm.
Also Leds an Leds aus Leds wieder an.

Die Taktfrequens ist noch die Interne als 1MHz

mfg
N.O.
Moderator (Firma: Titel) Persönliche Seite #1401892
Lesenswert?

> aus welchem grund soll da der compiler was wegoptimieren?
> er entscheidet nicht was "sinnvoll" ist oder nicht....
Der Compiler sieht, dass diese Funktion:
1
void Zeit (void)
2
{
3
  unsigned int i=60000;
4

5
  while (i)
6
  {
7
     i = i-1;
8
  }
9
}
genau das selbe ist, wie diese:
1
void Zeit (void)
2
{
3
   unsigned int i=0;
4
}
und entscheidet dann, dass sich ein Aufruf dieser Funktion an sich 
erübrigt, weil sie keinerlei logische Auswirkungen auf den 
Programmablauf hat.

Es ist nirgends dokumentiert, wie lange eine Operation wie i=i-1 dauert. 
Und daher kann der Compiler für diese Operation genausogut die Zeit 0 
ansetzen.

Das ist aber wirklich die allerunterste Optimierungs-Schublade :-o
Ich kann mich da nur Andi D. im 
Beitrag "Re: Funktionen aufrufen aber wie?" anschliessen.
Moderator (Firma: Titel) Persönliche Seite #1401895
Lesenswert?

Nick Olaus schrieb:
> bei     delay     musste man doch die <time.h> einbinden oder?
#include <util/delay.h>
Es geht ganz speziell um _delay_ms(), nicht irgend ein anderes delay...

> Wie schalte ich den die Optimierung aus.
> Ich verwende AVR Studio mit der GCC Applikation.
Project -> Configuration Options -> General -> Optimization
Default ist -Os = Optimierung auf Codegröße
Du brauchst für deinen Code -O0 (minus Optimization Zero)
OP #1401899
Lesenswert?

Schön aber wie kann ich die Optimierung ausschalten.
Ich finde nur die Konfigurations-Optionen und da find ich kein 
Optimierung Butten ON/Off.

Aber selbst bei dem Programm

  while (1)
          {
     PORTB = 0xFF;
      //Zeit();
    k=0;
    PORTB = 0x00;
    k=1;
    //Zeit();
    }

Setzt der Simulator "k" nicht sondern überspringt den Befehl.
Hätte nicht gedacht das so ein blöder sch... einem das WE versauen kann.

mfg
N.O.
OP #1401903
Lesenswert?

Lothar Miller schrieb:

> Project -> Configuration Options -> General -> Optimization
> Default ist -Os = Optimierung auf Codegröße
> Du brauchst für deinen Code -O0 (minus Optimization Zero)

DANKE das war wonach ich gesucht hab.
Soll auch mal einer drauf kommen was -0s bedeuten soll.

Auf jeden fall funktioniert es jetzt und "k" wir jetzt auch gesetzt.

mfg
N.O.
#1401955
Lesenswert?

Die Optimierung ausschalten ist völliger Quatsch.
Wenn die Programme ein µ größer werden, fällt Dir das voll auf die Nase.

Der AVR-GCC hat eine delay.h, benutze sie einfach.

Und der große Vorteil ist, die Zeiten muß man nicht rumprobieren, die 
stimmen (wenn die Interruptlast nicht extrem hoch ist).


Peter
Gast #1403445
Lesenswert?

Wenn unbedingt so NOP-Schleifen sein müssen, kann man die Zählvariable 
als volatile deklarieren.

BTW: Dass sowas wegoptimiert wird, ist AFAIK ein Verhalten neuerer 
gcc-Versionen. Die frühern (2.x ganz sicher) hatten extra eine Erkennung 
für sowas.

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