-         
Seite 3 von 3 ErsteErste 123
Ergebnis 21 bis 23 von 23

Thema: Zeitverögerung im ms Bereich

  1. #21
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    12.06.2006
    Beiträge
    474
    Anzeige

    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

  2. #22
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    12.06.2006
    Beiträge
    474
    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.
    Chuck Norris kann Windows Vista auf einem Atmel in Assembler implementieren!
    Chuck Norris coded mit 3 Tasten:"1","0" und "compile"

  3. #23
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.373
    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>
    Ciao sagt der JoeamBerg

Seite 3 von 3 ErsteErste 123

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •