Forum: Mikrocontroller und Digitale Elektronik Mandelbrot-Menge ("Apfelmännchen") auf MC9S08AW60


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Peter (Gast)


Lesenswert?

Hallo miteinander,

in einem anderen Forum bin ich auf ein trickreiches Programm gestoßen, 
das auf einem OLED-I2C-Grafikdisplay die Mandelbrot-Menge 
("Apfelmännchen") auf einem MC9S08AW60 Mikrocontroller zeichnet. Hier 
mal der entsprechende Codeausschnitt in 6808-Assembler:
1
' Berechnung eines Punktes der Mandelbrotmenge
2
' von Dietmar Harlos am 1. Juli 2006
3
' die Anzahl der benoetigten Iterationen wird in iter zurueckgeliefert
4
5
PROC mandel INLASM
6
7
! lda REc        '-128..32      ' RE(c) muss in der Aufloesung reduziert
8
! asra                          ' werden, damit es in den folgenden Berech-
9
! adc #0                        ' nungen nicht zu einem Ueberlauf kommt.
10
! sta REc_dz     '-64..16       ' Dabei wird gerundet.
11
! sta REz
12
13
! lda IMc        '-72..72       ' IM(c) ebenso reduzieren. Die Zahlen sind
14
! asra                          ' jetzt mit dem Faktor 32 skaliert, was
15
! adc #0                        ' dem Linksshiften um 5 Stellen entspricht.
16
! sta IMc_dz     '-36..36       ' -64..16 -> -64/32..16/32 -> -2.0..0.5
17
! sta IMz
18
19
! clr iter                      ' Anzahl der Iterationen festhalten
20
#mandel_1
21
! lda REz        '-64..63       ' RE(z)^2 berechnen und festhalten, da es
22
! tax                           ' unten noch einmal benoetigt wird.
23
! bsr imul
24
! asrx
25
! rora
26
! adc #0
27
! sta REzQ       '0..128
28
29
! lda IMz        '-64..63       ' IM(z)^2 berechnen und festhalten, da es
30
! tax                           ' unten noch einmal benoetigt wird.
31
! bsr imul
32
! asrx
33
! rora
34
! adc #0
35
! sta IMzQ       '0..128
36
37
! add REzQ                      ' Abfrage RE(z)^2+IM(z)^2 >= 128 (= 4.0)
38
! blt mandel_2   '(N XOR V)=1   ' Schleife beenden, wenn Betrag von z >= 2.0
39
40
! inc iter                      ' Iterationszaehler um eins inkrementieren
41
! lda #14                       ' und auf maximale Anzahl der Iterationen
42
! cbeq iter,mandel_2            ' ueberpruefen
43
44
! lda REz        '-64..63       ' IM(z) = 2*RE(z)*IM(z) + IM(c)
45
! ldx IMz        '-64..63
46
! bsr imul       '-4032..4096 -> x:a= $ff:04..$01:$00
47
! adc IMc_dz     '-36..36 -/+ 1
48
! bcc mandel_3
49
! incx                          ' Die Multiplikation mit 2 liefert ein
50
#mandel_3                       ' 16-Bit-Ergebnis, deshalb muss auch die
51
! brclr #7,IMc_dz,mandel_4      ' Addition in 16-Bit durchgefuehrt werden.
52
! decx
53
#mandel_4
54
! sta IMz
55
56
! pushx                         ' Schleife verlassen, falls das 16-Bit-
57
! poph                          ' Ergebnis zu gross oder zu klein ist.
58
! tax                           ' Wenn IM(z) z.B. -65, dann waere IM(z)^2
59
! cmphx #63                     ' gleich 132. Die Schleife wuerde also nach-
60
! bgt mandel_2                  ' folgend beim "blt mandel_2" verlassen.
61
! cmphx #-64
62
! blt mandel_2
63
64
! lda REzQ       '0...126       ' RE(z) = RE(z)^2-IM(z)^2 + RE(c)
65
! sub IMzQ       '0...126 -> -126..126
66
! add REc_dz     '-64..15
67
! tax                           ' Schleife verlassen, falls bei der Addition
68
! tpa                           ' ein Ueberlauf im 2-er-Komplement auftrat
69
! tsta
70
! bmi mandel_2   'V - Overflow Flag - A7 & M7 & ~R7 | ~A7 & ~M7 & R7
71
! stx REz
72
73
! cmpx #63                      ' Schleife verlassen, falls das Ergebnis
74
! bgt mandel_2                  ' zu gross oder zu klein ist. Begruendung
75
! cmpx #-64                     ' siehe oben.
76
! bge mandel_1
77
78
#mandel_2
79
! rts                           ' Ruecksprung nach BASIC
80
81
82
' Vorzeichenbehaftete Multiplikation im mit 32 skalierten 8-Bit-Fixkommaformat
83
' von Dietmar Harlos am 1. Juli 2006
84
85
#imul
86
! clr OSTEMP
87
! tsta           ' Zum Verstaendnis, Multiplikation 1.75 mal 1.5:
88
! bpl imul_1     ' Die Zahlen sind skaliert: 1.75*32=56, 1.5*32=48
89
! inc OSTEMP     ' Multiplikation liefert: 1.75*1.5*32*32=2688
90
! nega           ' Zur Anpassung an die Skalierung wird durch 32
91
#imul_1          ' geteilt, also 5-mal nach rechts geshiftet.
92
! tstx           ' Das Ergebnis 2688/32=84 ist somit 84/32=2.625.
93
! bpl imul_2
94
! inc OSTEMP
95
! negx           ' Maximaler Rueckgabewert (Ergebnis):
96
#imul_2          ' -64*-64= 4096/2^4= 256 -> x:a = $01:$00
97
! mul            ' -64* 63=-4032/2^4=-252 -> x:a = $ff:$04
98
#imul_4
99
! brclr #0,OSTEMP,imul_3
100
! comx
101
! nega
102
! bne imul_3
103
! incx
104
#imul_3
105
! asrx
106
! rora           ' Eigentlich sind 5 Schiebe- und Rotierbefehle
107
! asrx           ' notwendig, aber im Hauptprogramm muss an
108
! rora           ' einer Stelle das Ergebnis der Multiplikation
109
! asrx           ' mit zwei multipliziert werden. Deshalb wird
110
! rora           ' das fuenfte Schieben inklusive Runden bei
111
! asrx           ' Bedarf im Hauptprogramm durchgefuehrt.
112
! rora
113
! rts
114
115
END PROC
Wen es interessiert, hier noch ein Link zum Beitrag im anderen Forum. Da 
ist auch ein Bild:

