Forum: Mikrocontroller und Digitale Elektronik AVR Dezimalzahlen in Binärzahlen umrechnen


von Luis F. (luis93)


Lesenswert?

Hallo,

ich habe eine Nixie Uhr mit vier Ziffern, angesteuert von MPSA42 
Transistoren mit CD4028 BCD zu Dezimal Decodern gebaut. Die Zeit wird 
von einem Arduino Mega vorgegeben.

Zu meiner Frage: Wie programmiere ich in der Arduino IDE die umrechnung 
von Dezimalzahlen in Binärcode (den ich dann in die CD4028 füttern 
kann)? Geteilt durch 2 mit Rest geht ja nicht, da ich nicht mit Rest 
rechnen/programmieren kann.

LG :)

von Theor (Gast)


Lesenswert?

Luis F. schrieb:
> Hallo,
>
> ich habe eine Nixie Uhr mit vier Ziffern, angesteuert von MPSA42
> Transistoren mit CD4028 BCD zu Dezimal Decodern gebaut. Die Zeit wird
> von einem Arduino Mega vorgegeben.
>
> Zu meiner Frage: Wie programmiere ich in der Arduino IDE die umrechnung
> von Dezimalzahlen in Binärcode (den ich dann in die CD4028 füttern
> kann)?

Genauer gesagt, musst Du eine binär codierte Ganzzahl (integer) in eine 
binär codierte Dezimalzahl (BCD) umrechnen. Ist Dir klar, wie jeweils 
ein Integer und ein BCD kodiert ist? Es scheint mir so zu sein, da Du 
nachfolgend ganz richtig eine Modulo-Division erwähnst.

> Geteilt durch 2 mit Rest geht ja nicht, da ich nicht mit Rest
> rechnen/programmieren kann.

Den Satz kann ich nicht recht deuten. Bedeutet er, dass Du das mangels 
Kenntnis der Wirkung einer Modulo-Division nicht kannst oder dass Du 
davon ausgehst, das es kein Sprachmittel, keinen Operator gibt, mit dem 
das möglich ist?

Letzteres trifft nicht zu, soweit ich weiß. Siehe hier: 
https://www.arduino.cc/en/Reference/Modulo

von Luis F. (luis93)


Lesenswert?

Danke für deine Antwort Theor!

Theor schrieb:
> Ist Dir klar, wie jeweils
> ein Integer und ein BCD kodiert ist?

Was ein Integer ist, weiß icht nicht. Wie BCD kodiert ist, und was das 
ist weiß ich. Allerdings bin ich quasi noch Anfänger beim Programmieren.

Theor schrieb:
>> Geteilt durch 2 mit Rest geht ja nicht, da ich nicht mit Rest
>> rechnen/programmieren kann.
>
> Den Satz kann ich nicht recht deuten.

Damit meine ich, die Art Dezimal in Binär umzurechnen, wie sie mir in 
der Schule im IT Unterricht beigebracht wurde.
Dezimal: 5 : 2 = 2 Rest 1
         2 : 2 = 1 Rest 0
         1 : 2 = 0 Rest 1
Binär  : 101 (Den Rest von oben nach unten gelesen)

Von einer Modulo-Division wusste ich bis jetzt noch nichts, aber diese 
ist ja auch nicht fähig einen Rest auszuspucken, richtig? Oder verstehe 
ich da etwas falsch?

Ich brauche ein Stück Code, dem ich eine Zweistellige Zahl zur verfügung 
stelle, und der mir dann die entsprechenden (vorher definierten) Pins am 
Arduino High setzt.

von Carl D. (jcw2)


Lesenswert?


von Andreas R. (daybyter)


Lesenswert?

Modulo ist genau der Rest-Operator, den Du suchst.

int a,b;

a = 5 / 2;  // a ist 2.
b = 5 % 2;  // b ist 1.

von Theor (Gast)


Lesenswert?

Luis F. schrieb:
> Danke für deine Antwort Theor!

Bitteschön. Gerne.

> Was ein Integer ist, weiß icht nicht. Wie BCD kodiert ist, und was das
> ist weiß ich. Allerdings bin ich quasi noch Anfänger beim Programmieren.
OK. Kein Problem.

