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