-         

Ergebnis 1 bis 5 von 5

Thema: Verständnisproblem Portexpander Code

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    29.03.2007
    Beiträge
    64

    Verständnisproblem Portexpander Code

    Anzeige

    Hallo,

    ich möchte an ein Schieberegister Daten ausgeben. Jetzt habe ich mir mal den Artikel "Portexpander" im Roboternetz Wissen Bereich durchgelesen.

    Funktioniert auch alles, bloß kann ich mir als C Einsteiger den Code nicht ganz erklären. Das ärgert mich gerade sehr.
    Hier mal der Code:

    Code:
    /* SERiell nach PArallel (serpa) via Software */
    #include "serpa.h"
    
    /* Array fuer die Daten */
    unsigned char serpa[SERPA_SIZE];
    
    void serpa_init ()
    {
        /* Verwendete Ports auf OUT */
        MAKE_OUT (PORT_SER);
        MAKE_OUT (PORT_SCK);
        MAKE_OUT (PORT_RCK);
    
        /* SCR und RCK auf definierten Level HIGH */
        SET (PORT_SCK);
        SET (PORT_RCK);
    }
    
    void serpa_out ()
    {
        unsigned char anz = SERPA_SIZE;         
        unsigned char* serp = serpa+SERPA_SIZE;     //???
    
    
    // do...while pro Byte einmal -> wird bestimmt durch Array Größe
    
        do
        {
            unsigned char bits;                       //Anzahl Bits
            unsigned char data = *--serp;       // ??? wohl ein Pointer
    
            /* 8 Bits pro Byte rausschieben */
    
            // for schleife pro Bit einmal durchlaufen (8 mal)
            for (bits = 8; bits > 0; bits--)
            {
                CLR (PORT_SER);                    //SER Port auf Masse       
                if (data & 0x80)                       //???
                {
                    SET (PORT_SER);               //SER Port auf 1
                }
    
                data <<= 1;                          //???
                /* Strobe an SCK schiebt Daten im Gaensemarsch */
                /* um 1 Position weiter durch alle Schieberegister */
                CLR (PORT_SCK);                 //Takt Port auf Masse
                SET (PORT_SCK);                 //Takt auf 1
            }
        }
        while (--anz > 0);
    
        /* Strobe an RCK bringt die Daten von den Schieberegistern in die Latches, also übernehmen wenn alle Arrays geschoben wurden*/
        CLR (PORT_RCK);                         
        SET (PORT_RCK);
    }
    Ich habe den Code mal soweit kommentiert wie ich klar komme. Mit * wird wohl ein sog. Pointer benutzt? Ich habe mal im Netz nach Antworten gesucht, leider ohne Erfolg

    Ich wäre euch dankbar wenn wir den Code so auseinander nehmen können das auch ich es verstehe.

    DANKE

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.801
    Hi, das sind C-Basics (sic!)

    Code:
     unsigned char* serp = serpa+SERPA_SIZE;     // 1
     unsigned char data = *--serp;       // 2
    Zeile 1 ist Abkürzung für
    Code:
     unsigned char* serp; // 1a
     serp = serpa+SERPA_SIZE;     // 1b, = & serpa[SERPA_SIZE]
    serpa ist hier ein Array (Feld) mit SERPA_SIZE Einträgen (von 0..SERPA_SIZE-1). serp verweist nach der Zuweisung eins hinter das letzte Element von serpa[]

    Zeile 2 kürzt ab:
    Code:
     unsigned char data;        // 2a
     serp = serp-1; // 2b: vermindere serp um die größe von "unsigned char" (in bytes) also um 1. 
     data = *serp;       // 2c: lies das datum (ein unsigned char) an adresse 'serp' aus
    data enthält also nacheinander die werte serpa[SERPA_SIZE-1]...serpa[0], und serp hält die entsprechenden adressen für den zugriff darauf
    Disclaimer: none. Sue me.

  3. #3
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.801
    Disclaimer: none. Sue me.

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    29.03.2007
    Beiträge
    64
    Hallo,

    danke für die Infos!

    Noch eine Frage: Ist so ein Schieberegister schnell genug auf so Signal zu reagieren? :



    Code:
     /* Strobe an RCK bringt die Daten von den Schieberegistern in die Latches, also übernehmen wenn alle Arrays geschoben wurden*/ 
        CLR (PORT_RCK);                          
        SET (PORT_RCK);
    Oder sollten da noch Wartebefehle zwischen damit alles sauber funktioniert?


    Danke!

  5. #5
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.801
    Klaro, je nach Typ machen die locker bis 100MHz oder mehr, getaktet vom AVR bei Hardwarevariante ist maximal 10MHz, bei der SOftwarevariante von oben noch mal nen faktor weniger.

    Worauf eher zu achten ist ist Leitungslänge(n), bei langen Leitungen evtl abschirmen gegen Einstreuung oder Leitungen abpuffern zB mit ca. 100pF.
    Disclaimer: none. Sue me.

Berechtigungen

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