mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik waitMs(500); delay_ms(500);


Autor: N. F. (ferra)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Guten Tag,

ich habe ein paar Fragen bezgl des GCC-Tutorials.

Warum schreibe ich das so:


PORTB = (1<<PB0) | (1<<PB1) | (1<<PB5);

Ich verwende das logische Oder! Aber warum nicht das Logische Und?



Leider gehen bei mir die folgenden Befehle nicht.
waitMs(500);

Es kommt immer folgende Fehlermeldung. Woran könnte das liegen?

compilieren ...
unbenannt.cc  In function 'int main()':
unbenannt.cc:21  21: error: 'waitMs' was not declared in this scope...

Autor: XXX (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Drösel doch mal auf, was bei logischem ODER und was bei logischem UND
herauskommt. Das sollte unterschiedlich sein.

Gruß
Joachim

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  N. F. (ferra)

>Leider gehen bei mir die folgenden Befehle nicht.
>waitMs(500);

Den gibt es ach nicht im AVR GCC Tutorial.

MfG
Falk

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
N. F. schrieb:
> Guten Tag,
>
> ich habe ein paar Fragen bezgl des GCC-Tutorials.
>
> Warum schreibe ich das so:
>
>
> PORTB = (1<<PB0) | (1<<PB1) | (1<<PB5);
>
> Ich verwende das logische Oder! Aber warum nicht das Logische Und?

Weil wir im täglichen Sprachgebrauch oftmals den falschen Begriff 
benutzen.

Du willst ein Gesamtergebnis haben, indem alle Bits gesetzt sind die in 
dem einen oder dem anderen oder dem dritten Teilergebnis gesetzt sind.

Autor: Tom M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo N. F.


> PORTB = (1<<PB0) | (1<<PB1) | (1<<PB5);
> Ich verwende das logische Oder! Aber warum nicht das Logische Und?

Bei den logischen Verknüpfungen geht es um boolsche Algebra. Die 
Ergebnisse der Verknüpfungen kann man in Tabellenform darstellen:

http://de.wikipedia.org/wiki/Boolesche_Algebra#Schreibweise

Ist dir damit klar, wie das "logische Oder" oben funktioniert, um 3 Bits 
im Zielregister PORTB1 zu setzen? Es ist essentiell, dass du die 
boolsche Algebra verstehst; du triffst sie immer wieder an, auch in 
jedem while() oder if() Konstrukt!

> Leider gehen bei mir die folgenden Befehle nicht.
> waitMs(500);

Wer sollte Deiner Meinung nach die Funktion waitMS() bereit stellen? Das 
Tutorial bezieht sich auf das Arbeiten mit der Standardlibrary 
(avr-libc). Schau dir unbedingt die Doku der avr-libc an! Du entdeckst 
da beispielsweise, dass es ein Header File namens util/delay.h gibt, in 
welcher Funktionen zum Warten deklariert werden.


> unbenannt.cc  In function 'int main()':
> unbenannt.cc:21  21: error: 'waitMs' was not declared in this scope...

Schreibst du wirklich ein C++ Programm für deinen Mikro?

Gruss
T

Autor: N. F. (ferra)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok, soweit habe ich das alles verstanden.

Nun habe ich probiert meine eigene Warteschleife zu machen.
Die sieht so aus:

void warten(int zeit);           {
  int count = 0;
  while(count <= zeit) {
    count++;
             };
              }

Es erscheint jedoch immer folgende Fehlermeldung:
17: error: expected unqualified-id before '{' token

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
N. F. schrieb:
> Ok, soweit habe ich das alles verstanden.
>
> Nun habe ich probiert meine eigene Warteschleife zu machen.

Tu's nicht.

Nimm _delay_ms und belass es dabei.
Eine Warteschleifenfunktion ist nämlich gar nicht so einfach zu 
schreiben.


> Es erscheint jedoch immer folgende Fehlermeldung:
> 17: error: expected unqualified-id before '{' token

> void warten(int zeit);           {

was macht der ; zwischen der ) und dem { ?
Der gehört da nicht hin.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
void warten(int zeit);           {
  int count = 0;
  while(count <= zeit) {
    count++;
             };
              }

und gewöhn dir von Anfang an eine saubere außere Form deines Codes an!
Das spart dir viel Zeit in der Fehlersuche wenn es um Logikfehler geht.

Man schätzt, dass man jede Codezeile im Lebenszyklus eines Programms ca. 
15 mal liest, sie aber nur 1 mal schreibt. Jede Sekunde, die du daher 
beim Schreiben des Codes investierst, macht sich durch das oftmalige 
Lesen und schnellere Verstehbarkeit des Codes mehrfach bezahlt!

void warten(int zeit)
{
  int count = 0;

  while(count <= zeit) {
    count++;
  }
}

Ob du jetzt genau dieses { } Schema und dieses Einrückschema benutzt 
spielt weniger die grosse Rolle. Aber irgendein Schema solltest du 
benutzen. Und zwar konsequent.
Und nein: anarchische Schreibweise ist kein zulässiges Schema.
Und nein: äußere Form ist nicht etwas, was man im Nachhinein macht. Man 
macht es gleich! Denn das { } Schema bzw. die Einrückstruktur gibt dir 
ein optische Hilfsmittel über die logische Struktur deines Codes in die 
Hand. Und genau das brauchst du während der Entwicklungszeit.

Autor: N. F. (ferra)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es läuft zumindest so wie es soll, für den rest bin ich ja am lernen. 
Danke an euch alle. :)
//----------------------------------------------------------------------
// Titel     : C Grundgerüst
//----------------------------------------------------------------------
// Funktion  : ...
// Schaltung : ...
//----------------------------------------------------------------------
// Prozessor : ...
// Takt     : 3.6864 MHz
// Sprache   : C
// Datum     : ...
// Version   : ...
// Autor     : ...
//----------------------------------------------------------------------
#define   F_CPU 3686400  // Taktfrequenz des myAVR-Boards
#include  <avr\io.h>      // AVR Register und Konstantendefinitionen
//----------------------------------------------------------------------
void warten(int zeit)           {
  int count = 0;
  while(count <= zeit) {
    count++;
                };
                    }

int main (void)
{
  DDRB  = 0xff;

  while(1)     {
    PORTB = (1<<PB0) | (1<<PB1) | (1<<PB5);
    warten(10000);
    PORTB = (1<<PB2) | (1<<PB3) | (1<<PB4);
    warten(10000);
          }

  /* wird nie erreicht */
  return 0;
}

//----------------------------------------------------------------------

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
N. F. schrieb:
> Es läuft zumindest so wie es soll,

Dann schalt mal den Optimizer ein :-)
-> Der wirft dir deine Wartefunktion ratz-fatz raus.