> Theor schrieb:
>>> Geteilt durch 2 mit Rest geht ja nicht, da ich nicht mit Rest
>>> rechnen/programmieren kann.
>>
>> Den Satz kann ich nicht recht deuten.
>
> Damit meine ich, die Art Dezimal in Binär umzurechnen, ...

Hm. Ich habe erklärt, was mir an dem Satz unklar war. Es ging nicht um 
das Objekt sondern um das Subjekt - nämlich, dass Du etwas nicht kannst 
und ob "Können" hier die Fähigkeit etwas Bekanntes anzuwenden oder das 
Unbekannt-Sein betraf. Aber gut. Das wird aufgrund des Folgenden klar.

> Von einer Modulo-Division wusste ich bis jetzt noch nichts, aber diese
> ist ja auch nicht fähig einen Rest auszuspucken, richtig? Oder verstehe
> ich da etwas falsch?

Naja. Dummerweise habe ich mich da eher 
"Programmierer-Umgangssprachlich" ausgedrückt.
Allerdings hat der nachfolgende Link, die Sache eigentlich eindeutig 
gemacht: https://www.arduino.cc/en/Reference/Modulo
Dort ist genau erklärt, was der Modulo-Operator tut.

Reicht das für Dich so?

von Wolfgang (Gast)


Lesenswert?

Luis F. schrieb:
> Von einer Modulo-Division wusste ich bis jetzt noch nichts, aber diese
> ist ja auch nicht fähig einen Rest auszuspucken, richtig?

Es gibt in C auch kein Modulo-Division, da hast du recht.

Aber es gibt eine Divisions-Operation für Ganzzahlen und eine 
Modulo-Operation.

Du kannst aber die Division ausführen und dann das mit 10 multipliziert 
Ergebnis von der Originalzahl abziehen.

Oder wenn es um die Umwandlung von einem Byte in 2 BCD-Nibble geht, 
kannst du auch in einer kleinen Schleife durch Subtraktion und Mitzählen 
umwandeln, bist der Wert kleiner als 10 ist.

Beispiel: Enthalte dein Bye die Dezimalzahl 35 (0x23). Dann kannst du 
drei mal 10 (0x0A) abziehen, bis du bei einer Zahl kleiner 10, nämlich 5 
landest. Die Anzahl der Subtraktionen (3) wird dein High-Nibble und der 
Rest (5) dein Low-Nibble für die Ausgabe.

von Luis F. (luis93)


Lesenswert?

Carl D. schrieb:
> https://en.m.wikipedia.org/wiki/Double_dabble

Danke, interessanter Artikel, ist aber ganz schön Komplex. Die Arduino 
IDE Sprache ist doch vereinfachtes C, also kann ich ja mal versuchen das 
Beispiel zu übersetzen.

Andreas R. schrieb:
> Modulo ist genau der Rest-Operator, den Du suchst.
>
> int a,b;
>
> a = 5 / 2;  // a ist 2.
> b = 5 % 2;  // b ist 1.

Stimmt, es war wohl schon zu spät gestern :) . Ich hatte Modulo so 
verstanden, das es eine normale geteilt Operation ist, die einfach den 
Rest vernachlässigt und nur ganze Zahlen ausspuckt. Ist aber natürlich 
quatsch.
Danke für das Beispiel.

Theor schrieb:
> Naja. Dummerweise habe ich mich da eher
> "Programmierer-Umgangssprachlich" ausgedrückt.
> Allerdings hat der nachfolgende Link, die Sache eigentlich eindeutig
> gemacht: https://www.arduino.cc/en/Reference/Modulo
> Dort ist genau erklärt, was der Modulo-Operator tut.

Ja, habe ich jetzt, wie oben beschrieben, verstanden. Modulo ist genau 
das was ich gesucht habe.

Wolfgang schrieb:
> Enthalte dein Bye die Dezimalzahl 35 (0x23). Dann kannst du
> drei mal 10 (0x0A) abziehen, bis du bei einer Zahl kleiner 10, nämlich 5
> landest. Die Anzahl der Subtraktionen (3) wird dein High-Nibble und der
> Rest (5) dein Low-Nibble für die Ausgabe.

Danke Wolfgang, ich werde dein Beispiel auch mal Ausprobieren.


Ansonsten:
 int a,b;

 a = 5 / 2;  // a ist 2.  ->Quotient (ganze Zahl)
 b = 5 % 2;  // b ist 1.  ->Rest

