mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Zahl aufteilen - Bascom


Autor: Sönke O. (soenio)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stellen: 4321

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

Autor: Sönke O. (soenio)
Datum:

Bewertung
0 lesenswert
nicht 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?
Declare Sub Init_digitalanzeige()
Declare Sub Ziffer_digitalanzeige(byval Ziffer As Byte , Byval Zahl As Byte)
Declare Sub Zahl_digitalanzeige(byval Zahl As Integer)

$regfile = "m8def.dat"
$crystal = 8000000

Config Sda = Portc.4
Config Scl = Portc.5

Dim I As Integer
Dim Segmente As Byte

I2cinit
Init_digitalanzeige

Do

For I = 0 To 9999
   Zahl_digitalanzeige I
   Waitms 100
Next I

Loop
End





Sub Init_digitalanzeige()
Local Z As Byte

   I2cstart
   I2cwbyte &H70
   I2cwbyte 0
   I2cwbyte &B0010111                                       'Control Byte
   I2cstop

   'Alle Ziffern auf 0
   For Z = 1 To 4
      Ziffer_digitalanzeige Z , 0
   Next Z
End Sub



Sub Ziffer_digitalanzeige(byval Ziffer As Byte , Byval Zahl As Byte)
I2cstart
I2cwbyte &H70
I2cwbyte Ziffer

Select Case Zahl

      Case 0:
         Segmente = &H7E
      Case 1:
         Segmente = &H6
      Case 2:
         Segmente = &HDA
      Case 3:
         Segmente = &H9E
      Case 4:
          Segmente = &HA6
      Case 5:
         Segmente = &HBC
      Case 6:
         Segmente = &HFC
      Case 7:
         Segmente = &HE
      Case 8:
         Segmente = &HFE
      Case 9:
         Segmente = &HBE
End Select

I2cwbyte Segmente
I2cstop
End Sub

Autor: Lehrmann Michael (ubimbo)
Datum:

Bewertung
0 lesenswert
nicht 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 ?

Autor: Lehrmann Michael (ubimbo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Okay ich mach dir kurz den Bascom Code:

sorry wenn ich was verhau im synatx - hab noch nie bascom gemacht.
zahl = 81                     ' unsere Testzahl lautet 81
stelle1 = zahl MOD 10
zahl = zahl / 10
stelle2 = zahl MOD 10
zahl = zahl / 10
das war's schon

Variable stelle1 hat den Wert 1.
Variable stelle2 hat den Wert 8.

this is it :-D

Autor: bing (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Sönke O. (soenio)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Dannegger (peda)
Datum:

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


Peter

Autor: Bernadette (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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/P...

Die LEDs werten über Multiplex-Betrieb angesteuert.


B.

Autor: Paul Baumann (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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"

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Paul Baumann (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.