-         

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 12

Thema: 8bit Zahl seriell ausgeben...

  1. #1
    flown
    Gast

    8bit Zahl seriell ausgeben...

    Anzeige

    Hallo zusammen,

    ich arbeite gerade an einem Projekt, 8bit Zahlen seriell über den PortA ausgeben muss.
    Ich arbeite mit einem PIC18F452 mit einem 10MHz Oszi und habe die PLL aktiviert, das heisst also mit 40MHz (10MHz effektiv).

    Mit meinem Code komme ich gerade auf lächerliche 200kHz und interessant wäre da schon um die 1MHz.
    1MHz wäre nähmlich die max. Übertragungsgeschwindigkeit zu dem Endgeräte. (500ns Datenvorbereitung und 500ns Clockimpuls)
    Deshalb auch die NOPs im code

    Ich hoffe ihr könnt mir da mal Tips geben wie ich mein Prog schneller machen kann.

    Vielen Dank schon im voraus

    Hier noch mein Quellcode

    bitmask --> muss zuerst den msb ausgeben darum '10000000'
    writeBlock --> ist die 8bit zahl welche ich ausgeben muss
    setData ist deklariert als bit
    PIC_OUTPUT_RF_DATA ist fix gegeben durch PORTA RA2
    PIC_OUTPUT_RF_CLK1 ist fix gegeben durch PORTA RA1

    int i;
    UINT8 bitmask = 0x80;
    for(i = 0 ; i < 8 ; i++ )
    {
    if((writeBlock & bitmask) == bitmask)
    {
    setData = 1;
    }
    else
    {
    setData = 0;
    }

    PIC_OUTPUT_RF_DATA = setData;
    asm(" NOP");
    asm(" NOP");
    asm(" NOP");
    asm(" NOP");
    asm(" NOP");
    asm(" NOP");
    asm(" NOP");
    asm(" NOP");
    asm(" NOP");
    asm(" NOP");
    asm(" NOP");
    asm(" NOP");
    PIC_OUTPUT_RF_CLK1 = 1;
    writeBlock <<= 1;
    PIC_OUTPUT_RF_CLK1 = 0;
    }

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    08.08.2004
    Ort
    Zwolle
    Alter
    61
    Beiträge
    531
    Hallo,

    Bei 10MHz daurt einen instruction 100ns. So eine NOP daurt auch 100ns.

    so bei

    clock-ausgang hoch
    NOP
    NOP
    NOP
    NOP
    clock-ausgang niedrich

    daurt die clockpuls genau 500ns

    dass 'for(i = 0 ; i < 8 ; i++ ) '

    duart offensichtlich viel zu lange

    ich weiss nicht wie dein compiler ein INTEGER interpretiert, vielleicht wie ein 16-bit variable, besser du nutzt fur 'i' ein 'char' oder 'unsigned char' denn diess ist immer 8-bit und beim hochzahlen von 0 bis 8 braucht nur eine byte addiert zu werden statt zwei bytes. Damit wird dass program schon scheller.

    Vielleicht hilfts

    gruss

    Henk

  3. #3
    flown
    Gast
    Bin nun einwenig weitergekommen:

    if( writeBlock & 0x80 )
    {
    PIC_OUTPUT_RF_DATA = 1;
    }
    else
    {
    PIC_OUTPUT_RF_DATA = 0;
    }
    asm(" NOP");
    asm(" NOP");
    PIC_OUTPUT_RF_CLK1 = 1;
    asm(" NOP");
    asm(" NOP");
    asm(" NOP");
    asm(" NOP");
    PIC_OUTPUT_RF_CLK1 = 0;

    dieser block mache ich 8 mal (für jedes bit einmal)
    Jetzt bin ich bei einer Geschwindigkeit von ca 600kHz.

    Nun ein Bit beim Pic zu setzten dauert genau eine Clockperiode.
    Das if else braucht 6 Clockperioden

    Damit ich auf 1MHz kommen würde müsste ich logischerweise das ganze in Assembler schreiben und die NOP's mit zwischenblöcken des nächsten IF, else Blockes auffüllen. So mache anstelle der nops schon das nächste IF ELSE und so würde ich auf die 1MHz kommen, aber leider bin ich nicht so gut in Assembler das ich ein IF in verschiedene Blöcke teilen kann respektive weiss nicht ob dies überhaupt möglich ist

    Vielen Dank schon im voraus

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    20.07.2004
    Ort
    Zwingenberg (Bergstraße)
    Alter
    28
    Beiträge
    136
    HI!

    Ich würde die ganze zeitkritische Routine komplett in Assembler schreiben (also auch die if's). Da kann man noch mal einiges mehr optimieren und 1 MHz sollte gehen.

    mfG Matthias

  5. #5
    flown
    Gast
    Da ich nicht gerade gut in assembler bin, bräuchte ich da eure hilfe. Habe mich da einwenig eingelesen und ich weiss nicht ob ich diesen Befehl richtig interpretiere:

    BTFSC a , b
    befehl 1
    befehl 2

    also kann ich mit 'a' das register auswählen und mit 'b' sagen welches bit er mit 0 vergleichen soll?

    Wenn ja so könnte ich eine kleine Routine schreiben die wie folgt aussehen würde:

    BTFSC writeBlock , 0
    GOTO PIC_OUTPUT_RF_DATA_PUT_1
    GOTO PIC_OUTPUT_RF_DATA_PUT_0

    BTFSC writeBlock , 1
    GOTO PIC_OUTPUT_RF_DATA_PUT_1
    GOTO PIC_OUTPUT_RF_DATA_PUT_0

    etc...

    wenn ja, ich schreibe mein programm in c mit mplab und nun müsste ich ein assemblerprogramm aufrufen mit dem parameter writeBlock, wie kann ich das genau machen?

    Vielen Dank

  6. #6
    Gast
    moin. mich würd interessieren welchen compiler du für c code in mplab nimmst. CCS, CC8E, C18 von Microchip?

  7. #7
    flown
    Gast
    ich benutze den C18 compiler

  8. #8
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    17.08.2004
    Beiträge
    1.065
    ist der C18kostenpflichtig?

  9. #9
    Gast
    naja, du hast eine 30 tägige Testpase. Danach werden die Optimierungen abgeschalten, d.h. der Quelltext wächst an, aber, wenn man das in Kauf nimmt, ist er kostenlos.

    MfG
    Mobius

  10. #10
    flown
    Gast
    kann mir niemand sagen wie ich in c eine assemblerfunktion aufrufe und zusätzlich noch ein parameter übergeben kann???

    und zusätzlich reicht es mit mplab nur die funktion in assembler zu schreiben oder muss ich noch irgendwas einbinden?

    vielen dank

Seite 1 von 2 12 LetzteLetzte

Benutzer, die dieses Thema gelesen haben: 0

Derzeit gibt es keine Benutzer zum Anzeigen.

Berechtigungen

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