Pinbelegung ändern und herrausfinden

Hallo lieber Arduinogemeinde,

habe da mal ein paar kleine Fragen bezüglich der Pinbelegung.

Wollte ein ENC28j60 Ethernet Modul an einem Mega anbauen. Pinbelegung: 50, 51, 52 53 = Miso, Mosi, SCK, SS

Beim Arduino uno wär es so: Pinbelegung: 12, 11, 13, 10 = Miso, Mosi, SCK, SS

Nun passt aber das Original Shield ja sowohl auf dem Mega als auch auf dem Uno wenn ich richtig informiert bin. könnte ich also nun quasi die Pinbelegung beim Mega so ändern das ich die gleichen Pins nutze wie beim uno?

Hintergrund der geschichte, ich würde gerne vom Mega die komplette "Digitalleiste" 22-53 als digitale EA Benutzen.

Außerdem würde ich gerne Wissen, habe ein AVR Netio von Pollin. Dort ist schon Netino drauf. nun wüßte ich gerne, Wo man die Pinbelegungen findet.

z.B das PB0 als beispiel "int Out1 = 1" ist hoffe ihr wisst was ich meine.

auch hier der Hintergrund das dort ein ENC28j60 auf dem AVR netio ist und ich dort ggf pins anpassen müsste.

Das ist die SPI Schnittstelle. Die ist in Hardware und damit fest.

Manche Libs unterstützen eine Software Emulation von SPI. Das ist aber auch wesentlich langsamer.

das heißt also, das Ethernetshield mit dem Wiznet läuft beim Arduino UNO Hardwäremässig und bei dem Mega wird dort die SPI auf die pins emuliert?

EDIT: Nicht weit genug gedacht.

Die SPI Schnittstelle liegt bei den Boards halt auf unterschiedlichen Pins. Wenn das Shield auf dem Mega also nicht die SPI Pins verwendet, dann müsste da in der Tat SoftSPI auf den Pins laufen. Das kann man durch einen Blick in die Library rausfinden. Irgendwo muss da zwischen den Prozessoren (Atmega328 und Atmega2560) unterschieden werden.

also das original schied ist ja mechanisch so aufgebaut das es nur in einer position past.

die besagten pins sind beim mega aber außerhalb des shield. daher die frage

Ja, sorry, das hast du recht. Das hatte ich auch gerade gemerkt :) Wenn das Shield auf dem Mega funktionieren soll, muss das die Library explizit unterstützen.

Du kannst mal in die Lib schauen was da gemacht wird. Aber z.B. hier: https://github.com/jcw/ethercard/blob/master/enc28j60.cpp Sehe ich auf den ersten Blick nur Hardware SPI

EDIT: Wichtig: Geht das Shield auf den ICSP Header in der Mitte des Boards? Da liegt auch SPI drauf! Es müssen also nicht unbedingt die Digitalpins sein. Das heißt aber nicht, dass du dann die Digitalpins für dich verwenden kannst.

ah habe eben noch mal die stromlaufpläne und dort gesehen.

der arduino uno hat mittig am ende ein 6 poligen stecker ICSP und da sind die pins Parallel zu den 10, 11 bzw 51 ,52 denn läuft das sicher darüber.

Ja, das hatte auch erst vergessen. Dann geht es.

Die Pins auf der Stiftleiste sind damit halt auch belegt, da es parallel ist.

habe mir deine Datei mal angesehen. void ENC28J60::initSPI () { pinMode(SS, OUTPUT); digitalWrite(SS, HIGH); pinMode(MOSI, OUTPUT); pinMode(SCK, OUTPUT); pinMode(MISO, INPUT);

dort steht aber nun nicht drinne auf welche pin der SS geht auf dem µC das steht doch sicher auch rigendwo heißt es muss doch beim Mega eine Datei geben wo steht Mosi = pinXY beim UNO Mosi = PinXY sind ja dort auch verschieden

Das wird in den Arduino Core Files irgendwo gemacht wenn du das Board auswählst. Einfach über Makros die Abfragen welcher Prozessor vorhanden ist und je nachdem SS auf einen bestimmten Wert setzen. SS (Slave Select) ist auf dem Mega Pin 53.

Die Lib macht Chip Select allerdings etwas anders:

static byte selectPin;

byte ENC28J60::initialize (uint16_t size, const byte* macaddr, byte csPin) 
{
    ...
    selectPin = csPin;
   pinMode(selectPin, OUTPUT);
    ...
}

static void enableChip () {
    cli();
    digitalWrite(selectPin, LOW);
}

static void disableChip () {
    digitalWrite(selectPin, HIGH);
    sei();
}

Du kannst Chip Select also frei wählen. z.B. auch wenn man abgesetzte Module verwendet statt Shields. In deinem Fall müsstest du halt schauen auf welchen Pin der CS/SS Pin vom Shield führt.

SS wird da glaube ich nur auf Ausgang gesetzt, weil das auch der Fall sein muss, selbst man es nicht verwendet.