von W.S. (Gast)


Lesenswert?

Luis F. schrieb:
> Wie programmiere ich in der Arduino IDE die umrechnung
> von Dezimalzahlen in Binärcode (den ich dann in die CD4028 füttern
> kann)?

Überhaupt nicht. Wo hast du denn deine Dezimalzahlen her? Du hast doch 
wohl gar keine. Stattdessen hast du vermutlich ne Integer-Zahl von 0 
bis 9999 und willst selbige in einzelne Ziffern umcodieren.
Also von
int Zeit;
nach
char Ausgabe[4];// BCD, also nur Bits 0..3 in Benutzung

Richtig geraten?

Jetzt belies dich mal über arithmetische Rechenoperationen mit 
Integerzahlen. Insbesondere über die Division. Was passiert also, wenn 
du deine Zahl durch 10 teilst? Ja, du kriegst 1/10 der Zahl dabei heraus 
- und zugleich auch noch den Rest. Der entspricht deiner hintersten 
Stelle. Wenn du nun das Ergebnis wiederum duch 10 teilst, kriegst du 
wiederum 1/10 davon raus und schon wieder einen Rest, der deiner 
vorletzten Stelle entspricht. Und so weiter. Klaro?

beim ARM geht das etwa so:

#include <math.h>
ldiv_t T;
long L;

T = ldiv(L,10);
ziffer = T.rem;
L = T.quot;

aber ob das auch bei deiner HW geht, mußt du selber herausfinden.

W.S.

von Luis F. (luis93)


Lesenswert?

W.S. schrieb:
> Luis F. schrieb:
>> Wie programmiere ich in der Arduino IDE die umrechnung
>> von Dezimalzahlen in Binärcode (den ich dann in die CD4028 füttern
>> kann)?
>
> Überhaupt nicht. Wo hast du denn deine Dezimalzahlen her? Du hast doch
> wohl gar keine. Stattdessen hast du vermutlich ne Integer-Zahl von 0
> bis 9999 und willst selbige in einzelne Ziffern umcodieren.
> Also von
> int Zeit;
> nach
> char Ausgabe[4];// BCD, also nur Bits 0..3 in Benutzung
>
> Richtig geraten?

Ich habe eine Schaltung, die mithilfe von einem Quarz ein Signal mit 
genau 1Hz erzeugt. Dieses wird vom Arduino gezählt (drei Variablen, 
Sekunden, Minuten, Stunden) Das ist mir Dezimalzahlen gemeint, daher 
habe ich diese.
Beispiel: Stunden=24
Nach jedem Impuls des 1Hz Signals, wird zuerst die Zeit weiter gezählt, 
und danach soll Anhand der Variablen (Stunde, Minute) Pins auf High 
gezogen werden.

Gegeben (beispiel): Sekunden=53 ; Minuten=39 ; Stunden=12

             Stunde              :              Minute

BCD Tabelle:
[A] [B] [C] [D]  [A] [B] [C] [D] : [A] [B] [C] [D]  [A] [B] [C] [D]
 1   2   4   8    1   2   4   8     1   2   4   8    1   2   4   8

Pin Level (dass muss herausgefunden werden):
 1   0   0   0    0   1   0   0     1   1   0   0    1   0   0   1

Anzeige:
       1                2        :         3                9

Den Rest deines Posts verstehe ich nicht, bin wie gesagt noch Anfänger. 
Hätte nicht gedacht das dass so kompliziert ist. Danke für deinen 
Beitrag.

von W.S. (Gast)


Lesenswert?

Luis F. schrieb:
> Das ist mir Dezimalzahlen gemeint, daher
> habe ich diese.

Aha - und wie denn nun genau zählt dieser Arduino diese Pulse?
Macht er das mit Gleitkomma oder womit denn sonst? Nen Abakus hat er ja 
wohl nicht zur Hand.

Ich frag dich ja schon garnicht, warum der besagte Arduino überhaupr 
diese ominöse Schaltung braucht, wo deine 1 Hz Impulse herauskommen, 
denn normalerweise kann eigentlich jeder Mikrocontroller sich intern 
sowas aus dem eigenen Takt herleiten.

