Funktionen aufrufen aber wie?

OP #1401828
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.
OP
danke für die Hilfe.

Ich merke schon ich hatte zulange nix mit C zu tun.
bei     delay     musste man doch die <time.h> einbinden oder?
Gibt aber nur Fehlermeldungen.

Wie schalte ich den die Optimierung aus.
Ich verwende AVR Studio mit der GCC Applikation.

mfg
N.O.
Gast
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
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
> 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
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
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
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.
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
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

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.