PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Verständnisproblem Portexpander Code



meldano
20.01.2008, 21:02
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:



/* 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

SprinterSB
25.01.2008, 00:45
Hi, das sind C-Basics (sic!)



unsigned char* serp = serpa+SERPA_SIZE; // 1
unsigned char data = *--serp; // 2


Zeile 1 ist Abkürzung für


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:

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

SprinterSB
25.01.2008, 00:48
siehe auch

https://www.roboternetz.de/wissen/index.php/C-Tutorial#Adress-Operator_und_Dereferenzierung

https://www.roboternetz.de/wissen/index.php/C-Tutorial#Zeiger_II

meldano
25.01.2008, 10:30
Hallo,

danke für die Infos!

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




/* 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!

SprinterSB
25.01.2008, 14:52
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.