Und es ist überhaupt nicht kompliziert, aber so ganz ohne jegliche 
eigene Einarbeitung geht es nicht. Das Fahrradfahren hast du ja auch 
erstmal lernen müssen und bist anfangs möglicherweise erstmal in die 
nächste Hecke gerammelt. Und jetzt geht es intuitiv. So ist das auch mit 
unseren Themen hier.

W.S.

von W.S. (Gast)


Lesenswert?

äh.. nochwas: "mithilfe eines Quarzes"

oder der Dativ ist dem Genitiv sein Tod...

von Thomas E. (picalic)


Lesenswert?

Luis F. schrieb:
> Dieses wird vom Arduino gezählt (drei Variablen,
> Sekunden, Minuten, Stunden)

Vorschlag: mach das doch einfach mit 6 Variablen, also je eine für jede 
Dezimalstelle, dann brauchst Du gar nichts mehr zu konvertieren.

von Luis F. (luis93)


Lesenswert?

W.S. schrieb:
> Aha - und wie denn nun genau zählt dieser Arduino diese Pulse?
> Macht er das mit Gleitkomma oder womit denn sonst? Nen Abakus hat er ja
> wohl nicht zur Hand.

Der 1Hz Pin ist als Interrupt definiert. Wenn das Signal dort High geht, 
wir die Sekunden Variabel hoch gezählt.

Damit das genauer ist. Der Arduino Standartquarz ist extrem ungenau. Ist 
glaub ich auch gar kein Quarz sondern irgendwas anderes, billigeres.

W.S. schrieb:
> Und es ist überhaupt nicht kompliziert, aber so ganz ohne jegliche
> eigene Einarbeitung geht es nicht. Das Fahrradfahren hast du ja auch
> erstmal lernen müssen und bist anfangs möglicherweise erstmal in die
> nächste Hecke gerammelt. Und jetzt geht es intuitiv. So ist das auch mit
> unseren Themen hier.

Naja, ich dachte es gibt einen einfachen Befehl um Dezimalzahlen in 
Binär umzuwandeln. Comupter (Mikrocontroller) arbeiten ja mit dem 
Binärsystem? Sagt man ja so. Da dachte ich es gibt einen einfachen 
Befehl.

Thomas E. schrieb:
> Vorschlag: mach das doch einfach mit 6 Variablen, also je eine für jede
> Dezimalstelle, dann brauchst Du gar nichts mehr zu konvertieren.

Danke für den Vorschlag, ich zähle die Zeit einfach gleich in BCD. Isr 
wahrscheinlich einfacher so, und ein Schritt fällt weg.

von Theor (Gast)


Lesenswert?

Luis F. schrieb:

> Naja, ich dachte es gibt einen einfachen Befehl um Dezimalzahlen in
> Binär umzuwandeln.

Du bist eigentlich mit der Division mit Rest so nahe an der Lösung, dass 
es sich lohnt einen kleinen Schritt weiter zu gehen. Das Prinzip ist 
fast das selbe, wie bei der Umrechnung von Zahlen aus einer Basis in 
eine andere Basis. Es geht darum eine Zahl in "kleinere Teile" zu 
teilen.

Nimm folgendes:
            Wie Basis-Umrechng.     %-Operator
0           : 10 = 0 Rest 0         % 10 = 0
2           : 10 = 0 Rest 2         % 10 = 2
5           : 10 = 0 Rest 5         % 10 = 5
10          : 10 = 1 Rest 0         % 10 = 0
12          : 10 = 1 Rest 2         % 10 = 2
15          : 10 = 1 Rest 5         % 10 = 5
20          : 10 = 2 Rest 0         % 10 = 0
22          : 10 = 2 Rest 2         % 10 = 2
25          : 10 = 2 Rest 5         % 10 = 5

von batman (Gast)


Lesenswert?

Luis F. schrieb:
> Der 1Hz Pin ist als Interrupt definiert. Wenn das Signal dort High geht,
> wir die Sekunden Variabel hoch gezählt.

Im Dezimalsystem?

von Wolfgang (Gast)


Lesenswert?

Luis F. schrieb:
> Damit das genauer ist. Der Arduino Standartquarz ist extrem ungenau. Ist
> glaub ich auch gar kein Quarz sondern irgendwas anderes, billigeres.

Die Sache mit der Genauigkeit kann man lernen. Beim Quarz kommt es nur 
drauf an, dass er stabil ist.
Beitrag "Die genaue Sekunde / RTC"

