mikrocontroller.net

Forum: Compiler & IDEs Assambler delayschleife in C code


Autor: Florian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, ich habe eine Bitte.
Ich kenne mich mit Assembler überhaut nicht aus und bin froh das ich 
meine Sachen in C so einigermaßen hin bekomme. Aber ich brauche eine 
sehr genaue delay Funktion, in der ich einfach eine gewisse Anzahl von 
Takten warte.

Die Schleife habe ich mit dem "AVR delay loop Generator" erstellt. Nur 
ist der Code noch nicht ganz so wir ich ihn bräuchte.
Die Funktion muss flexible sein. Ich habe ein Array in dem delaywerte 
steht. Der ausgewählte Wert muss an die Schleife gegeben werden. Aber 
wie mach ich das und wie bekomme ich den Assamblercode in mein C code?

Ich stelle mir das grob so vor:
(das es so nicht geht ist mir klar)

uint16_t wait;
uint16_t array[99]
wait = array[i];
while ( !(PINB & (1 << PB0)) ) ;


//das hat der generator erzeugt und soll nun irgenwie da rein. 

; ============================= 
;    delay loop generator 
;     452 cycles:
; ----------------------------- 
; delaying 450 cycles:
          ldi  R17, $96
WGLOOP0:  dec  R17
          brne WGLOOP0
; ----------------------------- 
; delaying 2 cycles:
          nop
          nop
; ============================= 

PORTB |= (1 << PB1);
PORTA &= ~(1 << PB1);


Könnt mir vieleicht jemand behilflich sein? Das ist für euch bestimmt 
keine Herausforderung, oder?

Mfg
Florian

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Florian wrote:
> Hallo, ich habe eine Bitte.
> Ich kenne mich mit Assembler überhaut nicht aus und bin froh das ich
> meine Sachen in C so einigermaßen hin bekomme. Aber ich brauche eine
> sehr genaue delay Funktion, in der ich einfach eine gewisse Anzahl von
> Takten warte.

Wenns Taktgenau sein muss, dann nimm einen Timer und betreibe ihn
im CTC Modus.

Ansonsten: Wenn die exakte Zeit nicht ganz so kritisch ist,
dann benutze die _delay_ms Funktion aus <avr/delay.h>.
Aber Achtung: Diese Funktion hat Einschränkungen, was die
maximale Zeit anbelangt. Ist im Header File dokumentiert,
also unbedingt da rein schauen.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.