-
wie gesat, in C für Controler bin ich net ganz fit und kann nur erahnen was da passiert.
Bei mir ist jeder Poti an einem ADC Pin von 0 bis 3 verunden (logisch).
Die werden in der langen LOW Phase gewandelt und in den Ramadressen 108 - 111 abgelegt.
Jetzt muss ja nicht der Wert vom Pin 0 bis 3 zunehemen - kann ja auch wild durcheinander sein. Also sortier ich sie.
Dabei kommt in die Adresse 100 der kleinste und in 101 der zu dem Wert gehörige Kanal. Diesen kann ich aus der Höhe der Ramadresse ableiten, wo ich den kleinsten Wert gefunden habe. Dann wird diese Adresse mit 255 überschrieben, denn aufgrund meiner Schaltung kann der ADC höchstens 250 sein.
Das passiert dann bis Adresse 107. Wert - Kanal - Wert - Kanal - Wert - Kanal - Wert - Kanal -
Jetzt muss ich schauen, ob es selbe Werte gibt.
Ich lade also den kleinsten Wert und vergleiche ihn mit dem nächsten. Ist er gleich addiere ich noch die Kanäle - die sollen ja dann auch zur selben Zeit ausgeschaltet werden. Diese landen in den Adressen 108 - 115
Nun kommt ein HIGH mit dem Offset 1ms und danach fange ich an die Adressen 108 bis 115 zu laden. Das dauert solange, bis alle PINs LOW sind.
Hier mal der Ker des Programmes, im Simulator des AVR Studio sieht man an den Registern 0 bis 15 ganz gut, was ich meine:
Code:
.include "m8def.inc"
.def tmp = r16
.def lowe = r17
.def lowz = r18
.def highe = r19
.def merker = r20
.def konst = r21
.def pin = r22
.def xlow = r26
.def xhigh = r27
.def ylow = r28
.def yhigh = r29
.def zlow = r30
.def zhigh = r31
ldi xlow,108
ldi lowe,20 ;PIN0 => WENN 1 => BYTEWERT = 1
st x+,lowe
ldi lowe,30 ;PIN1 => WENN 1 => BYTEWERT = 2
st x+,lowe
ldi lowe,30 ;PIN2 => WENN 1 => BYTEWERT = 4
st x+,lowe
ldi lowe,10 ;PIN3 => WENN 1 => BYTEWERT = 8
st x,lowe
ldi konst,4
ldi xlow,100
ldi ylow,108 ;von 108 bis 111 (112)
add ylow,konst ;von 112 bis 116
ldi tmp,1
st y+,tmp
ldi tmp,2
st y+,tmp
ldi tmp,4
st y+,tmp
ldi tmp,8
st y+,tmp
subi ylow,8
ldi zlow,108
ldi lowe,255
schleife2:
schleife1:
ld lowz,y
cp lowe,lowz
brlo istkleiner
mov lowe,lowz
mov zlow,ylow
istkleiner:
inc ylow
cpi r28,112
brlo schleife1
add r30,konst ;0b10000000 => Bereich 136 bis 139
ld merker,Z ;dort ist der PIN Wert gespeichert
subi r30,4
st x+,lowe
st x+,merker
ldi lowe,255
st z,lowe
ldi ylow,108
ldi zlow,108
cpi xlow,108
brlo schleife2
ldi r26,100
ld r0,x+;100 zyclus
ld r1,x+;101 pin
ld r2,x+;102
ld r3,x+;103
ld r4,x+;104
ld r5,x+;105
ld r6,x+;106
ld r7,x+;107
ldi r26,100
ldi r30,108
ldi tmp,0
sorten:
ld lowe,x+
st z+,lowe
ld pin,x+
add pin,tmp
mov tmp,pin
st z+,pin
ld lowz,x
cp lowz,lowe
brne diff
dec r30
dec r30
rjmp gleich
diff:
ldi tmp,0
gleich:
cpi r26,108
brne sorten
ldi r26,108
ld r8,x+;100 zyclus
ld r9,x+;101 pin
ld r10,x+;102
ld r11,x+;103
ld r12,x+;104
ld r13,x+;105
ld r14,x+;106
ld r15,x+;107
nop
nop
nop
-
Stimmt, keine Ahnung, warum ich die Dinger sortiere...muss nicht sein^^
Ah, ja doch, da war was. Mein Gedanke war, das während der min. 18ms die meiste Zeit ist. Während ich die Pins LOW setzte, muss das Prog nichts machen, außer die Zeiger auf den nächsten Wert und Pin hochzuzählen. Angenommen, man würde die Auflösung stark erhöhen, währe das eine gute Möglichkeit in der zeitkritischsten Phase möglichst schnell zu sein.
Für meine 8 BIT natürlich zu kompliziert.
-
Ohhhh Man (auf deutsch Ohhhh Mannnn),
ich glaub, ich versteh Dich jetzt. Vermutlich. Du willst wohl in den aktiven Phasen die Servo-Rampen (1..2 ms) HINTEREINANDER ausgeben ! ? Um die Belastung der Stromquelle zu verringern? Aber dazu bräuchtest Du doch nix zu sortieren.
ICH guck in meinem Programm in der ISR nach, ob der (irgendein) Port an ist - und dann KÖNNTE ich NUR DIESEN EINEN Port bedienen, bis die Rampe aus ist ( - ich habe es aber so gelöst, dass ich alle Rampen gleichzeitig anknipse, und dann je nach Anforderung an die Länge abschalte) . Danach käme der nächste Port in der Reihe dran. JEDER in einer beliebigen zeitlichen Rampenlänge und in beliebiger Reihenfolge. Und das mach ich am tiny13 (aber ich hab keine vier Potis dran, weil ich ja nur fünf Pinne zum Datentransfer habe - na ja, sechs gingen mit dem notRES).
>>> MERKE <<< Fauhlheit ist eine der Wurzeln innovativen Arbeitens =D>