AVR Studio, Schleifenoptimierung 17,18

Gast #4024194
Lesenswert?
• ▲
▼
Hallo,

Ich versuche gerade im AVR-Studio C++ auf einem AtXmega eine schleife 
zur Verzögerung von ca 1us zu Programmieren.
Problem ist, dass wenn ich in
1
  for(int i=0;i<18;i++)
2
  {
3
    ;
4
  }
i bis 17 Zählen lasse, dies etwa 2,3us dauert.
setze ich
1
i<17
 so sind es nur noch 80ns.

Wenn man
1
for(int i=0;i<13;i++)
2
{
3
  for(int i=0;i<17;i++)
4
  {
5
    ;
6
  }
7
}
setzt bleiben es 80ns;

Hier scheint eine Potimierung am Werk zu sein, die Schleifen <18 einfach 
weglässt.
Wie wird sie abgeschaltet?
1
int readbit()
2
{
3
  PORTF.DIRSET=0x04;  //1 = setzen     --> Ausgang
4
  PORTF.OUTCLR=0x04;  //1 = Rücksetzen --> 0
5
  for(int i=0;i<18;i++)
6
  {
7
    ;
8
  }
9
  PORTF.OUTSET=0x04;  //1 = Setzen --> 1
10
  PORTF.DIRCLR=0x04;  //1 = Setzen --> Eingang
11
  if(PORTF.IN&0x04)
12
  {
13
    PORTF.DIRSET=0x04;  //1 = setzen     --> Ausgang
14
    PORTF.OUTSET=0x04;  //1 = Rücksetzen --> 0
15
    return(1);
16
  }
17
  else
18
  {
19
    PORTF.DIRSET=0x04;  //1 = setzen     --> Ausgang
20
    PORTF.OUTSET=0x04;  //1 = Rücksetzen --> 0
21
    return(0);
22
  }
23
}
Gast #4024251
Lesenswert?
• ▲
▼
Ich nutze nun die delay.h und habe sie so eingebunden:

    #include <util/delay.h>
    #define F_CPU 32000000UL  // 32 MHz
1
int readbit()
2
{
3
  PORTF.DIRSET=0x04;  //1 = setzen     --> Ausgang
4
  PORTF.OUTCLR=0x04;  //1 = Rücksetzen --> 0
5
  _delay_us(1);
6
  PORTF.OUTSET=0x04;  //1 = Setzen --> 1
7
  PORTF.DIRCLR=0x04;  //1 = Setzen --> Eingang
8
  if(PORTF.IN&0x04)
9
  {
10
    PORTF.DIRSET=0x04;  //1 = setzen     --> Ausgang
11
    PORTF.OUTSET=0x04;  //1 = Rücksetzen --> 0
12
    return(1);
13
  }
14
  else
15
  {
16
    PORTF.DIRSET=0x04;  //1 = setzen     --> Ausgang
17
    PORTF.OUTSET=0x04;  //1 = Rücksetzen --> 0
18
    return(0);
19
  }
20
}

Der Portpin wird jedoch nur für 80ns zurückgesetzt.
Wenn ich _delay_us(10) mache, sind es etwa 300ns.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.