p.s. Was das allerdings mit Stand-Kunst Quarzen zu tun hat, ist mir 
schleierhaft.

von batman (Gast)


Lesenswert?

Er meint vmtl. Arduino mit Resonator oder RC, die gehen nach der 
Temperatur.

von Luis F. (luis93)


Lesenswert?

Theor schrieb:
> Du bist eigentlich mit der Division mit Rest so nahe an der Lösung, dass
> es sich lohnt einen kleinen Schritt weiter zu gehen. Das Prinzip ist
> fast das selbe, wie bei der Umrechnung von Zahlen aus einer Basis in
> eine andere Basis. Es geht darum eine Zahl in "kleinere Teile" zu
> teilen.

Ich werde aus deinem Beitrag nicht schlau. Wie Modulo funktioniert weiß 
ich mittlerweile. Warum verwendest du bei jedem beispiel :10 (bzw. %10)?

batman schrieb:
> Im Dezimalsystem?

Ja. Ich überlege gerade ob es einfacher ist, direkt in BCD zu zählen.

Wolfgang schrieb:
> Die Sache mit der Genauigkeit kann man lernen. Beim Quarz kommt es nur
> drauf an, dass er stabil ist.
> Beitrag "Die genaue Sekunde / RTC"

Der Quarz im Arduino ist nur so ein kleines Ding, was meines Wissens 
nach nicht genau genug für eine Uhr ist. Außerdem ist die Arduino IDE 
noch ein Problem, da da soviel im Hintergrund läuft kann man schlecht 
eine Uhr programmieren (Habe ich zumindest gelesen). Der Arduino hat ca. 
5000ppm abweichung (Ist das viel?).

Eine andere Idee wäre, einen BCD Zähler zu verwenden ( CD4520 habe ich 
noch hier liegen). So spare ich Pins am uC und ich muss die Umrechnung 
in BCD nicht machen. Ein Nachteil davon ist, das man beim Zahlen 
wechseln die Ziffern durchlaufen sehen kann.

von Wolfgang (Gast)


Lesenswert?

Luis F. schrieb:
> Außerdem ist die Arduino IDE noch ein Problem, da da soviel
> im Hintergrund läuft kann man schlecht eine Uhr programmieren
> (Habe ich zumindest gelesen).

Das ist Unfug. Eine Uhr würde man nie so programmieren, dass sie davon 
abhängig ist. Das überläßt man einem Timer.

> Der Arduino hat ca. 5000ppm abweichung (Ist das viel?).
Für eine Uhr ist das egal. Bei einem Uhrpendel ist die größe des Baumes, 
aus dem das Pendel geschnitzt wird, auch ziemlich unkritisch.

Solange die Abweichung (wovon eigentlich) konstant ist, kümmert man sich 
einfach nicht um den Wert, sondern rechnet mit dem tatsächlichen Wert.

Und wieviel 5000ppm ist, hängt absolut betrachtet von der Frequenz ab.
https://de.wikipedia.org/wiki/Parts_per_million

von eProfi (Gast)


Lesenswert?

> Vorschlag: mach das doch einfach mit 6 Variablen, also je eine für
> jede Dezimalstelle, dann brauchst Du gar nichts mehr zu konvertieren.

uint8_t s0,s1,m0,m1,h0,h1;
if(++s0>9){s0=0;
  if(++s1>5){s1=0;
    if(++m0>9){m0=0;
      if(++m1>5){m1=0;
        if(++h0>9){h0=0;h1++;}else
        if(h0==4 && h1==2)h0=h1=0;
      }}}}


> Der 1Hz Pin ist als Interrupt definiert.
> Wenn das Signal dort High geht, wir die Sekunden Variabel hoch gezählt.

> Damit das genauer ist. Der Arduino Standartquarz ist extrem ungenau.
> Ist glaub ich auch gar kein Quarz sondern irgendwas anderes, billigeres.

wir -->wird  Standart ("Stand-Kunst") --> Standard
Sekunden Variabel --> Sekunden-Variable

