PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Warteschleifen bei ATMEL



monoton
05.08.2004, 22:53
Hallo,
ich habe ein folgendes Problem. Ich soll bei der Verwendung des 1-Wire-Protokolls 0.25us warten Ist das möglich?

Ich verwende ein AT90S8515 getaktet mit 3.96 MHz.
Meiner Meinung nach braucht die Ausführung eines Befehles mehr als
0.25us. Oder irre ich ich doch?

Wenn es dennoch eine Möglichkeit besteht, wo finde ich ein Beispielcode
falls ein existiert?

MFG

monoton

P.S. Bitte seid freundlich...:-)

Gottfreak
05.08.2004, 23:32
Ein Takt dauert bei 3,96MHz 0,25252525(geht kein Periodenzeichen im Forum?)µS.
Ein NOP dauert also minimal(1,01010101%) zu lang.
Keine Ahnung, ob das in der Toleranz liegt.
Es gibt aber auch Quarze(und Oszillatoren) mit genau 4MHz. Damit würde es genau passen.

robs
06.08.2004, 11:55
Hallo,
ich habe ein folgendes Problem. Ich soll bei der Verwendung des 1-Wire-Protokolls 0.25us warten Ist das möglich?


Sollst Du genau 0.25us oder mindestens 0.25us warten?

robs

monoton
06.08.2004, 12:40
Hallo,
ich soll genau Timings von 0.25us erstellen.
In meinem C-Programm werden dann unterschiedliche Wartezeiten erstellt. Dieses ist vorgeschrieben um eine Kommunikation zu einem 1-Wire Slave herzustellen. Ich habe auch noch mal nachgelesen bei MAXIM Application Note 148, Guidlines for Reliable1-Wire Networks, dass die richtige Kommunikation besonders von dem richtigen Timing des Abtastens abhängig ist.
Da ich ein STK500 habe bin ich erstmals nur auf den 3,96MHz gelaufen. Jetzt werde ich mir noch einen externen Quarz 8MHz besorgen und das gleiche noch einmal ausprobieren. Ich überlege auch, ob ich nicht einen schnelleren MC kaufen sollte. Das wird sonst in meiner Anwerdung ein bisschen kritisch mit dem 1-Wire protokoll.

Wie hast du das Timing berechnet?
Ich brauche die Berechnung für 8MHz...
Hast Du angenommen, dass der MC mit 8MIPS läuft?

Ich muß nämlich eine Funktion schreiben, die genau in us warten kann.
Wie kann ich berechnen, wie lange die _delay_loop_2() oder _delay_loop_1() wartet?

Vielen Dank

Gottfreak
06.08.2004, 13:34
Wie lange die Loops von GCC warten, steht in der delay.h als Kommentar drin.
delay_loop_2 wartet 4 Takte
Bei 8MHz also 0,5 Takte (multipliziert mit dem Parameter, den du angibst)

Zum Berechnen des Timings:
Ein Takt dauert 1/Frequenz(Hz) Sekunden.
In der ApplicationNote zum Assembler steht drin, wie lange die einzelnen Befehle dauern(NOP dauert genau einen Takt und macht nichts).

monoton
06.08.2004, 14:26
Hallo,
vielen Dank. Ich muß mir also doch einen neuen Quarz kaufen.

Bei delay_loop_2 meinst Du sicherlich 0.5us und nicht Takte...

Du hast mir wirklich sehr geholfen. :)

Gottfreak
06.08.2004, 17:36
Bei delay_loop_2 meinst Du sicherlich 0.5us und nicht Takte...

richtig, da hab' ich mich vertan.

TillHoffmann
07.09.2004, 23:21
*altenThreadherauskram*
bei mir will der Kompiler einen Parameter für den Befehl _delay_loop_2 (?)
Welchen???

Gottfreak
08.09.2004, 01:15
Der Parameter ist der Faktor, mit dem die Wartezeit multipliziert wird(die Zeiten oben sind immer für _delay_loop_2(1). ).