PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Nur der erste "NOP" braucht 2 Taktzyklen



Siro
28.09.2015, 19:29
Ich habe eben ein SEHR komplexes Programm geschrieben :)

Bit setzen
Bit löschen
Bit setzen
Bit löschen

wollte mal schauen wie schnell das geht.

Bei meinem, mit internem 8MHz Oszillator getakteten PIC, sind das 500ns High dann 500ns Low.
Völlig okay. Durch die 4 stufige Pipline werden also 4 Quarztakte a 125ns benötigt.

Nun habe ich ein NOP zwischen die Zeilen gesetzt in der Annahme, nun müste mein Signal 1us High dann 1 us Low sein.

GP0 = 1;
NOP();
GP0 = 0;
NOP();
GP0 = 1;
NOP();
GP0 = 0;
NOP();

Aber zu meinem Erstaunen sind die Signale nun 1,5us lang.
Also braucht der NOP 1us und nicht 500ns

Dann habe ich 2 NOPs eingebaut und nun habe ich rechnerisch 1,5us aber mein Ossi zeigt 2us
Hier hat also der erste NOP 1ms und jeder weitere 500ns ????

Ich hab das in "C" codiert und mir den Assemblercode angesehen.
Da wurde nix eingefügt von wegen Banklselect oder ähnlichem vom Compiler.
Das ist absolut 1 zu 1 Assembler

bsf GPIO0,0
NOP
bcf GPIO0,0
NOP

usw.

Hat dafür jemand eine Erklärung.

Achja, es handelt sich momentan um den PIC12F683

Siro

Die ersten beiden Signale auf dem Ossibildern sind ohne NOPs, die nachfolgenden mit NOP

PicNick
29.09.2015, 16:33
Hm, da fällt mir nur ein, die Doku zu lesen, wo jeder Befehl dokumentiert ist + die Zyklen, die er braucht. Und obs sonst irgendwas zu beachten gibt.

Siro
29.09.2015, 23:26
Das Problem ist gelöst.

Ich habe eben das Programm direkt in Assembler geschrieben und siehe da, es funktioniert alles richtig.
Das Timing stimmt.

Dann hab ich es wieder in C geschrieben und mir den Assemblercode nochmals genauer angesehen.

Wenn ich NUR Portzugriffe mache, wird dies 1 zu 1 mittels bcf und bsf in Assembler umgesetzt.
Wenn ich aber einen NOP() mit einbaue, dann erzeugt der C-Compiler hinter einem NOP einen zusätzliches Bankselect Befehl.
Gibt zwar keinen Sinn, aber so macht er es eben ;) da sind dann meine zusätzlichen 500 Nanosekunden.

Also muss ich mich selbst revidieren, er erzeugt doch einen BANKSELCT, den ich uebersehen habe.
Siro