www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik R8C: Variablen spinnen


Autor: Sven B. (v3rtex)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Desöfteren habe ich bereits Prjekte mit dem R8C Elektor Board 
realisiert, welche bisher auch einwandfrei funktionieren.
Jetzt stehe ich jedoch vor einem Problem, das mich schon mehrere Tage 
beschäftigt.

Im Grunde soll das Projekt eine simple Uhr darstellen, die mithilfe von 
vier 7-Segmentanzeigen die Uhrzeit anzeigen soll (Stunde und Minute).

Nun hier mal die grundlegenden, dafür zuständigen Codeausschnitte:

Variablen:
#define SEG1_sperren p0_4
#define SEG2_sperren p0_5  
#define SEG3_sperren p0_6
#define SEG4_sperren p0_7

int Stunde_Zehner = 0;
int Stunde_Einer = 0;
int Minute_Zehner = 0;
int Minute_Einer = 0;
int Sekunde_Zehner = 0;
int Sekunde_Einer = 0;
int Sekunde = 0;

int SEG1_neu = 0;
int SEG1_alt = 0;
int SEG2_neu = 0;
int SEG2_alt = 0;
int SEG3_neu = 0;
int SEG3_alt = 0;
int SEG4_neu = 0;
int SEG4_alt = 0;


Funktionen:
void SEG1_Ausgabe(int Wert1)
{
  SEG1_neu = Wert1;
  
  if(SEG1_neu != SEG1_alt)
  {    
    SEG1_sperren = FALSE;  // Sperre SEG1 aufheben
    BCD_Ausgabe(Wert1);  // BCD Wert ausgeben
    SEG1_sperren = TRUE;  // Sperre SEG1 aktivieren
      
    SEG1_alt = Wert1;
  }
}
  
void SEG2_Ausgabe(int Wert2)
{
  SEG2_neu = Wert2;
    
  if(SEG2_neu != SEG2_alt)
  {
    SEG2_sperren = FALSE;
    BCD_Ausgabe(Wert2);
    SEG2_sperren = TRUE;
      
    SEG2_alt = Wert2;
  }
}
  
void SEG3_Ausgabe(int Wert3)
{
  SEG3_neu = Wert3;
    
  if(SEG3_neu != SEG3_alt)
  {    
    SEG3_sperren = FALSE;
    BCD_Ausgabe(Wert3);
    SEG3_sperren = TRUE;
      
    SEG3_alt = Wert3;
  }
}
  
void SEG4_Ausgabe(int Wert4)
{
        SEG4_neu = Wert4;
    
  if(SEG4_neu != SEG4_alt)
  {    
    SEG4_sperren = FALSE;
    BCD_Ausgabe(Wert4);
    SEG4_sperren = TRUE;
      
    SEG4_alt = Wert4;
  }
}


Wenn ich nun in der Main folgendes aufrufe...
while(1)
{    
  SEG1_Ausgabe(1);
  SEG2_Ausgabe(2);
  SEG3_Ausgabe(3);
  SEG4_Ausgabe(4);
}
...funktioniert alles perfekt.
Auch bei anderen Werten die ich direkt (ohne Variable) der Funktion 
übergebe.

Nun zum Problem:
wenn ich die übergegebenen Werte testweise durch meine Variablen 
ersetze...
while(1)
{    
  SEG1_Ausgabe(1);
  SEG2_Ausgabe(2);
  SEG3_Ausgabe(Minute_Zehner);
  SEG4_Ausgabe(Minute_Einer);
}
...in der bereits die richtigen Werte stehen, wird immer der Wert vom 
vorhergehenden Element übernommen.

Kurz:
Übergebe ich von 1 nach 4 zum Beispiel 5, 6, Variable1, Variable2
steht auf den Segmenten 5666

Oder:
Übergebe ich von 1 nach 4 zum Beispiel 3, Variable1, Variable2, 6
steht auf den Segmenten 3336

Zu geringe Umschaltzeiten an den Segmenten konnte ich bereits 
ausschließen-