http://ccintern.dharlos.de/forum/lesen.php?eintrag=16848

http://ccintern.dharlos.de/forum/upload/OLED-Mandelbrot_L-Team_800x462.jpg

Grüße
Peter

von olaf (Gast)


Lesenswert?

> in einem anderen Forum bin ich auf ein trickreiches Programm gestoßen,
> das auf einem OLED-I2C-Grafikdisplay die Mandelbrot-Menge

Und? Meinst du nicht das du damit 30Jahre zu spaet kommst? :)

Ich hab das 1990 mal auf einem HP48 programmiert. Cool daran
war eigentlich nur das selbst programmieren. Hinterher laesst
man das einmal laufen und dann war es das. Zumal es ohne Farben
auch nicht gerade toll aussieht.

Okay, der HP48 hat das in 64x32pixel in 1-2h geschafft. Ich gehe
mal davon aus das ein heutiger Microcontroller das in wenigen Minuten 
hinbekommt.

Olaf

von Jochen (Gast)


Lesenswert?

olaf schrieb:
> Zumal es ohne Farben auch nicht gerade toll aussieht.

Darum hat man das auf einem C64 gemacht. 6502 Assembler ist auch viel 
schöner.

von Olaf (Gast)


Lesenswert?

> 6502 Assembler ist auch viel schöner.

Nein. Assembler ist fure Loser. Schon 1990 hat man das natuerlich in 
Forth gemacht. :-D

Olaf

von Xeraniad X. (xeraniad)


Lesenswert?

