Zahl aufteilen - Bascom

OP #1728383
Lesenswert?

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.
OP #1728447
Lesenswert?

...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
#1728454
Lesenswert?

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 ?
#1728463
Lesenswert?

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
OP #1728491
Lesenswert?

@ 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.
#1728556
Lesenswert?

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
Gast #1728586
Lesenswert?

>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"
Gast #1728766
Lesenswert?

>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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren