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.
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
Geändert von Siro (28.09.2015 um 22:19 Uhr)
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.
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
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
Geändert von Siro (30.09.2015 um 08:24 Uhr)
Lesezeichen