mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Gepollte Variable nicht variabel?


Autor: bushobbyentwickler (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
while(1)
  {
    _delay_ms(1000);  
    if (StatusPin_Aktiv != 0)
    {
      StatusPin = !StatusPin;
    }
    else
    {
      StatusPin = LED_AUS;
    }
  }

Autor: bushobbyentwickler (Gast)
Datum:

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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Severino R. (severino)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: bushobbyentwickler (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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....

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: bushobbyentwickler (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
StatusPin ist ein Bit eines Ports (über ein Bitfeld angesteuert)

Autor: bushobbyentwickler (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: bushobbyentwickler (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also bitteschön:

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

  laenge = RX_Buffer.Content;

  for (i = 0; i < laenge; i++)
  {
    Message[i] = GetByte(&RX_Buffer);
  }

  i = 0;

  switch (Message[i])
  {
    case 0x02:  // Status-LED: Wenn laenge = 1 dann Status zurücksenden, bei laenge = 2 ein/ausschalten und neuer Status zurücksenden
          if (laenge == 2)
          {
            if (Message[1] = 0x00)
            {
              StatusPin_Aktiv = 0;
            }
            if (Message[1] = 0x01)
            {
              StatusPin_Aktiv = 1;
            }
          }
          UART_send_char(StatusPin_Aktiv);
          break;

    default:  // Ungültiger Befehl
          ;
  }

}

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
bushobbyentwickler wrote:
...
            if (Message[1] = 0x00)
...
            if (Message[1] = 0x01)
...

"=="!

Autor: bushobbyentwickler (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Uuuuuuuuuuuuuuuuuuuuuuuuppppppppps

Peinlich.....

Autor: bushobbyentwickler (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
funktioniert aber trotzdem noch nicht

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht 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)".

Autor: bushobbyentwickler (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.