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


von Mario (Gast)


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

von Mario (Gast)


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

von Karl H. (kbuchegg)


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.

von Mario (Gast)


Angehängte Dateien:

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

von Karl H. (kbuchegg)


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.

von Mario (Gast)


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'?!

von Karl H. (kbuchegg)


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.

von Mario (Gast)


Lesenswert?

...also die zahlen liegen als gewöhnliche dezimalzahlen vor, sorry

von Mario (Gast)


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 ;)

von Karl H. (kbuchegg)


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.

von Mario (Gast)


Lesenswert?

das ist mir schon alles klar!

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

von Sven S. (stepp64) Benutzerseite


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

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.