Gepollte Variable nicht variabel?

Gast #859850
Hallo,

ich habe das Problem: Ich habe in einem Programm eine globale Variable 
(in einer Headerdatei definiert). Diese Headerdatei binde ich in 2 
Modulen (main.c und UART.c) ein, damit ich aus beiden Modulen auf die 
Variable zugreifen kann.
Diese Variable wird in der while(1)-Schleife in der main()-Funktion 
abgefragt. Je nach Wert der Variablen soll dann eine LED leuchten oder 
nicht.
Wenn ich aber jetzt aus dem anderen Modul (UART.c) diese Variable 
ändere, hat dies keine Auswirkung auf den Wert der Variablen. Der Wert 
bleibt immer so, wie er am Anfang des Programms initialisiert wurde.

Kann mir da einer helfen?

Hier der Teil in dem die Variable gepollt wird:

main.c:
1
while(1)
2
  {
3
    _delay_ms(1000);  
4
    if (StatusPin_Aktiv != 0)
5
    {
6
      StatusPin = !StatusPin;
7
    }
8
    else
9
    {
10
      StatusPin = LED_AUS;
11
    }
12
  }
Du solltest die Variable nicht in einer Headerdatei definieren, sondern 
in einer .c-Datei. Sonst wird sie beim Compilieren der main.c 
definiert und nochmals bei der UART.c.

Also: global definieren in z.B. in der UART.c und deklarieren in der 
Headerdatei.
Gast
Also ich hab die Variable jetzt so in der main.c definiert:

volatile char StatusPin_Aktiv;

In der UART.h hab ich jetzt stehen:

extern volatile char StatusPin_Aktiv;


So müsste es doch gehen oder? Geht aber nicht....
bushobbyentwickler wrote:

> So müsste es doch gehen oder? Geht aber nicht....

Was vermutlich an dieser Zeile liegt:
StatusPin = !StatusPin;

Das "!" ist ein logisches Not, kein binäres. So funktioniert das 
höchstens dann, wenn StatusPin der erste Pin am Port ist.
Gast
Also das Blinken des Pins funktioniert ja wunderbar, nur will ich das 
mit der Variable StatusPin_Aktiv an und ausschalten können, und DAS 
funktioniert ja nicht
bushobbyentwickler wrote:

> Also das Blinken des Pins funktioniert ja wunderbar, nur will ich das
> mit der Variable StatusPin_Aktiv an und ausschalten können, und DAS
> funktioniert ja nicht

Dann mal her mit dem Code, wo du StatusPin_Aktiv veränderst.
Gast
Also bitteschön:

Datei uart.c
1
#include "uart.h" // <-- Hier ist die Variable deklariert ("extern volatile char StatusPin_Aktiv;")
2
[...]
3
void MsgAuswerten(void)
4
{
5
  unsigned char laenge;
6
  unsigned char Message[2];
7
  unsigned char i;
8

9
  laenge = RX_Buffer.Content;
10

11
  for (i = 0; i < laenge; i++)
12
  {
13
    Message[i] = GetByte(&RX_Buffer);
14
  }
15

16
  i = 0;
17

18
  switch (Message[i])
19
  {
20
    case 0x02:  // Status-LED: Wenn laenge = 1 dann Status zurücksenden, bei laenge = 2 ein/ausschalten und neuer Status zurücksenden
21
          if (laenge == 2)
22
          {
23
            if (Message[1] = 0x00)
24
            {
25
              StatusPin_Aktiv = 0;
26
            }
27
            if (Message[1] = 0x01)
28
            {
29
              StatusPin_Aktiv = 1;
30
            }
31
          }
32
          UART_send_char(StatusPin_Aktiv);
33
          break;
34

35
    default:  // Ungültiger Befehl
36
          ;
37
  }
38

39
}
Gast
hab ich gemacht...

Aber es funktioniert jetzt, hab in der Windows-Anwendung etwas 
vergessen... (hab beim Ein- und Ausschaltebutton) beides mal die 
StatusLED eingeschaltet....

Fall erledigt.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 18 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.