Forum: Mikrocontroller und Digitale Elektronik Verständnissproblem Auswertung dcf77


von René S. (ren_s)


Lesenswert?

Hallo,

ich bin gerade dabei eine eigene lib zur erfassung der uhrzeit mittels 
dcf1 empfänger zu programmieren.
Ich benutze dazu den INT0 in kombination mit einem timer. Der Timer 
läuft los, int0 detektiert jede pegeländerung und wenn die zeit +-1s 
beträgt habe ich die minutenmarke.

danach setze ich den int0 als normalen eingang, resete den timer, und 
frage dann gezielt mittels timerinterrupt den zustand am eingang des 
dcf1 nach einer vordefinierten zeit auf eine 0 oder 1 ab.
Wenn dies 60 mal passiert ist setze ich eine variable, die mir dann 
signalisiert, dass alles vorbei ist auf 1.
Diese Variable möchte ich dann im Hauptprogramm nutzen, um meine Uhrzeit 
auszuwerten und auf einem display anzeigen zu lassen.

Das problem ist jetzt, dass der compiler Fehlermeldungen bezüglich 
dieser Variable produziert.

Die ISR Routinen sind in der dcf77 lib, weil ich ja möchte, dass diese 
universell einsetzbar ist. Dort ist ebenfalls die Variable deklariert.
Im Hauptprogramm frage ich diese ab, was zur folge hat, dass diese nicht 
bekannt ist.

Wenn ich dann die Variable im Hauptprogramm deklariere erkennt sie die 
ISR nicht mehr.

Wenn ich die Variable im headerfile deklariere und dann diese sowohl im 
Hauptprogramm und in der lib einbinde erhalte ich die fehlermeldung, 
dass sie doppelt deklariert ist.

Habe schon nachgelesen, dass es pfuschig ist variablen im headerfile zu 
deklarieren, und dass normalerweise globale variablen zu meiden sind, 
diese regel jedoch aufgrund der ISRs bei AVRs etwas "aufgeweicht" ist.

Wie ist denn der normale weg bei soetwas? Habe jetzt schon einige libs 
programmiert aber bin irgendwie noch nie auf so einen fehler gestoßen, 
bin grade etwas verwirrt!! :(


bin für jede Antwort dankbar,

viele Grüße, René

von Peter D. (peda)


Lesenswert?

René S. schrieb:
> Das problem ist jetzt, dass der compiler Fehlermeldungen bezüglich
> dieser Variable produziert.

Das ist doch nett vom Compiler, Dir Deine Fehler zu zeigen und zu 
erklären.

Und was erhoffst Du Dir davon, diese Meldung vor uns geheim zu halten, 
sowie den dazugehörenden Quelltext (*.h, *.c-Files)?

Die Hellseher sind gerade alle in Urlaub.

von Dominik S. (dasd)


Lesenswert?

Vermutung:
Schlüsselwort "extern"

Alternativ:
set/get-Methoden

von Fabian O. (xfr)


Lesenswert?

Wenn es wirklich eine globale Variable sein soll:

dcf77.h
1
extern bool dcf77_alles_vorbei;

dcf77.c
1
#include "dcf77.h"
2
3
bool dcf77_alles_vorbei;

main.c
1
#include "dcf77.h"
2
3
int main(void) {
4
  // ...
5
  if (dcf77_alles_vorbei) {
6
    // ...
7
  }
8
}

Statt einer globalen Variable ist aber fast immer eine Zugriffsfunktion 
der bessere Weg:

dcf77.h
1
bool dcf77_alles_vorbei(void);

dcf77.c
1
#include "dcf77.h"
2
3
static bool alles_vorbei;
4
5
bool dcf77_alles_vorbei(void) {
6
  return alles_vorbei;
7
}

main.c
1
#include "dcf77.h"
2
3
int main(void) {
4
  // ...
5
  if (dcf77_alles_vorbei()) {
6
    // ...
7
  }
8
}

von René S. (ren_s)


Angehängte Dateien:

Lesenswert?

Peter Dannegger schrieb:
> René S. schrieb:
>> Das problem ist jetzt, dass der compiler Fehlermeldungen bezüglich
>> dieser Variable produziert.
>
> Das ist doch nett vom Compiler, Dir Deine Fehler zu zeigen und zu
> erklären.
>
> Und was erhoffst Du Dir davon, diese Meldung vor uns geheim zu halten,
> sowie den dazugehörenden Quelltext (*.h, *.c-Files)?
>
> Die Hellseher sind gerade alle in Urlaub.

klar ist das nett vom compiler, ich verstehe nur nicht, warum eine 
augenscheinlich als "global" deklarierte variable anscheinend nicht fürs 
ganze projekt "global" ist. Deswegen ja auch in der überschrift 
"Verständnissproblem"!

im Anhang der quellcode, habe keine geheimnisse...
die fehlermeldung, die der compiler bringt lautet dann

Fehler  1  'auswertung' undeclared (first use in this function)
Fehler  2  each undeclared identifier is reported only once for each 
function it appears

von Karl H. (kbuchegg)


Lesenswert?

René S. schrieb:

>
> klar ist das nett vom compiler, ich verstehe nur nicht, warum eine
> augenscheinlich als "global" deklarierte variable anscheinend nicht fürs
> ganze projekt "global" ist. Deswegen ja auch in der überschrift
> "Verständnissproblem"!

Dein Verständnisproblem dürfte darin begründet sein, dass du dem 
Compiler Fähigkeiten andichtest, die er nicht hat.

Für deinen Compiler existiert kein 'Projekt'!

Für deinen Compiler existieren nur C-Files, die er eines nach dem 
anderen übersetzt. Jedes für sich alleine und ohne Ansehen der anderen 
C-Files.

Daher muss jedes einzelne C-File in sich und für sich alleine 
vollständig sein!

Globale Variablen werden in einem C-File definiert
1
int i;

und andere C-Files können sich darauf beziehen
1
extern int i;

dieses extern bedeutet: Irgendwo existiert eine Variable namens i und 
sie ist ein int. Aber es sagt nichts darüber aus, wo dieses 'irgendwo' 
ist, in welchem anderen C-File. Und es interessiert den Compiler auch 
nicht in welchem anderen C-File es ist. Denn im Moment compiliert er das 
2.te C-File und alles was im ersten C-File enthalten ist ... davon weiß 
er nichts.

Es ist dann erst die Aufgabe des Linkers die Einzelteile 
zusammenzuführen. Erst dort werden die Querverbindungen zwischen den 
einzelnen, bereits compilierten C-Files hergestellt.

Ergo:
Sieh dir jedes C-File für sich alleine an. Von oben nach unten. #include 
ersetzt du (meinetwegen in Gedanken) durch den jeweiligen Inhalt des 
Header-Files.
Das ist deine Welt. Alles was sich in diesem Text abspielt, ist das was 
beim Compilieren interessant ist.
Alles was nur in anderen C-File existiert ist hingegen (für den 
Compiler) uninteressant und nicht von Belang wenn er dieses eine 
spezielle C-File compiliert.


C kennt keinen Source Code übergreifenden Projektgedanken, in dem sich 
der Compiler aus 25 Files die Dinge zusammensucht, so wie das in anderen 
Programmiersprachen der Fall ist.

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.