Forum: Mikrocontroller und Digitale Elektronik Uhrzeit in einem Register in 10 Minuten Schritten - Assembler


von Bernhard S. (bernhard)


Angehängte Dateien:

Lesenswert?

Die Uhrzeit ist in einem Register codiert.

Bsp:

0 = 00:00
1 = 00:10
2 = 00:20
3 = 00:30
4 = 00:40
5 = 00:50
6 = 01:00
7 = 01:10
..
..


Frage: Wie kann man die Uhrzeit wieder decodieren?

Bsp: 112 --> 18:40


Mit einer hinterlegten Tabelle ist es kein Problem... geht schnell, 
braucht aber viel Platz.


Bernhard

von Stefan F. (Gast)


Lesenswert?

minuten = wert * 10
stunden = minuten / 60
minuten = minuten % 60

Oder:

stunden = wert / 6
minuten = (wert % 6) * 10

von (prx) A. K. (prx)


Lesenswert?

Und wer nicht multiplizieren oder dividieren will oder kann, der 
erinnert sich an Zeiten, in denen er das selbst auch noch nicht konnte, 
und zählt mit den Fingern. Addiert also so lange 10 unter 
Berücksichtigung des 60-er Überlaufs, bis der Intervallzähler durch ist. 
Das braucht sehr wenig Platz, dafür etwas Zeit.

: Bearbeitet durch User
von Michael U. (amiga)


Lesenswert?

Hallo,

Wert ist in 10 Minuten-Schritten, also
Wert / 6 (als Ganzzahl) ergibt Stunden
Wert - (Stunden * 6) -> Minuten

Wo ist das Problem? ;-)

PS:  Stefan Us war schneller...

Gruß aus Berlin
Michael

: Bearbeitet durch User
von Bernhard S. (bernhard)


Lesenswert?

@Stefan Us

Kannst Du es mir bitte bei dem Registerinhalt von 112 mal vorrechnen.


@ A. K.

>....aber Geduld hat...

Ja, das wäre eine Alternative

von Sebastian S. (amateur)


Lesenswert?

Ich bin mir nicht ganz sicher, was Du denn speicherst.
Bei:
0     0:00
1     0:10
2     0:20
3     0:30
4     0:40
5     0:50
6     1:00
7     1:10
könnten ein
DIV 6 -> Std
und
MOD 6 -> Min (*10)
helfen

Also 7 DIV 6 = 1
     7 MOD 6 = 1 (*10) = 10

oder so

von Dieter W. (dds5)


Lesenswert?

Naja, 112 / 6 = 18 Rest 4 und die 4 mal 10 gibt 40 Minuten.

von S. Landolt (Gast)


Lesenswert?

Die Quelle scheint ja eine Binärzahl zu sein, aber das Ziel? Zwei Binär- 
oder zwei BCD-Zahlen, oder ein fünfstelliger String?

von HildeK (Gast)



Lesenswert?

Bernhard S. schrieb:
> Kannst Du es mir bitte bei dem Registerinhalt von 112 mal vorrechne

Kann ich auch :-)

von Bernhard S. (bernhard)


Lesenswert?

> Naja, 112 / 6 = 18 Rest 4 und die 4 mal 10 gibt 40 Minuten.

In Assembler ist 112 / 6 nicht ganz einfach

von S. Landolt (Gast)


Lesenswert?

> In Assembler ist 112 / 6 nicht ganz einfach

In Anlehnung an A.K.s Beitrag: solange 6 von 112 abziehen, bis ein Carry 
auftritt. Ganz einfach, und die benötigte Zeit ist sicher auch 
tolerierbar.

von Sebastian S. (amateur)


Lesenswert?

@Bernhard
Basisoperationen sollten eigentlich Pipifax sein. Auch wenn sie nicht 
als Einzelbefehl "eingebaut" sind.

Da Du aber ein Geheimnis um den verwendeten Prozessor machst, ist 
konkrete Hilfe nicht möglich. Jeder Chip bzw. jede Serie und vor allem 
jeder Hersteller kocht da sein eigenes Süppchen.

Also: Assembler als Sprache gibt es eigentlich gar nicht.

von Bernhard S. (bernhard)


Angehängte Dateien:

Lesenswert?

Eine Lösungsvariante für den ATmega136 (Heikörperregler THERMOtronic)
ATmega8 bzw. ATmega328p.

Ich danke Euch sehr !

Vielleicht hat jemand noch eine weitere Variante

: Bearbeitet durch User
von S. Landolt (Gast)


Lesenswert?

.def  temp1        = r20
.def  temp2        = r21

wandeln:
  cpi    temp1,143+1
  brcs   okay
   ldi   temp1,24    ; Fehler
   ldi   temp2,0
 ret
okay:
  mov    temp2,temp1
  ldi    temp1,0
loop:
   inc   temp1
   subi  temp2,6
  brcc   loop
  subi   temp2,-6    ; ein Schritt zu weit, zurueck
  dec    temp1
  mov    r0,temp2
  ldi    temp2,10
  mul    r0,temp2
  mov    temp2,r0
 ret

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.