www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik auftrennen einer 2stelligen Dezimalzahl in asm (pic 16f88)


Autor: Mario (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!


Ich will eine RTC programmieren und die jeweiligen Werte für Min und Std 
mit Hilfe von 7seg-displays ausgeben, in Assembler, PIC16F88, max7221).

Also die Werte sollen über den 'decode mode' direkt als Dezimalzahlen an 
den max7221 geschickt werden (über Tabellen für die einzelnen digits).

Die zweistelligen Zahlen sollen aufgetrennt werden:

ZB: Minuten=35 --> aufteilen in '3' & '5'; Stunden=09 --> aufteilen in 
'0' $ '9' und rausschicken.

Bitte um eure Hilfe!

MfG

Mario

Autor: Mario (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Noch eine Frage: Wie kann ich das Problem umgehen, wenn die Stunden als 
auch die Minuten nur einstellig sind und ich trotzdem die einzelnen 
Stellen auftrennen und getrennt rausschicken will?

Also zB: bei 9 Minuten gibt es ja nur eine Stelle, also kennt sich der 
PIC ja nicht aus, ob das die Einer- oder Zehnerstelle ist!?

MfG
Mario

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

Bewertung
0 lesenswert
nicht lesenswert
Wie liegen deine Minuten vor?

Als Binärzahl, also als Zahlen von 0b00000000 bis 0b00111011 (= 0 bis 
59), oder hast du die einzelnen Ziffern schon in den Nibbels vorliegen?

Ansonsten brauchst du nur rechnen.
   34 / 10  =  3
und der Rest bei der Division ergibt dann die Einerstelle.

(Noch ein Tip: Anstelle von Dividieren kann man auch einfach in einer 
Schleife immer 10 abziehen und nachsehen ob das Ergebnis schon kleiner 
als 10 ist. Man zählt einfach mit, wie oft man abziehen konnte und hat 
damit das Ergebnis der Division. Von 34 kann man 3 mal 10 abziehen bis 
das Ergebnis kleiner als 10 wird. 3 ist daher das Ergebnis der Division. 
Mit der Methode erhält man dann auch ganz elegant den Rest bei der 
Division)


Auch 9 / 10  ergibt einfach nur 0. Daher ist die Zehnerstelle dann 0 und 
der Rest der Division, nämlich die 9, sind die Einerstelle.

Autor: Mario (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Erstmal besten Dank für deine Hilfe, guter Tipp!

Die Minuten und die Stunden liegen als Dezimalzahlen vor. Ich verwende 
zum Zählen eine routine aus dem Datenblatt des 16F88.

LG Mario

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

Bewertung
0 lesenswert
nicht lesenswert
Mario schrieb:
> Erstmal besten Dank für deine Hilfe, guter Tipp!
>
> Die Minuten und die Stunden liegen als Dezimalzahlen vor. Ich verwende
> zum Zählen eine routine aus dem Datenblatt des 16F88.

????
Also du untersten 4Bit sind bereits Zahlen von 0 bis 9 und die obersten 
4Bit ebenso? Oder wie muss man das jetzt verstehen? (Es ist sinnlos auf 
irgendeine obskure Routine in einem Datenblatt zu verweisen, das ich 
nicht habe und mir auch nicht besorgen werde)

Wo liegt dann das Problem.
4 Bits ausmaskieren -> Einerstelle
oberen 4 Bit ausmaskieren und nach unten schieben -> Zehnerstelle


Vergiss das mit den Dezimalzahlen. Dein PIC rechnet nicht dezimal. Zahl 
ist Zahl. Und in einem Register des µC kannst du Zahlen von 0 bis 255 
unterbringen. Und diese Zahlen gilt es zu zerlegen.

Normalerweise rechnet man immer binär, d.h. das Bitmuster im Register 
entspricht direkt der Zahl. Um Hunderter, Zehner und Einer zu trennen, 
muss man nur durch 100 bzw. durch 10 dividieren.

Man kann aber auch BCD (binäry coded decimal) rechnen. Da folgt zb auf 
die binäre Zahl 9 direkt die binäre Zahl 17. Der Grund dafür liegt 
darin, dass die Binärdarstellung dann so ist, dass man Einer und Zehner 
dadurch leicht trennen kann, dass sie, wie oben beschrieben, mittels 
Bitmaskierung und Schieben ganz leicht abgetrennt werden können. Jeweils 
4 Bit stellen eine Ziffer von 0 bis 9 dar. Da aber mit 4 Bit von 0 bis 
16 gezählt werden kann, muss man das entsprechend berücksichtigen, damit 
die Bitdarstellung wieder stimmt.

Ich weiss jetzt nicht, ob das bei dir so ist (ob du BCD benutzt). Das 
solltest du selber wissen.

Autor: Mario (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry, ich steh grad auf der Leitung (aber ich weiß ca., was du meinst).

Also wie funktioniert das Auftrennen bei zB. 39min, also b'00100111'?!

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

Bewertung
0 lesenswert
nicht lesenswert
Mario schrieb:
> Sorry, ich steh grad auf der Leitung (aber ich weiß ca., was du meinst).
>
> Also wie funktioniert das Auftrennen bei zB. 39min, also b'00100111'?!

b'00100111' ist eine ganz normale Binärzahl für 39. Also wie oben 
geschrieben: durch 10 dividieren.

ALs BCD Zahl sähe 39 so aus
     0b'00111001'
        |  ||  |
        |  |+--+ Diese 4 Bits sind die 9 (1001)
        |  |
        +--+ Und diese 4 Bits die 3 ( 0011 )

zählt man zu dieser BCD Zahl 1 dazu, so würde sich ergeben

     0b'01000000'
        |  ||  |
        |  |+--+ Diese 4 Bits stellen eine 0 dar ( 0000 )
        |  |
        +--+ Und diese 4 Bits eine 4 ( 0100 )

Als BCD Zahl wäre dieses Bitmuster daher 40

Als stinknormal Binärzahl wäre das allerdings 64, und b'00111001 wäre 57 
gewesen.

Autor: Mario (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...also die zahlen liegen als gewöhnliche dezimalzahlen vor, sorry

Autor: Mario (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ah, was schreib ich, als gewöhnliche binärzahlen natürlich. also muss 
ich dividieren! wie kann ich dann überprüfen, ob die zahl dann kleiner 
ist als 10? mit subwf und zeroflag testen?

besten dank schon mal ;)

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

Bewertung
0 lesenswert
nicht lesenswert
Mario schrieb:
> ah, was schreib ich, als gewöhnliche binärzahlen natürlich. also muss
> ich dividieren! wie kann ich dann überprüfen, ob die zahl dann kleiner
> ist als 10? mit subwf und zeroflag testen?

Was willst du machen? Eine RTC bauen?
Denkst du nicht, dass du dazu erst mal die Grundlagen kenne solltest? 
Addieren, Subtrahieren, Vergleiche, bedingte Sprünge, etc.

Autor: Mario (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das ist mir schon alles klar!

ich bin mir nur nicht sicher beim testen, ob die zahl kleiner ist als 
10.

Autor: Sven Stefan (stepp64) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mario schrieb:
> das ist mir schon alles klar!
>
> ich bin mir nur nicht sicher beim testen, ob die zahl kleiner ist als
> 10.

Das Z-Flag ist nur gesetzt, wenn das Ergebnis genau Null ist. Bei größer 
als und kleiner als musst du das Carry-Flag auswerten. Schau dir in der 
Doku die Befehlsübersicht an. Dort ist das ganz genau erklärt.

Oder wie immer bei 16F PICs: www.sprut.de

Gruß
Sven

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.