Oder betreibe deinen Code bei abgeschaltetem Optimizer auf einem µC mit 
anderer Taktfrequenz :-)
-> Nichts stimmt mehr.


Verwende _delay_ms! Das ist so geschrieben, dass beide Problemkreise 
berücksichtigt sind.

Autor: Peter von Frosta (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ganz cshön schlaue und fleißige leute hier... das freut mich!
vllt hilft mir auch einer zügig?! :-)

_delay_ms(xx);
welchen header muss ich includen um diese funktion nutzen zu können?

vllt noch eine andere frage, die nich tunbedingt zum thema passt:

ich wollte die definitionen von funktionen (zunächst eine funktion) in 
eine extra c-datei (PortSetup.c) auslagern. hab die dann auch per
#include "PortSetup.c"
eingebunden
 da bekam ich jedoch immer die fehlermeldung:

mutliple declaration von 'init_portd'...
(.../.../PortSetup.c)firt declaration here...

was kann die ursache für diesen fehler sein?
wenn ich die Funktionsdeklaration über das haubtprogramm packe 
funktioniert alles.
muss vllt trotz auslagerung der definition, ein Prototyp der Funktion 
über der main(void) stehen?

danke euch allen schonmal im vorraus! :)

Autor: Michel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter von Frosta schrieb:
> welchen header muss ich includen um diese funktion nutzen zu können?

Guckst du hier
Beitrag "Re: waitMs(500); delay_ms(500);"

Autor: Guru (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>muss vllt trotz auslagerung der definition, ein Prototyp der Funktion
>über der main(void) stehen?
So ist es. Sonst weiss der Compiler ja nicht, das es diese Funktion gibt 
und welche Parameter sie hat. Zwar geht er dann von Defaults aus, wenn 
sich dabei aber widersprüche ergeben meldet spätestens der Linker einen 
Fehler.

Includen von C-Dateien ist übrigen sowieso "Pfui". Include ist nur für 
H-Dateien.
Du fügst C-Dateien in das Projekt ein. Je nach Entwicklungsumgebung 
entweder direkt in das Makefile oder z.B. bei AVRStudio in dem Du im 
Projekt Tab unter den C-Dateien mit Maustase rechts eine weitere C-Datei 
angibst.

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.