Hallo,
ich bin der Henri und beschäftige mich seid dieser Woche intensive mit
Bascom AVR. Ich habe mit der Seite von Roland Walter angefangen, daher
habe ich ach das Testboard mit den er auch arbeitet.
http://www.rowalt.de/mc/
Nun wollte ich mit programmieren eines LCD-Display 16 * 2 anzufangen.
Gewissen Sachen konnte ich schon programieren, aber jetzt wollte ich
gerne vor jedem "Main" Programm eine "Einführung".
Ich möchte also bevor das "Main" Programm beginnt eine Einführung -
heißt:
Per Taster soll eine Led leuchten (das ganze programm über) und auf dem
Display soll "LCD-Display ON" stehen.
Durch nochmaligen drücken des Tasters soll nun das "Main" Programm
anfangen. Ich hatte mir da schon was zurechtprogrammiert, aber das funzt
nich :D.
Ich hoffe ihr könnt mir dabei helfen
Listing:
$regfile = "attiny2313.dat"
$crystal = 3686400
'////Portx/Pinx konfigurieren////
Config Pinb.0 = Input
Pinb.0 = 1
Taster1 Alias Pinb.0 '"EIN" Taser
Config Portb.1 = Output
Led1 Alias Portb.1 'Led (grün),
LCD "Ein"
Dim A As Byte
A = 0
'////LCD////
Config Lcd = 16 * 2
Config Lcdbus = 4
'LCD im 4Bit I/0 Modus
Config Lcdpin = Pin , Db4 = Portd.0 , Db5 = Portd.1 , Db6 = Portd.2 ,
Db7 = Portd.3 , E = Portd.5 , Rs = Portd.4
'LCD löschen
Cls
'////Listing "Einführung"////
Do
If Taster1 = 0 Then
Incr A
End If
If A = 1 Then
Led1 = 1
Cls
Waitms 100
Locate 1 , 1
Lcd "LCD Display ON"
Else
Led1 = 0
End If
'////Listing "Main"////
If A = 2 Then
Led1 = 1
.....
.....
Loop
End
Ich schätze da muss viel geändert werden. Wenn ich nur die Einführung
laufen lass spielt die LED verrückt (blinkt, bleibt an geht aus, jedes
mal was anderes).
Ich habe die Vermutung, dass das was mit der PORT belegung zu tun hat -
sprich: PORTD oder PORTB
Das datasheet meines ATTINY2313:
http://www.reichelt.de/?;ACTION=6;LA=3;ARTICLE=54568;GROUPID=2958;GROUP=A362;SID=270qO3E6wQARsAABLlH0cdbccc0d51d4e4b1c2bb3bd83c3526b16
Ich bitte euch, wenn ihr mir helft auch kurz zu beschreiben, was ihr
ändert im Program und wie es dann funzt.
Schonmal danke
Gruß,
Henri
Ich kenne jetzt dein Board nicht, aber wahrscheinlich wirst du einfach
nur den Pullup Widerstand am Taster einschalten müssen.
> Per Taster soll eine Led leuchten (das ganze programm über) und auf dem> Display soll "LCD-Display ON" stehen.> Durch nochmaligen drücken des Tasters soll nun das "Main" Programm> anfangen.
Warum dann so kompliziert?
Mach es doch genau so wie du es beschrieben hast. Ein Programm kann
durchaus auch aus einer Abfolge von mehreren Schleifen bestehen, solange
die zuerst ausgeführten Schleifen auch tatsächlich irgendwann
abgebrochen werden
In Pseudocode
1
... Konfiguration
2
3
Schleife: solange Taste nicht gedrückt
4
mach nichts
5
6
schalte Led ein
7
Schreibe "LCD-ON" aufs Display
8
9
Schleife: solange Taste noch gedrückt ' warte aufs Loslassen
10
mach nichts
11
12
Schleife: solange Taste nicht gedrückt ' jetzt gilts, der Benutzer
13
' muss ein zweitesmal Drücken
14
mach nichts
15
16
und los gehts mit dem Hauptprogramm
17
do
18
....
19
loop
man muss nicht zwangsweise alles in eine einzige riesige Loop stecken
:-)
Also laut datenblatt liegt auf portb noch die ISP-Schnittstelle. Hast du
vll. noch den Programmer dran sodass der port belegt ist?
Versuch einfach mal nen anderen Port.
An deiner stelle würde ich mit einem select case block abrbeiten um a
auszuwerten. Zudem musst du deinen taster noch entprellen, weill hier
wird a wahrscheinlich mehr als nur einmal hoch gezählt weil die schleife
mehrmals durchläuft. Guck mal in der Hilfe nach debounce! Ist zwar nicht
die beste lösung da es so ähnlich wie wait arbeitet aber ich denke das
kann man hier machen.
Mach am besten zwei do-loop schleifen raus, dann muss das prog nicht
immer komplett durch laufen.
gruß
Tobi
Hi,
ich bins nochmal, aber ich bekomms nich hin. Were super wenn wer von
euch ebend ein Programm schreiben könnte. An den PortB liegt nichts,
also daran kann es auch nich liegen.
Gruß,
Henri
'Schleife bis der Taster das erstemal gedrückt wurde
23
Do ' Solange durchlaufen bis A=1
24
If Pinb.1 = 0 Then
25
Debounce Pinb.1 , 0 , Incr_a , Sub 'Entprellen des Taster, wenn der Port auf 0 gezogen wird->debonce wird ausgelöst
26
End If
27
Loop Until A = 1
28
29
Portb.0 = 1 ' Led einschalten
30
Waitms 100
31
Lcd "LCD eingeschaltet" 'Text ausgeben
32
33
'Schleife bis Taster das zweitemal gedrückt wurde
34
Do
35
Debounce Pinb.1 , 0 , Incr_a , Sub
36
Loop Until A = 2
37
38
'Ab hier kann das Hauptprogramm hin
39
40
41
42
43
44
45
46
Sub Incr_a
47
Incr A
48
End Sub
Musst du dir nach belieben anpassen
Habe noch ein paar kommentare eingefügt damit es etwas verständlicher
ist.
An alle die jetzt meckern wollen, das man eigentlich keinen fertigen
code postet:
Ich weiß, das man es nicht macht aber er hat ja schon mal was gebracht
und sich dazu gedanken gemacht. Ok, der lern effekt ist jetzt nicht so
hoch wie wenn man es selbst macht aber dennoch kann man davon lernen und
profitieren.
gruß
Tobi
Hi,
sry, dass ich erst jetzt wieder schreibe, aber ich kanns halt nur im
Betrieb machen :D. Ich danke dir, ich werde das Programm jetzt mal
testen und anpassen und nacher sagen, ob es funktioniert hat.
Wer noch Lösungen hat, soll sie ruhig hier posten ... ich würde mich
freuen.
Gruß,
Henri
So,
ich habe mir jetzt ein Programm geschrieben, was eigendlich klappen
sollte, aber das tut es nicht :D. Ich hoffe Ihr könnt mir noch Fehler in
meinem Programm zeigen. Schonmal danke
$regfile = "attiny2313.dat"
$crystal = 3686400
'////Portx/Pinx/Variablen konfigurieren////
Config Pinb.0 = Input
Pinb.0 = 1
Taster1 Alias Pinb.0 '"EIN" Taser
Config Portd.1 = Output
Led1 Alias Portb.1 'Led (grün),
LCD "Ein"
Config Debounce = 30 'Zeitbasis
für debounce auf 30ms legen
Dim A As Byte ' A als byte
deklarieren
A = 0
Declare Sub Incr_a 'Sub Incr_a
festlegen
'////LCD////
Config Lcd = 16 * 2
Config Lcdbus = 4
'LCD im 4Bit I/0 Modus
Config Lcdpin = Pin , Db4 = Portd.0 , Db5 = Portd.1 , Db6 = Portd.2 ,
Db7 = Portd.3 , E = Portd.5 , Rs = Portd.4
'LCD löschen
Cls
'////Listing "Einführung"////
Do
Cursor Off 'Cursor aus
Cls 'LCD wird
gelöscht
Waitms 100
Locate 1 , 1
'Einführungsanzeige 1
Lcd "LCD Display ON"
Locate 2 , 1
Lcd "Bascom AVR"
Waitms 1000
Cls 'LCD wird
gelöscht
Waitms 100
Locate 1 , 1
'Einführungsanzeige 2
Lcd "Press T1 to"
Locate 2 , 1
Lcd "start Mainproga."
Waitms 2000
Loop Until A = 1
Do
If Taster1 = 0 Then 'Startet
Hauptprogramm
Debounce Taster1 , 0 , Incr_a , Sub 'Entprellen
des Taster, wenn der Port auf 0 gezogen wird
Loop
End If
Sub Incr_a
Incr A
Goto Hauptprogramm 'Gehe über
zu Hauptprogramm
End Sub
End
'////Listing "Hauptprogramm"////
Hauptprogramm:
Cls
Waitms 100
Do
Cursor Off
Locate 1 , 1
Lcd "hauptprogramm"
Cls
Waitms 100
Loop
End
Ich möchte gerne, dass ich erst eine Scheile von den 2 Displayanzeigen
habe und dann mit einem Taster weiter zum Hauptprogramm gehen kann. Ich
hoffe Ihr könnt mir helfen, weil ich nich mehr weiter komme.
Gruß,
Henri
Henri schrieb:
> So,> ich habe mir jetzt ein Programm geschrieben, was eigendlich klappen> sollte, aber das tut es nicht :D.
'Funktioniert nicht' ist die denkbar schlechteste Fehlermeldung, die man
sich vorstellen kann. Die erzählt einem Helfenden nämlich .... gar
nichts.
> Lcd "start Mainproga."> Waitms 2000> Loop Until A = 1
A wird am Anfang auf 0 gesetzt und ich sehe bis hierher keine
Möglichkeit, wie A jemals seinen Wert ändern können sollte.
Wie also stellst du dir vor, dass A hier jemals 1 werden könnte, damit
diese Loop-Until Schleife jemals verlassen werden kann?
Dein Hauptfehler: Du schreibst zuviel Code auf einmal ohne ihn zu
testen. Drum stehst du dann am Ende mit viel Code da, der nicht
funktioniert und bei dem du keine Ahnung hast, wo du mit Fehlersuche
anfangen sollst.
Und nochwas: Gewöhn dir die GOTO wieder ab. Die sind kontraproduktiv,
weil sie deine Denkweise in die falsche Richtung leiten. Deine Mittel um
ein Programm aufzubauen sind die strukturierten Mittel
1
if then
2
else
3
end if
4
5
6
do
7
loop
8
9
10
loop
11
until
12
13
for
14
next
Das sind deine Bausteine, aus denen du deine Logik zusammensetzt. Diese
Bausteine sind unteilbar und können auch ineinander geschachtelt werden.
Aber jeder Baustein wirkt wie eine Klammer, die die Einzelteile
zusammenhält
1
+- if then
2
|
3
| +-- do
4
| |
5
| +-- loop
6
|
7
+- else
8
|
9
| +- for
10
| |
11
| | +- if then
12
| | |
13
| | +- endif
14
| |
15
| +- next
16
|
17
+- end if
Diese Klammern dürfen sich nie überkreuzen, können aber ohne weiteres
ineinander geschachtelt sein.
So etwas
1
Do
2
If Taster1 = 0 Then 'Startet Hauptprogramm
3
Debounce Taster1 , 0 , Incr_a , Sub 'Entprellen des Taster, wenn der Port auf 0 gezogen wird
4
Loop
5
End If
kann daher überhaupt nicht sein. Deine Struktur wäre
1
+- Do
2
| +- If Taster1 = 0 Then
3
| | Debounce Taster1 , 0 , Incr_a , Sub
4
+----- Loop
5
+- End If
und das wiederspricht dem Gedanken, dass die Bausteine ineinander
geschachtelt sind. Auch durch Einrücken des Codes sieht man solche Dinge
sehr deutlich, darum solltest du es auf jeden Fall machen!
1
Do
2
If Taster1 = 0 Then
3
Debounce Taster1 , 0 , Incr_a , Sub
4
Loop
5
End If
Das Loop steht unter dem öffnenden Do. Das End If unter dem öffnenden
If. Aber die Einrückungstiefen kreuzen sich.
1
Do
2
If Taster1 = 0 Then
3
Debounce Taster1 , 0 , Incr_a , Sub
4
End If
5
Loop
So wäre es richtig. Wieder steht das schliessende Loop unter dem
öffnenden Do und das schliessende End If unter dem öffnenden If. Aber
mit jedem Öffnen geht es 2 Leerzeichen nach rechts und mit jedem
SChliessen geht es wieder 2 Leerzeichen nach Links und am Ende steht
alles sauber untereinander ohne dass sich die Bereichsklammern irgendwo
überkreuzen. Und das wunderbare daran: man sieht sofort wer von wem
abhängt, wer wen steuert. Das Debounce wird nur dann gemacht, wenn
Taster1 0 war. Und das ganze ist eingebettet in eine Schleife, die von
nichts abhängt, also eine Endlosschleife ist. Zusammengenommen also: Für
immer und Ewig wird gemacht: Wenn Taster1 jemals auf 0 geht, dann wird
ein Debounce gemacht.
Programmieren ist mehr als nur ein paar magische Worte hinschreiben und
darauf bauen, dass sich schon alles von alleine irgendwie zum guten
wendet. Wenn du die Logik nicht hinkriegst, BASCOM machts auf keinen
Fall. Das führt nur aus.
Entschuldigung das wollte ich nicht. Ich versuche mein Fehler diesmal
besser zu schreiben. Ich habe mein listing erstmal gekürzt und auch
versucht zu testen.
$regfile = "attiny2313.dat"
$crystal = 3686400
'////Portx/Pinx/Variablen konfigurieren////
Config Pind.6 = Input
Pind.6 = 1 'Pullup
aktivieren
Taster1 Alias Pind.6 'Taster zum
ansteuern der Led1
Config Portb.0 = Output
Led1 Alias Portb.0 'Led1 (grün)
'////LCD////
Config Lcd = 16 * 2
Config Lcdbus = 4
'LCD im 4Bit I/0 Modus
Config Lcdpin = Pin , Db4 = Portd.0 , Db5 = Portd.1 , Db6 = Portd.2 ,
Db7 = Portd.3 , E = Portd.5 , Rs = Portd.4
'LCD löschen
Cls
'////Listing "Einführung"////
Cursor Off 'Cursor aus
Cls 'LCD wird
gelöscht
Waitms 100
Locate 1 , 1
'Einführungsanzeige 1
Lcd "LCD Display ON"
Locate 2 , 1
Lcd "Bascom AVR"
Waitms 2000
Cls 'LCD wird
gelöscht
Waitms 100
Locate 1 , 1
'Einführungsanzeige 2
Lcd "Press T1 to"
Locate 2 , 1
Lcd "start Main"
Do
If Taster1 = 0 Then 'Startet
Hauptprogramm
Led1 = 1
Else
Led1 = 0
Cls
Waitms 100
Loop
End If
End
So, mein Problem ist, dass das der Taster irgendwie immer gedrückt ist.
Die erste Displayanzeige bleibt 2000ms im Display so wie es auch soll,
aber danach sollte die zweite Displayanzeige eigendlich so lange
angezeigt werden, bis ich den Taster drücke.
Aber die zweiter Anzeige sehe ich nur ganz kurz und das Display zeigt
wieder die erste Anzeige.
Die led leuchtet nach dem ersten druchlauf auch, so muss es ja auch,
aber mein Taster ist irgendwie immer gedrückt und ich weiß nich warum.
Meine Vermutungen sind, dass es vill. an dem PortB liegt(Habe vorher mit
dem PortD einfache taster schaltungen gemacht und da klappte alles, aber
den portd brauche ich ja für das display), oder das ich Ihn falsch
konfiguriert habe.
Ich hoffe das reicht als Fehlerbeschreibung.
Gruß,
Henri
Sry, habe deinen erweiterten Betrag erst nacher gelesen. Danke, der hat
mir jetzt schon geholfen. Ich habe mein Programm dem schon angepasst.
Gruß,
Henri
Hallo Henri,
was hast du denn sonst noch alles an portb? Bekanntlicherweise liegt
dort ja die ISP-Schnittstelle des Controllers.
Wie ist denn dein Taster verschaltet? Ist der gegen GND ode gegen Vcc?
Lass mal die "Alias" anwesungen weg und probier es dann mal! Hatte ich
schon aft genug, dass das deswegen nicht funktionieren wollte. Außerdem
hast du deinen Taster nicht entprellt oder ist der mit Hardware
entprellt?
Karl Heinz:
Wenn du dir den Code nochmal anschaust, gibt es den Sub Incr_a da wird A
bei jedem aufruf um 1 hoch gezählt. Der aufruf erfolgt über debounce.
Grüße
Tobi
> ... Außerdem hast du deinen Taster nicht entprellt oder ist der mit> Hardware entprellt?> ... (ein paar Zeilen weiter:)> Der aufruf erfolgt über debounce.
Was nun, nicht entprellt oder Debounce ??
Was ist debounce denn sonst, wenn es nicht Entprellung ist?
Lösung in ASM: Dannegger-Entprellung im Hintergrund (Timer-Int.), in der
Mainloop in Abhängigkeit vom Tastenflankenflag (Bit in Key_press) Bit im
Merker (oder I/O) kippen/toggeln. In Bascom etwas umständlicher, aber
nicht unmöglich. Mal im Roboternetz nach der Bascom-Umsetzung der
Dannegger-Entprellung suchen, da gibt es neben einer cleveren Routine
allerhand Hintergrundwissen zu diesem Thema.
...
To W. schrieb:
> Wenn du dir den Code nochmal anschaust, gibt es den Sub Incr_a da wird A> bei jedem aufruf um 1 hoch gezählt. Der aufruf erfolgt über debounce.
Ach.
Dann schau dir noch einmal genau an, wo die loop - until Endlosschleife
ist und wo debounce zum ersten mal ins Spiel kommt.
So wie ich das sehe, sieht es ja wohl so aus, wenn wir mal den Code
etwas Einrücken
1
'////Listing "Einführung"////
2
3
Do
4
Cursor Off 'Cursor aus
5
6
Cls 'LCD wird gelöscht
7
Waitms 100
8
9
Locate 1 , 1
10
'Einführungsanzeige 1
11
Lcd "LCD Display ON"
12
Locate 2 , 1
13
Lcd "Bascom AVR"
14
Waitms 1000
15
16
Cls 'LCD wird gelöscht
17
Waitms 100
18
19
Locate 1 , 1
20
'Einführungsanzeige 2
21
Lcd "Press T1 to"
22
Locate 2 , 1
23
Lcd "start Mainproga."
24
Waitms 2000
25
26
Loop Until A = 1
und in dieser Schleife sehe ich beim besten Willen nicht, wie A jemals 1
werden könnte. Der debounce kommt erst in der nächsten Schleife :-)
Auch BASCOM ist nicht Excel, wo sich eine ausgeklügelte Logik darum
kümmert herauszufinden, in welcher Reihenfolge die Einzelteile
abgearbeitet werden müssen, damit sich ein Sinn ergibt.
Ahhhh, das war ein missverständnis! Ich dachte du beziehst dich auf
meinen Code. In dem code schnippsel den du zu letzt gepostest hast, ist
kein sub aufruf oder eine anweisung die a hochzählt.
Hannes:
auf welchen code beziehst du dich?
Ich tippe mal darauf das wir bzw. ich? an euch vorbei geredet habe.
sry!!
Gruß
Tobi
> Hannes:> auf welchen code beziehst du dich?
Mit meinen Antworten (bzw. Gegenfrage) beziehe ich mich auf die Texte,
die ich zitiert habe.
Betreffs Lösungsvorschlag beziehe ich mich auf keinen der hier
veröffentlichten Bascom-Codes, da ich diesen Programmierstil *) nicht
unterstütze.
Was meine ASM-Gedanken betrifft, beziehe ich mich auf Peter Danneggers
Bulletproof-Tastenentprellung (in der Codesammlung mal nach Bulletproof
suchen).
Die Umsetzung der Dannegger-Entprellung in Bascom ist aufgrund der
idiotischen Interrupt-Verwaltung von Bascom nicht ganz so einfach wie in
ASM oder C, daher beziehe ich mich auf den erwähnten Artikel im
Roboternetz, da ist es so schön erklärt (auch mit Hintergrundwissen), da
muss ich mir nicht für Dich persönlich die Finger wund schreiben. Er
(der Artikel) dürfte per RN-Suche mit Begriffen wie Tastenentprellung
und Dannegger zu finden sein.
*) Programmierstil:
Ich mag es nicht, wenn Programme Rechenleistung durch Zählen von Takten
im mehrstelligen Millisekundenbereich vertrödeln (Debounce, Entprellung
durch Warteschleifen), daher nutze ich grundsätzlich Tastenabfragen
durch zyklisches Pollen des/der Tastenports, das von einem Timer
synchronisiert wird. Diese Art der Tastenentprellung läuft quasi im
Hintergrund und braucht weit weniger als 1% der verfügbaren
Rechenleistung. Sie stellt dem Hauptprogramm (oder seinen Jobs) für jede
Taste zwei Merker (Boolean-Variablen) zur Verfügung, von denen einer
(der in Key_state) den entprellten Schaltzustand des Tasters anzeigt und
der andere (in Key_press) eine neue Flanke (Taster wurde seit dem
letzten Abarbeiten des Tastendrucks erneut gedrückt und evtl sogar
wieder losgelassen). Die Mainloop reagiert auf die Merker, indem sie
einen entsprechenden Job (Programmroutine) aufruft, der die zugehörige
Aktion ausführt und den Merker in Key_press löscht, da der Job ja
erledigt wurde.
...
Hi Henri,
cooler Code.
Jou das Display wird gleich wieder gelöscht.
Do
If Taster1 = 0 Then 'Startet
Hauptprogramm
Led1 = 1
Else
Led1 = 0
Cls ****** hier wird das Display gelöscht****
Waitms 100
Loop
ich hatte erstmal ein paar Fehler drin. Ich nehme mal an ,
vor Hauptprogramm ist ein '.
Häng mal in Zukunft den Bascode als Anhang an, lässt sich
schneller in der Sim nehmen.
Deine Portausgänge sind nicht geschickt gewählt, so ist bei den
Rowalt Board ein Max 232 drauf,der Port.D0 + Port D1 besetzt hält.
Auch wenn Du den Max. abgezogen hast, lass die Schnittstelle in
Ruhe, dann kannst Du für Fehlersuche mit den Befehl "Print" was
an den Computer senden.
liebe Profis:
der gute Mann hat sich doch ordentlich vorgestellt.
Vielleich ist das ein Schüler, waren ja Ferien.
Und immer SEIN Code verbessern, auch wenn der zu Anfang nicht gut
aus sieht.
Wigbert
Die Frage ist, will man immer und immer wieder mit Grundlagen kämpfen
müssen, sich bei jedem Projekt von neuem damit abplagen und viel Zeit
vergeuden, um es endlich eher schlecht als recht zum Laufen zu bringen?
Oder will man sich einmal richtig reinknieen und es dann für alle Zeiten
vom Tisch haben.
Fast alle Projekte benutzen Tasten zur Bedienung (Gehirne lassen sich
noch nicht anzapfen). Daher ist es äußerst effektiv, sich damit mal zu
beschäftigen und eine gute Lösung zu finden, die auch universell in
jedes Projekt einbindbar ist.
Der Debounce-Befehl in Bascom ist eine Lösung, hat aber deutliche
Seiteneffekte und kann daher den Programmablauf empfindlich stören. Ich
würde ihn daher nur als Notlösung bezeichnen.
Ehe Du also anfängst, komplexe Programme zu erstellen, solltest Du
erstmal Tastenabfragen verstehen.
Als erstes mach mal ne einfache Toggletaste, d.h. ein Tastendruck
schaltet die LED an, der nächste wieder aus usw. Jeder Tastendruck muß
den LED-Zustand wechseln, völlig egal, wie lange oder wie häufig
gedrückt wird.
Wenn das zuverlässig funktioniert, mach das für ne LED, die im
Sekundentakt blinkt (kein Druck darf verloren gehen).
Wenn das auch hinhaut, machs für 2 Tasten und 2 Blink-LEDs völlig
unabhängig voneinander.
Das mit den 2 LEDs hat den Sinn, zu verstehen, daß eine Mainloop
durchlaufen muß (sagt ja schon der Name: Loop), wenn eine Funktion grad
nix tut, d.h. Du darfst nicht an einer Stelle stehen bleiben. Damit läßt
sich die Mainloop bequem um viele weitere Funktionen erweitern, ohne die
bisherigen zu stören.
Viele, die meine Entprellfunktion benutzen, dürften dafür etwa 10min
brauchen.
Ich weiß, daß einige Probleme haben, meine Routine zu verstehen, ich bin
mir aber ziemlich sicher, keiner hats bereut.
Und sie funktioniert sogar, wenn man sie nicht versteht.
Man muß nur verstehen, wie man sie aufruft.
Peter
> Ich weiß, daß einige Probleme haben, meine Routine zu verstehen,
Ja, sie (zumindest die hocheffiziente ASM-Version) ist sooooo einfach,
dass es schon etwas Zeit kostet, sie zu verstehen.
> ich bin mir aber ziemlich sicher, keiner hats bereut.
Das ist wohl wahr...
...