Hallo, ich möchte gerne mit Bascom ein Zähler von 0 bis 9999 machen. Das ganze wird von vier Siebensegment Anzeigen dargestellt. Diese werden über ein SAA1064 angesteuert. Als µC dient der Atmega8. Schaltung funktioniert. Die Ansteuerung des SAA1064 ist soweit verstanden. Ich hab es geschafft das jedes Segment von 0 bis 9 Zählt. Sobald ich aber über 10 hinaus komme muss die Zahl aufgeteilt werden in Einerstelle, Zehnerstelle, usw. Das ganze soll so gemacht werden das ich ach später z.B. ein ADC-Wert anzeigen lassen kann, oder eine Uhrzeit. Wie mach ich das ganze am besten? ich komm da echt nicht weiter. Wäre toll wenn mir jemand dabei helfen könnte.
Stellen: 4321 stelle1 = zahl modulo 10 zahl = zahl / 10 stelle2 = zahl modulo 10 zahl = zahl / 10 . . .
...mhmm komm ich nicht ganz klar damit wie du es meinst. Momentan sieht es so aus, ich brauch halt noch eine Subroutine die mir eine Zahl in die einzelnen Ziffern aufteilt... Kannst du dein Lösungsansatz mal etwas erläutern?
1 | Declare Sub Init_digitalanzeige() |
2 | Declare Sub Ziffer_digitalanzeige(byval Ziffer As Byte , Byval Zahl As Byte) |
3 | Declare Sub Zahl_digitalanzeige(byval Zahl As Integer) |
4 | |
5 | $regfile = "m8def.dat" |
6 | $crystal = 8000000 |
7 | |
8 | Config Sda = Portc.4 |
9 | Config Scl = Portc.5 |
10 | |
11 | Dim I As Integer |
12 | Dim Segmente As Byte |
13 | |
14 | I2cinit |
15 | Init_digitalanzeige |
16 | |
17 | Do |
18 | |
19 | For I = 0 To 9999 |
20 | Zahl_digitalanzeige I |
21 | Waitms 100 |
22 | Next I |
23 | |
24 | Loop |
25 | End |
26 | |
27 | |
28 | |
29 | |
30 | |
31 | Sub Init_digitalanzeige() |
32 | Local Z As Byte |
33 | |
34 | I2cstart |
35 | I2cwbyte &H70 |
36 | I2cwbyte 0 |
37 | I2cwbyte &B0010111 'Control Byte |
38 | I2cstop |
39 | |
40 | 'Alle Ziffern auf 0 |
41 | For Z = 1 To 4 |
42 | Ziffer_digitalanzeige Z , 0 |
43 | Next Z |
44 | End Sub |
45 | |
46 | |
47 | |
48 | Sub Ziffer_digitalanzeige(byval Ziffer As Byte , Byval Zahl As Byte) |
49 | I2cstart |
50 | I2cwbyte &H70 |
51 | I2cwbyte Ziffer |
52 | |
53 | Select Case Zahl |
54 | |
55 | Case 0: |
56 | Segmente = &H7E |
57 | Case 1: |
58 | Segmente = &H6 |
59 | Case 2: |
60 | Segmente = &HDA |
61 | Case 3: |
62 | Segmente = &H9E |
63 | Case 4: |
64 | Segmente = &HA6 |
65 | Case 5: |
66 | Segmente = &HBC |
67 | Case 6: |
68 | Segmente = &HFC |
69 | Case 7: |
70 | Segmente = &HE |
71 | Case 8: |
72 | Segmente = &HFE |
73 | Case 9: |
74 | Segmente = &HBE |
75 | End Select |
76 | |
77 | I2cwbyte Segmente |
78 | I2cstop |
79 | End Sub |
holger schrieb: > Stellen: 4321 > > stelle1 = zahl modulo 10 > zahl = zahl / 10 > stelle2 = zahl modulo 10 > zahl = zahl / 10 > . > . > . nuja ööm ich weiss nicht viel was man noch erläuter kann. Weisst du was der Modulo-Operator macht ? Was er geschrieben hat musst du nur noch umsetzten. zahl = die Zahl deren einzelne Stellen du haben willst stelle1 = zahl MOD 10 zahl = zahl / 10 stelle2 = zahl MOD 10 zahl = zahl / 10 stelle1 = erste Stelle deiner Zahl stelle2 = zweite Stelle deiner Zahl .... was verstehst du denn nicht ?
Okay ich mach dir kurz den Bascom Code: sorry wenn ich was verhau im synatx - hab noch nie bascom gemacht.
1 | zahl = 81 ' unsere Testzahl lautet 81 |
2 | stelle1 = zahl MOD 10 |
3 | zahl = zahl / 10 |
4 | stelle2 = zahl MOD 10 |
5 | zahl = zahl / 10 |
das war's schon Variable stelle1 hat den Wert 1. Variable stelle2 hat den Wert 8. this is it :-D
Möglicherweise wäre es sogar einfacher, in BCD zu zählen anstatt in einem Integer. Dann sparst du dir die Modulo-Rechnung, die braucht nämlich verdammt viel Platz und Rechenzeit.
@ bing: kannst du das mit dem BCD mal etwas erklären, oder hast du ein guten Link? Hintergrund ist der das ich später das DCF77 signal empfangen möchte und auswerten und da hab ich auch ihrgendetwas mit BCD gelesen und dann könnte es am ende etwas einfacher sein vllt.
Sönke O. schrieb: > @ bing: kannst du das mit dem BCD mal etwas erklären, Einfach 2 Variablen. Eine für die Einer, eine für die Zehner. Aber so schlimm ist das mit dem Modulo und der Division auch wieder nicht. Du brauchst die ja nur für Ausgaben und die sind, aus Prozessorsicht, dann auch wieder nicht so häufig. ------ Aber das Prinzip der Zerlegung ist doch eigentlich sehr einfach Du hast eine Zahl. Sagen wir 38 Was ergibt dann 38 / 10? Genau: 3 Also sind in 38 exakt 3 Zehner enthalten. Die Zehnerstelle von 38 lautet 3 Und wieviele Einer sind da enthalten? Na 38 - 3 * 10 = 8 Die Zahl 38 kann also in 3 Zehner und 8 Einer zerlegt werden. Eine Frau hat 38 Torten und 10 Kinder. Wieviele Toretn kriegt jedes Kind, wenn alle Kinder gleich viele Torten bekommen und wieviele Torten bleiben der Frau übrig? Solche Rechnungen hast du in der 2. oder 3. Klasse Grundschule zur Genüge gemacht. Division kennst du. Modulo ist einfach nur der Rest, der bei einer ganzzahligen Division bleibt. 38 / 10 -> 3 38 mod 10 -> 8
Ich bin mir sicher, auch in Bascom gibts schon was fertiges, wie unter C (sprintf, itoa). Peter
Du kannst auch die Zahl in einen String umwandeln und dann die einzelnen Zeichen aus dem String auslesen. Das geht ohne modulo, Divisionen, Subtraktionen. Also ohne Mathematik. Ich hab mal so was gesehen, ohne weitere ICs. http://home.arcor.de/wosm/AtmegaProjekt/Projekte/Projekt2.htm Die LEDs werten über Multiplex-Betrieb angesteuert. B.
>Ich bin mir sicher, auch in Bascom gibts schon was fertiges
Nein, dafür nicht.
So geht es auch:
Zahl =1204 ' zum Testen
Temp = Zahl
For I = 1 To 4
Stelle(i) = Temp Mod 10 'letzte Stelle in Ziffernvariable
schreiben
Temp = Temp / 10 'vorletzte Stelle zur letzten machen
Next I 'das Ganze noch 3 x von vorn
Print Zahl
Print Stelle(4)
Print Stelle(3)
Print Stelle(2)
Print Stelle(1)
Print "MfG Paul"
Paul Baumann schrieb: >>Ich bin mir sicher, auch in Bascom gibts schon was fertiges > > Nein, dafür nicht. Ooch nöö, jetzt muß ich für Dich im Manual (BASCAVR.pdf) nachschauen: STR Action Returns a string representation of a number. Syntax var = STR( x) Dann nur noch von jedem Digit '0' abziehen als Index auf die 7-Segment Tabelle, fertisch. Peter
>Ooch nöö, jetzt muß ich für Dich im Manual (BASCAVR.pdf) nachschauen:
Mach Dir nur keine anderen Umstaende. ;-)
Ich bin hier schon boese fuer die Verwendung der STR-Funktion beim
Zerlegen von mehrstelligen Zahlen angenoelt worden.
(das kostet Zeit, das kostet Speicherplatz, das ist nicht effizient...
grein, jaul, stoehn, aechts)
Jetzt schlage ich eine andere Variante vor, -da ist es auch wieder
nichts.
8-0
MfG Paul
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.