Statt des externen Interrupts kannst Du auch einen Timer den Interrupt 
generieren lassen. Alle Arduinos, die ich bisher zu Gesicht bekam, 
hatten einen Quarz. Nur kann man nicht davon ausgehen, dass die mit 
exakt der aufgedruckten Frequenz schwingen. Man muss also wie bei jeder 
Uhr abgleichen, indem man die Teilfaktor anpasst, wie in "die genaue 
Sekunde" beschrieben.
Da der häufig verwendete Atmega328 einen Temperatursensor eingebaut hat, 
kann man diesen zum Kompensieren des Frequenzganges mit einbeziehen.

von Thomas E. (picalic)


Lesenswert?

eProfi schrieb:
> uint8_t s0,s1,m0,m1,h0,h1;
> if(++s0>9){s0=0;
>   if(++s1>5){s1=0;
>     if(++m0>9){m0=0;
>       if(++m1>5){m1=0;
>         if(++h0>9){h0=0;h1++;}else
>         if(h0==4 && h1==2)h0=h1=0;
>       }}}}

Quelltext wird nicht nach Zeilenzahl in Rechnung gestellt - ich fänd's 
so etwas übersichtlicher:
1
 uint8_t s0,s1,m0,m1,h0,h1;
2
 if(++s0>9)
3
 {
4
   s0=0;
5
   if(++s1>5)
6
   {
7
     s1=0;
8
     if(++m0>9)
9
     {
10
       m0=0;
11
       if(++m1>5)
12
       {
13
         m1=0;
14
         if(++h0>9)
15
         {
16
           h0=0;
17
           h1++;
18
         }
19
         else
20
         {
21
           if(h0==4 && h1==2)
22
             h0=h1=0;
23
         }
24
       }
25
     }
26
   }
27
 }

von Luis F. (luis93)


Lesenswert?

Wolfgang schrieb:
> Das überläßt man einem Timer.

Verstehe, leider habe ich keine Ahnung wie man Timer benutzt. Das ist 
erst mein zweites Projekt mit Mikrocontrollern, und die 1Hz Schaltung 
habe ich eingebaut, weil ich das so für mich einfacher Programmieren 
kann. Danke für den Hinweis zu ppm, hab ich jetzt verstanden :) .

eProfi, Thomas Elger: Danke für den Code. Dieser zählt ja ganz normal im 
Zehnersystem, oder verstehe ich da etwas falsch? Welchen Vorteil bringt 
mir diese Art die Sekunden zu zählen?
Danke für eure Hilfe!

von Thomas E. (picalic)


Lesenswert?

Luis F. schrieb:
> Welchen Vorteil bringt
> mir diese Art die Sekunden zu zählen?

Dachte, das wäre eh klar? Damit brauchst Du nix umzurechnen, die 
einzelnen Digits kannst Du direkt an Deinen Pins an die Nixie-Dekoder 
ausgeben.
Dafür ist die Zählroutine halt ein wenig größer.
Eine Alternative wäre evtl. noch eine "incBCD()"-Funktion, die eine 
8-Bit Zahl als zwei BCD-Digits verarbeitet:
1
uint8_t sekunden, minuten, stunden;
2
3
uint8_t incBCD(uint8_t zahl)
4
{
5
  ++zahl;
6
  if((zahl & 0x0F) > 9)
7
    zahl += 6;
8
}
9
10
void incZeit (void)
11
{
12
  sekunden = incBCD(sekunden);
13
  if(sekunden > 0x59)
14
  {
15
    sekunden = 0;
16
    minuten = incBCD(minuten);
17
    if(minuten > 0x59)
18
    {
19
      minuten = 0;
20
      stunden = incBCD(stunden);
21
      if(stunden > 0x23)
22
        stunden = 0;
23
    }
24
  }
25
}

: Bearbeitet durch User
von Luis F. (luis93)


Lesenswert?

Wenn ich den Code ausprobiere sehe ich im Seriellen Monitor nur Nullen. 
Durch das ++S0 in " if(++s0>9)" sollte doch aber aufwärts gezählt 
werden? Irgendwas mache ich falsch. Hier mein Test-Code:

void setup() {
  Serial.begin(9600);
}

void loop() {

delay(1000);

 uint8_t s0,s1,m0,m1,h0,h1;
 if(++s0>9)
 {
   s0=0;
   if(++s1>5)
   {
     s1=0;
     if(++m0>9)
     {
       m0=0;
       if(++m1>5)
       {
         m1=0;
         if(++h0>9)
         {
           h0=0;
           h1++;
         }
         else
         {
           if(h0==4 && h1==2)
             h0=h1=0;
         }
       }
     }
   }
 }
  Serial.print(s0);
  Serial.print(" / ");
}

