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.
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'?!
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.
...also die zahlen liegen als gewöhnliche dezimalzahlen vor, sorry
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.
das ist mir schon alles klar! ich bin mir nur nicht sicher beim testen, ob die zahl kleiner ist als 10.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.