- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Ergebnis 1 bis 6 von 6

Thema: berechnen der durchläufe einer Verzögerungsschleife

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    10.09.2006
    Beiträge
    5

    berechnen der durchläufe einer Verzögerungsschleife

    Anzeige

    Praxistest und DIY Projekte
    Hallo,

    Ich rätsel schon ein weilchen rum, wie ich rausbekomm wie weit meine verzögerungsschleifen zählen müssen damit ich ungefähr eine sekunde wartezeit erreiche. Ich hab einen atmel mega32 mit 16mhz quartz also entsrechen einer sekunde 16 Millionen schritte, klar.

    Ich hier ist mein code bis jetzt.

    Code:
    .include "m32def.inc"
    
    reset:
    
    ldi r16,255
    ldi r17,00
    out ddrc,r16
    
    
    start:
    
    
    ;ldi r21,0
    ;ggausen:
    
    
     ldi r18,0
     ganzausen:
    
      ldi r19,0
      ausen:
    
       ldi r20,0
       innen:
    
        out portc,r16
    
    
        inc r20
        cpi r20,76
        brlo innen
    
      inc r19
      cpi r19,76
      brlo ausen
    
     inc r18
     cpi r18,76
     brlo ganzausen
    
    ;inc r21
    ;cpi r21,4
    ;brlo ggausen
    
    
    ;ldi r21,0
    ;ggausen2:
    
    
     ldi r18,0
     ganzausen2:
    
      ldi r19,0
      ausen2:
    
       ldi r20,0
       innen2:
    
        out portc,r17
    	
    
        inc r20
        cpi r20,76
        brlo innen2
    
      inc r19
      cpi r19,76
      brlo ausen2
    
     inc r18
     cpi r18,76
     brlo ganzausen2
    
    ;inc r21
    Mein Lösungsansatz zur Rechnung ist ganz klar falsch, ich poste ihn trotzdem, vielleicht ists ja nur ein kleiner fehler.

    16000000 = 4*3*3*n^3

    weil:
    16 Mio Takte pro sekunde
    4 Schritte in der inneren schleife, je 3 in den äuseren
    n ist die Anzahl mit welcher die schleifen wiederholt werden, und davon gibt es ja 3.

    16 Mio werden durch 36 geteilt, aus dem Ergebnis zieh ich die 3. Wurzel und hab dann n = ca.76.

    Der wert ist deutlich zu niedrig.


    Ich hoffe ich hab meine Erklärungen oder wenigstens die Frage verständlich formuliert. Für mein problem gibt es bestimmt eine Standartlösung.

  2. #2
    Neuer Benutzer Öfters hier
    Registriert seit
    10.09.2006
    Beiträge
    5
    ich seh gerade dass der code nicht ganz drauf passte, ist aber egal, im ersten teil werden die leds auf einem rncontroll ausgeschallten im 2. angeschalten, die beiden teile sind bis auf 1 register und die sprungmarken identisch

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    26.08.2006
    Beiträge
    84
    Hi!

    Nicht jeder Befehl brauch 1 Takt. Welcher wieviel Takte braucht steht im Datenblatt des ATMega unter "Instruction Set Summary".

    Auch kannst du im AVRStudio dem Ding bei der Arbeit zuschaun. Nach dem Build auf den Play Button oben in der Mitte klicken. Im linken Fenster gibts dann nen Punkt "Processor", den aufklappen (das Plus) und "Cycle Counter" anschaun. Paar Punkte drunter gibs die "Stop Watch" (kann man mit rechtsklick drauf auf 0 setzen). F11 geht im Programm nen Schritt weiter, F5 läuft bis zum nächsten Breakpoint (im CodeEditor Rechtsklick, dann toggle Breakpoint). Wenn du im Simulator noch auf 16MHz umstellst, kannst so ohne nachzählen auf genau 1s kommen (im Notfall noch rausfinden, was NOP is).

    Zumindest kannst du im Simulator schön zusehn, wo du falsch gerechnet hast.

    Möge der Code mit dir sein.

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    10.09.2006
    Beiträge
    5
    genial, ist ne feine sache, das freut mich richtig, dankeschön. kann ich aber nicht irgendwie trotzdem manuell auf die durchläufe je schleife kommen?

  5. #5
    Erfahrener Benutzer Roboter Genie Avatar von robocat
    Registriert seit
    18.07.2006
    Beiträge
    935
    ich habe hier sowas für eine 1s verzögerung bei 1MHz:
    Code:
       ldi      r17,   0x09      ; delay loop, 1Hz 
    WGLOOP0:  
       ldi      r18,   0xBC 
    WGLOOP1: 
       ldi      r19,   0xC4 
    WGLOOP2: 
       dec      r19 
       brne   WGLOOP2 
       dec      r18 
       brne   WGLOOP1 
       dec      r17 
       brne   WGLOOP0 
       nop
    9*BC*C4+1(hex)=331633(dez), ich rechne mit 3 zyklen (load, decrement, branch) pro schleifendurchgang. man kommt halbwegs genau auf 1s delay.

    hier gibt es einen delay-loop-rechner als win32 proggie:
    http://www.ckuehnel.ch/Download/AVRdelayloop.zip

    gruesse

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    10.09.2006
    Beiträge
    5
    interessant, ich denk meine frage ist dann geklärt, vielen dank

Berechtigungen

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

Solar Speicher und Akkus Tests