von eProfi (Gast)


Lesenswert?

Du musst die Variablen global (ganz am Anfang schreiben) oder static 
machen.

von Luis F. (luis93)


Lesenswert?

Wenn ich sie ganz am Anfang im im Setup definiere bekomme ich die 
Fehlermeldung " 's0' was not declared in this scope "

von eProfi (Gast)


Lesenswert?

noch vor dem Setup,
oder schreibe im Loop
static uint8_t s0....

von eProfi (Gast)


Lesenswert?

Nachteil, wenn man sie static macht:
man muss sie explizit auf Null setzen.

static uint8_t s0=0,s1=0,m0=0,m1=0,h0=0,h1=0;

von Carl D. (jcw2)


Lesenswert?

eProfi schrieb:
> Nachteil, wenn man sie static macht:
> man muss sie explizit auf Null setzen.
>
> static uint8_t s0=0,s1=0,m0=0,m1=0,h0=0,h1=0;

Das kann die Laufzeitumgebung selbst.
Alle nicht expliziet initialisierten global oder static definierten 
Variablen, werden Enfachst Reset mit 0 initialisiert.

von Luis F. (luis93)


Lesenswert?

Danke für den Beispiel Code, jetzt funktioniert er bei mir auch.

Thomas E. schrieb:
> Eine Alternative wäre evtl. noch eine "incBCD()"-Funktion, die eine
> 8-Bit Zahl als zwei BCD-Digits verarbeitet:

Die "incBCD()"-Funktion scheint in der Arduino IDE nicht zu 
funktionieren bzw. zu existieren. Wenn ich versuche das Sketch 
hochzuladen, gibt es einen Fehler beim Kompilieren.

von Thomas E. (picalic)


Lesenswert?

Luis F. schrieb:
> Die "incBCD()"-Funktion scheint in der Arduino IDE nicht zu
> funktionieren bzw. zu existieren. Wenn ich versuche das Sketch
> hochzuladen, gibt es einen Fehler beim Kompilieren.

Wundert mich micht, daß die Funktion in der Arduino-IDE nicht existiert 
- der Dreizeiler ist meine Spontan-"Erfindung". Ansonsten kann ich Dir 
bei Arduino und deren "Witzen" (sorry, ich denke bei dem Wort "Sketch" 
halt immer eher an Dieter Hallervorden, als an irgendwas im Zusammenhang 
mit Mikrocontrollern) leider nicht weiterhelfen - da habe ich keine 
Ahnung von. Aber vielleicht könnte man auch ohne Arduino-Kenntnisse 
weiterhelfen, wenn man den Wortlaut der Fehlermeldung kennen würde?

Edit: Ah, ich sehe schon - sorry, mein Fehler, habe die 4. Zeile 
vergessen, die da lauten muss:
1
  return zahl;

: Bearbeitet durch User
von Luis F. (luis93)


Lesenswert?

Thomas E. schrieb:
> Wundert mich micht, daß die Funktion in der Arduino-IDE nicht existiert
> - der Dreizeiler ist meine Spontan-"Erfindung". Ansonsten kann ich Dir
> bei Arduino und deren "Witzen" (sorry, ich denke bei dem Wort "Sketch"
> halt immer eher an Dieter Hallervorden, als an irgendwas im Zusammenhang
> mit Mikrocontrollern) leider nicht weiterhelfen - da habe ich keine
> Ahnung von. Aber vielleicht könnte man auch ohne Arduino-Kenntnisse
> weiterhelfen, wenn man den Wortlaut der Fehlermeldung kennen würde?

Ja, die Arduino-IDE ist recht eichfach gehalten, vieles fehlt da 
anscheinend einfach. Die Fehlermeldung lautet:
undefined reference to `incBCD(unsigned char)'
collect2.exe: error: ld returned 1 exit status
exit status 1
Fehler beim Kompilieren für das Board Arduino/Genuino Uno.

Aber mit dem ersten Code Beispiel haben eProfi und du mir schon sehr 
weitergeholfen. Damit, und mit der Modulo-Operation komme ich schon 
weiter.
Vielen Dank für eure Hilfe!

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.