Es ist etwas schwer auszudrücken, aber ich hoffe ihr versteht mein 
Problem.
Hat jemand eine Idee?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sven B. schrieb:

> Es ist etwas schwer auszudrücken, aber ich hoffe ihr versteht mein
> Problem.

Nicht wirklich.
Woher weiß eigentlich BCD_Ausgabe, was es zu tun hat?


(Ist das ganze ein Multiplex? Wenn ja, wie sieht die Funktion dazu aus? 
Auch scheint mir, dass da ein paar volatile fehlen, aber ohne kompletten 
Code ist das schwer zu sagen)

Autor: Sven B. (v3rtex)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
BCD_Ausgabe regelt nur die ausgebenden Pins
void BCD_Ausgabe(int BCD)    // BCD Werte übergeben
{
  if(BCD == 0)
  {
    BCD1 = 0;               // BCD A p1_0
    BCD2 = 0;               // BCD B p1_1
    BCD3 = 0;               // BCD C p1_2
    BCD4 = 0;               // BCD D p1_3
  }

        .
        .  geht so von 0 bis 9
        .
  
  if(BCD == 9)
  {
    BCD1 = 1;
    BCD2 = 0;
    BCD3 = 0;
    BCD4 = 1;
  }
}


Gemultiplext wird zum jetzigen Zeitpunkt noch nichts.
Ich möchte lediglich, dass die Segmente ersteinmal mit den Variablen 
richtig funktionieren.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aha.
Dann wird das Mulitplexing hierdurch erledigt

while(1)
{
  SEG1_Ausgabe(1);
  SEG2_Ausgabe(2);
  SEG3_Ausgabe(Minute_Zehner);
  SEG4_Ausgabe(Minute_Einer);
}

Da frage ich mich allerdings, warum du erwartest, dass du überhaupt 
etwas passiert. Schliesslich machst du die Ausgabe ja nur dann


  SEG3_neu = Wert3;

  if(SEG3_neu != SEG3_alt)


Wenn sich die Stelle geändert hat.

Lass diese Neu/Alt Optimierung mal weg. Zum momentanen Zeitpunkt bist du 
darauf angewiesen, dass wenn du SEG3_Ausgabe aufrufst, auch tatsächlich 
eine Ausgabe auf das Segment 3 gemacht wird.

Autor: Sven B. (v3rtex)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Wenn ich nun den alt/neu Vergleich weglasse, sieht der komplette Code 
aus wie in der Datei im Anhang.

Erstmal soll sich ja noch nichts ändern, sondern die Segmente sollten 
lediglich die richtigen Werte ausgaben.

Autor: Olaf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mal eine bloeder Frage, aber du hast doch einen
Sourceleveldebugger. Warum geht du nicht einfach mal
mit Singlestep durch dein Program, schaust dir dabei
gleichzeitig den Inhalt deiner Variablen an, und kuckst
ob dein Programm sich so verhaelt wie es das deiner
Meinung nach sollte?

Olaf

Autor: Frank Zöllner (frankovic)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Probier mal einen Cast, also etwa "SEG3_Ausgabe((int) Minute_Zehner);"
Sollte der Compiler zwar von sich aus wissen, aber ich hatte mit dem 
Renesas Compiler schon ne Menge Probleme in dieser Richtung. Was 
passiert denn, wenn man "SEG3_Ausgabe((int) 3);" oder so schreibt?

Das einem "pd_0 = ...;" ein "prc2 = 1;" vorgestellt werden muss, dürfte 
hier nicht das Problem sein denke ich, sonst würde es ja gar nicht 
funktionieren.

Autor: Frank Zöllner (frankovic)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
by the way: Warum muss es eigentlich "int" sein? "unsigned char" oder 
ein anderer 8-bitter würde es sicher auch tun (0...255).

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
btw. eine Quelltext-Datei endet niemals auf .txt

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>> by the way: Warum muss es eigentlich "int" sein? "unsigned char" oder
>> ein anderer 8-bitter würde es sicher auch tun (0...255).

schnell, dann BUS Breite: 16 Bit
sparsam, dann Wertemenge: hier 8 Bit

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.