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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Bernhard S. (bernhard)


Angehängte Dateien:

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


Bewertung
-1 lesenswert
nicht lesenswert
minuten = wert * 10
stunden = minuten / 60
minuten = minuten % 60

Oder:

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

: Bearbeitet durch User
von (prx) A. K. (prx)


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


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


Bewertung
-1 lesenswert
nicht 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)


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


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

von S. Landolt (Gast)


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


Angehängte Dateien:

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

Kann ich auch :-)

von Bernhard S. (bernhard)


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


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


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

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


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

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]
  • [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.