Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

11

08.06.2010, 20:08

Wie Dot schon sagte, ein "Jump On Zero" entspricht deinem IF

Bsp.:

if(5 == variable)

entspricht

variable- 5
Jump On Zero

idontknow

unregistriert

12

08.06.2010, 20:31

So, folgendes Konzept jetzt, wäre nett wenns jemand überprüfen könnte:

Ich lege im externen Ram eine Tabelle an mit 100 Werten (Speicher Position: 0 - 99) damit ich keine Wurzelfunktion brauche.
Mein AD-Wandler liefert mir für meinen Schalter einen Digital Wert von 0-255.

Meine SPannweite in der die Motoren aus sind lege ich auf 54 fest. (Daraus ergibt sich utnere Hälfte 0-127, obere Hälfte 128-255)
D.h.: Schalter:
-Max. Stop! Max.
0 100| 54 |155 255

Jetzt gehts an die Berechnung. Folgende "Konstanten"-Adressen habe ich mir definiert:
Flag equ R4
ADSpeed1 equ 0h ; AD-Wandler eingelesene Geschwindigkeit, Interner Ram an Pos 0h
CalcSpeed1 equ 1h ; Berechnete Geschwindigkeit (0...100) an Pos 1h
Direction1 equ 3h

(Hier im Prinzip unnötig, aber der vollständigkeit halber nur mal kurz erwähnt:)
ADSpeed2 equ 4h
CalcSpeed2 equ 5h
Direction1 equ 6h

Jetzt gehts ans Berechnen, erstmal Pseudo Code:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
for(i = 100; i > 0 OR ADSpeed1 == i; --i)
{
    int a = ADSpeed1 - i;
    if(!a) ; a == 0
    {
       CalcSpeed1 = 100 - i;
       Direction1 = 0/1; //Muss ich erst abchecken ist erstmal unrelevant..
       Flag = 1;
    }
}

if(Flag)
    end.

for(i = 255; i > 155 OR ADSpeed1 == i; --i)
{
    int a = ADSpeed1 - i;
    if(!a) ; a == 0
    {
       CalcSpeed1 = i - 155;
       Direction1 = 0/1; //Muss ich erst abchecken ist erstmal unrelevant..
       Flag = 1;
    }
}

if(!Flag)
   CalcSpeed1 = 0;


Das war der Pseudocode zum berechnen, Assembler kommt noch.
Jetzt das ganze in ne anständige Zahl umwandeln, die ich in meine PWM-Register packen kann!!

Quellcode

1
2
// PWM Register-Werte stehen im externen Rom an stelle 0-99!
int pwm_reg_val = PWM_REG_VALUES[CalcSpeed1];


Die Schleifen sind so weil ich sie Assembler bedingt andersrum umsetzen muss..

Tobiking

1x Rätselkönig

  • Private Nachricht senden

13

08.06.2010, 21:37

Das < und > kann man (zumindest bei vorzeichenlosen Zahlen) auch recht einfach kriegen. Man rechnet Variable - Zahl und wenn ein Unterlauf auftritt, dann war Zahl größer. Das sollte man, wenn ich mich nicht irre, über das Carry Flag kriegen. Und dafür gibt es auch den Sprungbefehl JC (Jump if Carry) bzw. JNC (Jump if not Carry).

14

08.06.2010, 22:25

Kann man bei deinem ASM ein unsigned Byte (0 bis 255) auch als signed Byte (-126 bis 127) verwenden?
Dann musst du nur das negativ Flag prüfen um die Richtung zu wissen.

Um den negativen Bereich positiv zu bekommen kannst du ja das Flag setzen (falls möglich) oder mit 100000000 per UND verknüpfen.


Wenn der Grenzwert +-5 sein soll müsstest du von deinem positiven Wert 5 Abziehen und einen Sprung bei Negativ Flag oder bei 0 ausführen.

BurningWave

Alter Hase

Beiträge: 1 106

Wohnort: Filderstadt/Konstanz

Beruf: Student

  • Private Nachricht senden

15

08.06.2010, 22:28

@chriss:
Nein, das geht nicht, das ist einfach ein Register, das aus einem Byte besteht. Man kann in Gedanken eben sagen, dass alles, was unter einem bestimmten Wert ist, "negativ" ist.

idontknow

unregistriert

16

09.06.2010, 08:23

hmm ,laut der Seite gibts im Programm Status Word PSW nen Overflow Flag, das genau bei sowas gesetzt wird.
Aber habs jetzt glaube ich schon anderst gelößt ^^

Werd das ganze mal in ASM umschreiben und schaeun ob der COmpiler das schluckt =)

Werbeanzeige