Forum: Mikrocontroller und Digitale Elektronik Gepollte Variable nicht variabel?


von bushobbyentwickler (Gast)


Lesenswert?

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
  }

von bushobbyentwickler (Gast)


Lesenswert?

achja: Die Variable um die es sich dreht heißt (char) StatusPin_Aktiv

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Ach ja: auch du solltest die FAQ mal lesen:

http://www.nongnu.org/avr-libc/user-manual/FAQ.html

Ist nicht umsonst der erste Eintrag in der FAQ...  Das ist wohl die
most FAQ schlechthin.

von Severino R. (severino)


Lesenswert?

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.

von bushobbyentwickler (Gast)


Lesenswert?

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

von Stefan E. (sternst)


Lesenswert?

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.

von bushobbyentwickler (Gast)


Lesenswert?

StatusPin ist ein Bit eines Ports (über ein Bitfeld angesteuert)

von bushobbyentwickler (Gast)


Lesenswert?

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

von Stefan E. (sternst)


Lesenswert?

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.

von bushobbyentwickler (Gast)


Lesenswert?

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
}

von Stefan E. (sternst)


Lesenswert?

bushobbyentwickler wrote:
1
...
2
            if (Message[1] = 0x00)
3
...
4
            if (Message[1] = 0x01)
5
...

"=="!

von bushobbyentwickler (Gast)


Lesenswert?

Uuuuuuuuuuuuuuuuuuuuuuuuppppppppps

Peinlich.....

von bushobbyentwickler (Gast)


Lesenswert?

funktioniert aber trotzdem noch nicht

von Stefan E. (sternst)


Lesenswert?

Dann lasse dir zur Kontrolle hier "UART_send_char(StatusPin_Aktiv);" mal 
Message[1] zurücksenden. Und ist laenge überhaupt genau 2? Ändere das 
mal auf "if (laenge >=2)".

von bushobbyentwickler (Gast)


Lesenswert?

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.

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.