Welch Reminiszenzen. Wir hatten betreffs des Mandel-Brot-Apfel-Gebildes 
zunächt auf Apfel ][ s/w rumgespielt.
Zunächst hatte ich die Formel etwas falsch & da kam was wie Julia raus.
Beim job waren da nur VT220 terminals, aber zum richtig arbeiten.
Ein "erfahrener" "Chef" {welch wunderlichen Namen er auch trug} erkannte 
meine Ambitionen beim zufälligen Vorbeigehen hinterrücks & riet mir 
insdringlich, solcherlei Unfug inskünftig zu unterlassen.
(Selbstvstertändlich wurden heimlich noch Sierpinski & Hilbert Plots auf 
dem  damals neuen laser ausgedruckt.)

: Bearbeitet durch User
von Michael M. (Firma: Autotronic) (michael_metzer)


Angehängte Dateien:

Lesenswert?

olaf schrieb:
> Zumal es ohne Farben
> auch nicht gerade toll aussieht.

Die Mandelbrotmenge hört sich gerade jetzt in der schönen Herbstzeit 
nicht nur lecker und geschmackvoll an, sondern sie sieht in Farbe auch 
noch schön bunt aus :)

Als Bastelarbeit im Herbst kann man sich neben Kastanienmänchen-basteln 
auch die Mandelbrotmengenbildchen aus dem Netz ausdrucken und in mehrere 
kleine Bilderrahmen 5x5cm über den Schuhschrank in der Diele aufhängen.

von Olaf (Gast)


Lesenswert?

> sondern sie sieht in Farbe auch noch schön bunt aus :)

Das wissen wir. Aber sowohl auf dem Oled im Ausgangsposting wie auch
auf meinem HP48 gab es keine Farbe, sieht also eher kacke aus.

Olaf

von Peter (Gast)


Lesenswert?

Der MC9S08AW60 Mikrocontroller, auf dem das Programm läuft, nennt sich 
"Open-Maxi". Er wurde im Open-Control-Projekt erstellt:

http://om.dharlos.de/

olaf schrieb:
> Okay, der HP48 hat das in 64x32pixel in 1-2h geschafft. Ich gehe
> mal davon aus das ein heutiger Microcontroller das in wenigen Minuten
> hinbekommt.

Die Open-Maxi braucht zur Berechnung inklusive Darstellung circa 3 bis 4 
Sekunden.

von Εrnst B. (ernst)


Angehängte Dateien:

Lesenswert?

Hat jemand noch einen Postscript-fähigen Laserdrucker, den er quälen 
will?

von Jobst M. (jobstens-de)


Angehängte Dateien:

Lesenswert?

Beschäftige mich seit über 30 Jahren mit ...
Angehängt Desktophintergründe
Ein ESP32 DevKit liegt hier auf dem Schreibtisch und rechnet sich den 
ganzen Tag in das Apfelmännchen hinein ....

Gruß
Jobst

von Xeraniad X. (xeraniad)


Lesenswert?

@ 27.09.2022 19:09:   sehr schöne Bilder!
Da sind auch bereits weitere Generationen zu erkennen.
Rechnest Du denn mit {64 bit} floating-piont oder mit erhöhter {software 
-} Präzision, um so weit hineinzuzoomen?

Also ich erinner mich noch an die Rekursions -Vorschrift:
mit wählbaren ("komplexen") Parametern {"Punkt"} c {, z[0] := 0}; 
ausserdem max. Iterations -Tiefe & so.
Man musste die n mitzählen & nach "Farbe" abbilden {oder für den "Punkt" 
terminieren} ...

: Bearbeitet durch User
von Jobst M. (jobstens-de)


Lesenswert?

Xeraniad X. schrieb:
> Rechnest Du denn mit [...]

'xaos' heißt das Program, mit dem die Bildschirmhintergründe erzeugt 
wurden.
K.A. mit welcher Präzision das rechnet.


Xeraniad X. schrieb:
> Also ich erinner mich noch [...]

Hier eine sehr schöne Erklärung, was dort überhaupt passiert:
https://www.youtube.com/watch?v=FFftmWSzgmk


Gruß
Jobst

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]
  • [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.

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