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


von N. F. (ferra)


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...

von XXX (Gast)


Lesenswert?

Hallo

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

Gruß
Joachim

von Falk B. (falk)


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

von Karl H. (kbuchegg)


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.

von Tom M. (Gast)


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

von N. F. (ferra)


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

von Karl H. (kbuchegg)


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.

von Karl H. (kbuchegg)


Lesenswert?

1
void warten(int zeit);           {
2
  int count = 0;
3
  while(count <= zeit) {
4
    count++;
5
             };
6
              }

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!

1
void warten(int zeit)
2
{
3
  int count = 0;
4
5
  while(count <= zeit) {
6
    count++;
7
  }
8
}

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.

von N. F. (ferra)


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;
}

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

von Falk B. (falk)


Lesenswert?


von Karl H. (kbuchegg)


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.

von Peter von Frosta (Gast)


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! :)

von Michel (Gast)


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);"

von Guru (Gast)


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.

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.