Forum: Mikrocontroller und Digitale Elektronik [C] Sehe den Fehler nicht - multiple definition of "flag"


von Stephan W. (stipo)


Lesenswert?

Hallo zusammen,
ich sehe da den Fehler nicht. Füge einfach mal den betreffenden Code 
ein.

Timer.h
1
#ifndef TIMER_H_
2
#define TIMER_H_
3
4
volatile uint8_t flag = 0;
5
6
void InitialTimer(void);
7
ISR (TIMER0_OVF_vect);
8
9
10
11
#endif /* TIMER_H_ */

Timer.c
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
#include "Timer.h"
4
5
uint8_t count = 0;
6
7
8
void InitialTimer(void)
9
{
10
  // Timer 0 konfigurieren
11
  TCCR0B = ((1<<CS00)|(1<<CS02)); // Prescaler 8 <-- Hier zeigt der Fehler hin.
12
  
13
  // Overflow Interrupt erlauben
14
  TIMSK0 |= (1<<TOIE0);
15
}
16
17
18
ISR (TIMER0_OVF_vect)
19
{
20
  if (count == 30)
21
  {
22
    //PORTD ^= (1<<PD0);
23
    flag = 1;
24
    count = 0;
25
  }
26
  count++;
27
}

Main.c
1
// µC Frequenz
2
#define F_CPU 8000000UL
3
4
... 
5
6
#include <avr/io.h>
7
#include <util/delay.h>
8
#include <avr/interrupt.h>
9
#include "Timer.h"
10
11
12
int main(void)
13
{
14
  ...
15
16
         InitialTimer();
17
  sei();
18
  
19
  ...
20
  
21
  // Beginn der Hauptschleife
22
  while(1)
23
  {    
24
    if (flag == 1)
25
    {
26
      DATAPORT ^= (1<<PD0);
27
      flag = 0;
28
    }
29
                  ...    
30
  }
31
}

Ich muss doch, wenn ich eine Variable nicht nur innerhalb einer 
Quelldatei nutzen möchte, die in der Header Datei angeben. Das 
funktioniert soweit auch, das mir Intellisens die Variable anbietet, 
wenn ich in der main.c die Header Datei einbinde.

Nur warum meckert der Compiler, das ich die Variable in folgender Zeile 
doppelt definiere.
1
TCCR0B = ((1<<CS00)|(1<<CS02)); // Prescaler 8

Wo muss ich meine Gedanken noch ordnen, das es funktioniert?

Grüße
Stephan

von B e r n d W. (smiley46)


Lesenswert?

Timer.h
extern volatile uint8_t flag;

Timer.c
volatile uint8_t flag = 0;

von Stephan W. (stipo)


Lesenswert?

Hallo Bernd,

danke erstmal. Das hat geklappt.
Jetzt muss ich mal nachlesen, was das extern bewirkt und warum da mein 
Gedanke falsch war.

von Peter D. (peda)


Lesenswert?

Stephan W. schrieb:
> Nur warum meckert der Compiler

Man muß die Meldung auch mal lesen.
Da steht ganz genau drin, welches File,Zeile er anmeckert und wo es 
zuerst steht.


Peter

von Stephan W. (stipo)


Lesenswert?

Peter Dannegger schrieb:
> Man muß die Meldung auch mal lesen.
> Da steht ganz genau drin, welches File,Zeile er anmeckert und wo es
> zuerst steht.
Peter, klar hab ich den Fehler gelesen und auch verstanden was mir der 
Compiler da sagen will "Doppelte Definition der Variable", aber ich hab 
mal so garnicht verstanden "Warum".

Nur deshalb hab ich da nachgefragt. Ganz auf den Kopf gefallen bin ich 
nicht und ich kann mit Compiler Fehler umgehen (C# Programmierung).

von B e r n d W. (smiley46)


Lesenswert?

> Nur warum meckert der Compiler

Falls Du eine Variable im Header definierst, wird diese in jedem C-File, 
welcher den Header included, im Speicher angelegt. Der Linker bemerkt 
dann, dass eine globale Variable mit selbem Namen mehrfach vorhanden 
ist.

von Stephan W. (stipo)


Lesenswert?

B e r n d W. schrieb:
>> Nur warum meckert der Compiler
>
> Falls Du eine Variable im Header definierst, wird diese in jedem C-File,
> welcher den Header included, im Speicher angelegt. Der Linker bemerkt
> dann, dass eine globale Variable mit selbem Namen mehrfach vorhanden
> ist.

Danke, das ist eine Erklärung die verständlich ist und einleuchtet.
Ich hab schon mein C-Buch aufgeschlagen und werde mal noch da nachlesen.

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.