www.mikrocontroller.net

Forum: Compiler & IDEs Char in Long Variable


Autor: Markus P. (sebastianwurst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich habe vor 6 Char Variablen in eine Long Variable zu packen und zwar 
ganz einfach über addition der Werte. Es handelt sich dabei um die 
Stellen einer Uhr. Wenn es z.B. 12:34:56 ist steht in der Long Variable 
123456. Long Variable wollte ich nehemen da z.B. die Integer Variable 
nur bis 32767 geht.
Meine Frage is überhaupt ob das so einfach möglich ist wie ich mir das 
vorstelle:
Long_Uhrzeit = (rtc.time[0] * 100000) +  (rtc.time[1] * 10000) 
             + (rtc.time[3] * 1000) +  (rtc.time[4]* 100)
       + (rtc.time[6] * 10) +  (rtc.time[7] * 1);
Da das irgendwie nicht funktioniert. Das ganze beruht auf die rtc.h.

Hintergrund: Ich will die Istuhrzeit mit einer Solluhrzeit vergleichen. 
(z.B. Long_Uhrzeit <= Long_Soll_Uhrzeit ... )
// **************************************************************
// *******  RTC_ROUTINES HEADER FILE ********     
// **************************************************************
#define  DS1307_W      0xd0
#define  DS1307_R      0xd1

#define RTC_NO_ERROR  0
#define RTC_ERROR    1


typedef struct
{
  unsigned char time[9];
  unsigned char date[12];
  unsigned char day;
  unsigned char rtc_register[7];


} RTC_DATE_TIME;


unsigned char rtc_read(RTC_DATE_TIME *r);
unsigned char rtc_write(RTC_DATE_TIME *r);

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was genau steht in rtc.time[0] bis rtc.time[7] ?

Was genau funktioniert nicht?

Evtl. muß man die Rechnung in long erzwingen mit einem cast oder 
passenden Konstanten (10000ul bspw.).

Autor: Rolf Magnus (rmagnus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kann es sein, daß deine RTC dir die Zeit als String zurückgibt? Oder 
warum überspringst du sonst nach zwei Elementen immer eins?
In dem Fall kannst du das Zeichen natürlich nicht einfach als Integer 
intepretieren. Mach mal bei jedem rtc.time[x] in deiner Berechnung oben 
ein (rtc.time[x] - '\0').

Übrigens: Das ist zumindest auf kleinen µC ziemlich aufwendig. Wenn du 
das nur für den Vergleich machst, könnte man es deutlich effizienter 
machen.

Autor: Markus P. (sebastianwurst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi wenn Du z.B.  (rtc.time[2]) meisnt, das ist der Doppelpunkt. Die 
Variablen stehen in Char da. Wie würdest Du denn die Variablen 
vergleichen. Ich muss noch dazu sagen das ich 20 Uhrzeiten habe, die ich 
mit der "Long_Uhrzeit" vergleichen will. Welche die erste Uhrzeit ist, 
die kleiner als die Long_Uhrzeit ist soll angezeigt werden.

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Na wenn das ein String ist und die höchsten Stellen vorne stehen,
dann nimm doch einfach strcmp() zum Vergleichen!
(Oder memcmp(), wenn der String nicht nullterminiert ist.)

Autor: Markus P. (sebastianwurst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Klaus deine Nachricht hatte ich erst übersehen.

In rtc.time[0] steht die Zehnerstelle der Stunden
rtc.time[1] Einerstelle der Stunden
rtc.time[2] Doppelpunkt
rtc.time[3] Zs der Minuten
rtc.time[4] Es der Minuten
rtc.time[5] Doppelpunkt
rtc.time[6] Zs der Sekunden
rtc.time[7] Es der Minuten

Alles als char datei
Im ganzen wollte ich das so machen:

Long_Uhrzeit =   (rtc.time[0] * 100000) +  (rtc.time[1] * 10000) 
               + (rtc.time[3] * 1000) +  (rtc.time[4]* 100)
               + (rtc.time[6] * 10) +  (rtc.time[7] * 1);


for (g = 20; g >= 0; g--)
 { 


Long_Soll_Uhrzeiten     = (StundenFuetterung[g] * 10000)
                        + (MinutenFuetterung[g] * 100)
                        + (SekundenFuetterung[g] );

 if (Long_Uhrzeit < Long_Soll_Uhrzeiten )
    Naechste_UhrzeitNr = g;    

   }


StundenFuetterung[g] = 12
MinutenFuetterung[g] = 34
SekundenFuetterung[g] = 56
______________________________
Ergibt dann         : 123456

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
1. Im Prinzip sollte es gehen, aber wie gesagt musst du dafür sorgen, 
daß die Zwischenergebnisse ggf. schon unsigned long werden.
2. Es ist eine sinnlose Rechnerei, wie gesagt geht es mit strcmp() 
schneller und einfacher
3. Deine Schleife hat 21 Durchläufe

Autor: Markus P. (sebastianwurst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke, ich mach das mit dem strcmp-Befehl . Wenn ich das richtig 
verstehe muss das für char's ja auch gehen.

PS.: Noch eine Frage, wie sorge ich denn dafür das die 
Zwischenergebnisse unsigned_long werden ?

Autor: Rolf Magnus (rmagnus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sebastian K. schrieb:
> Danke, ich mach das mit dem strcmp-Befehl . Wenn ich das richtig
> verstehe muss das für char's ja auch gehen.

Was heißt 'auch'? Es ist dafür gemacht. Allerdings muß das Array für 
strcmp nullterminiert sein. Wenn die Länge eh fix ist, würde sich aber 
memcmp eher anbieten.

> PS.: Noch eine Frage, wie sorge ich denn dafür das die
> Zwischenergebnisse unsigned_long werden ?

Indem du dafür sorgst, daß die Eingangsdaten unsigned long sind. Du 
kannst bei den Konstanten statt z.B. 1000 einfach 1000UL schreiben, also 
überall ein UL dranhängen.

Sebastian K. schrieb:
> Die Variablen stehen in Char da.

char ist zunächst mal nix weiter als ein kleiner Integer-Typ. Wichtig 
ist, in welcher Form die Daten da drin stehen. Einfach als Integer-Wert 
oder als Text. Deine Aussagen ist zu entnehmen, daß es sich um Text 
handelt. Dann solltest du bei Verwendung deiner bisherigen Methode 
tatsächlich das da beherzigen:

Rolf Magnus schrieb:
> Mach mal bei jedem rtc.time[x] in deiner Berechnung oben
> ein (rtc.time[x] - '\0').

aber ein memcmp wäre tatsächlich einfacher und auch deutlich schneller.

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Rolf Magnus schrieb:
> rtc.time[x] - '\0'

Was soll das bringen?
Du meintest wohl eher rtc.time[x] - '0'

Autor: Rolf Magnus (rmagnus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du hast natürlich recht. Es muß '0' sein, nicht '\0'.
Mea culpa.

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.