Forum: Mikrocontroller und Digitale Elektronik Zahl aufteilen - Bascom


von Sönke O. (soenio)


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.

von holger (Gast)


Lesenswert?

Stellen: 4321

stelle1 = zahl modulo 10
zahl = zahl / 10
stelle2 = zahl modulo 10
zahl = zahl / 10
.
.
.

von Sönke O. (soenio)


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

von Lehrmann M. (ubimbo)


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 ?

von Lehrmann M. (ubimbo)


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

von bing (Gast)


Lesenswert?

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.

von Sönke O. (soenio)


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.

von Karl H. (kbuchegg)


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

von Peter D. (peda)


Lesenswert?

Ich bin mir sicher, auch in Bascom gibts schon was fertiges, wie unter C 
(sprintf, itoa).


Peter

von Bernadette (Gast)


Lesenswert?

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.

von Paul Baumann (Gast)


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"

von Peter D. (peda)


Lesenswert?

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

von Paul Baumann (Gast)


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

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.