-
        

Ergebnis 1 bis 3 von 3

Thema: Nur der erste "NOP" braucht 2 Taktzyklen

  1. #1
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    05.11.2007
    Ort
    Berlin
    Beiträge
    524

    Nur der erste "NOP" braucht 2 Taktzyklen

    Anzeige

    SMARTPHONES & TABLETS-bis zu 77% RABATT-Kostenlose Lieferung-Aktuell | Cool | Unentbehrlich
    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
    Miniaturansichten angehängter Grafiken Miniaturansichten angehängter Grafiken 2000ns.jpg   1500ns.jpg  
    Geändert von Siro (28.09.2015 um 22:19 Uhr)

  2. #2
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    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.

  3. #3
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    05.11.2007
    Ort
    Berlin
    Beiträge
    524
    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)

Ähnliche Themen

  1. "alter Opa" braucht Hilfe.... Fritz!Box NAS-Mediaserver usw...
    Von oderlachs im Forum Offtopic und Community Tratsch
    Antworten: 6
    Letzter Beitrag: 02.01.2015, 12:54
  2. [ERLEDIGT] Problem: Erste "Inbetriebnahme" eines Atmega168
    Von schorsch_76 im Forum AVR Hardwarethemen
    Antworten: 2
    Letzter Beitrag: 21.04.2012, 17:13
  3. Ämfänger braucht hilfe "Byte nach BCD auf Portx"
    Von dremeier im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 10
    Letzter Beitrag: 07.09.2008, 17:03
  4. Antworten: 10
    Letzter Beitrag: 22.03.2007, 14:03
  5. Ein "fremdlig" braucht hilfe! (PC Interface) Licht
    Von kusu im Forum Controller- und Roboterboards von Conrad.de
    Antworten: 1
    Letzter Beitrag: 22.12.2004, 10:14

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •