Forum: Mikrocontroller und Digitale Elektronik Verständnis Zugriff auf IO-Ports, Portierung von AVR zu ESP


von Squat *. (squat)


Lesenswert?

Hallo,

ich möchte gern ein Programm vom Atmega 328 zum ESP8266 portieren.

Leider arbeite ich nicht so oft mit C++ und verstehe den Quellcode nicht 
vollständigt. Kann mir jemand dabei auf die Sprünge helfen?

Es geht um folgenden Code.
1
#define portOfPin(P)\
2
  (((P)>=0&&(P)<8)?&PORTD:(((P)>7&&(P)<14)?&PORTB:&PORTC))
3
#define ddrOfPin(P)\
4
  (((P)>=0&&(P)<8)?&DDRD:(((P)>7&&(P)<14)?&DDRB:&DDRC))
5
#define pinOfPin(P)\
6
  (((P)>=0&&(P)<8)?&PIND:(((P)>7&&(P)<14)?&PINB:&PINC))
7
#define pinIndex(P)((uint8_t)(P>13?P-14:P&7))
8
#define pinMask(P)((uint8_t)(1<<pinIndex(P)))
9
10
#define pinAsInput(P) *(ddrOfPin(P))&=~pinMask(P)
11
#define pinAsInputPullUp(P) *(ddrOfPin(P))&=~pinMask(P);digitalHigh(P)
12
#define pinAsOutput(P) *(ddrOfPin(P))|=pinMask(P)
13
#define digitalLow(P) *(portOfPin(P))&=~pinMask(P)
14
#define digitalHigh(P) *(portOfPin(P))|=pinMask(P)
15
#define isHigh(P)((*(pinOfPin(P))& pinMask(P))>0)
16
#define isLow(P)((*(pinOfPin(P))& pinMask(P))==0)
17
#define digitalState(P)((uint8_t)isHigh(P))

So wie ich das verstehe, wird hier Anhand des Pins der Port (B,C oder D) 
zugeordnet (z.B. PORTB=(1<<PB2)). So wie ich das verstanden habe, ist 
beim ESP8266 dies nicht notwendigt, da jeder Port direkt zugeordnet ist.
https://github.com/esp8266/Arduino/blob/master/doc/reference.md#digital-io


Daher dachte ich, ich mache das einfach so:
1
#define portOfPin(P)
2
#define ddrOfPin(P)
3
#define pinOfPin(P)
4
#define pinOfPin(P)
5
#define pinIndex(P)((uint8_t)(P>13?P-14:P&7))
6
...
Aber das funktioniert leider nicht.

Habe ich da was falsch verstanden?

von Jim M. (turboj)


Lesenswert?

Squat *. schrieb:
> Habe ich da was falsch verstanden?

Ja. Das sind C (ohne ++) Makros. Die Sehen nur deswegen kompliziert aus, 
weil bei fortlaufender Nummerierung zwei Pins am Port B (PB6 und PB7) 
übersprungen werden soll. Und weil halt nicht nur 8 sondern 14 bis 22 
Pins fortlaufend nummeriert verwendet werden sollen.

Wofür diese zusätzliche und verwirrende Nummerierung benötigt wird ist 
mir grade nicht so ganz klar. Schau mal lieber nach welche Pin Nummern 
da wirklich benutzt werden.

Wirklich brauchbar sind übrigens nur die eigentlich selbserklärenden 
Makros ab "pinAsInput(P)". Es würde mich sehr überraschen wenn die 
Hilfsmakros darüber irgendwo anders im Source verwendet würden.

von Squat *. (squat)


Lesenswert?

An andere Stelle im Code finde ich die Funktion "pinAsInput" nicht.

Bisher waren es beim Mega328 die Pins
1
#define PIN_RECEIVE            2
2
#define PIN_LED                13 // Message-LED
3
#define PIN_SEND               11

Beim ESP möchte ich die Pins
1
#define PIN_RECEIVE            2
2
#define PIN_SEND               0

Der Pin für die LED ist mir nicht so wichtig und könnte vorerst bei 13 
bleiben.

Laut diesem Threat http://www.esp8266.com/viewtopic.php?p=45073 gibt es 
in hardware/esp8266/2.1.0/cores/esp8266/esp8266_peri.h, eine Definition 
zur Port Behandlung.
1
#define GPO    ESP8266_REG(0x300) //GPIO_OUT R/W (Output Level)
2
#define GPOS   ESP8266_REG(0x304) //GPIO_OUT_SET WO
3
#define GPOC   ESP8266_REG(0x308) //GPIO_OUT_CLR WO
4
#define GPOP(p) ((GPO & (1 << ((p) & 0xF))) != 0)

Falls ihr tiefer ins Detail bei dem Code gehen wollt, der ist hier zu 
finden.
https://github.com/RFD-FHEM/SIGNALDuino/blob/master/RF_Receiver/RF_Receiver.ino

von Squat *. (squat)


Lesenswert?

Kann mir jemand erklären, was der oben genannte Code bedeutet?
Für das Überspringen der zwei Pins am Port B (PB6 und PB7) muss ja nicht 
der gesamte Codeblock verwendet werden.

Da jedoch später in Code auf z.B. digitalHigh(P) zugegriffen wird, würde 
ich gern verstehen, was da drin steht und wie dieser Code für den 
ESP8266 geschrieben werden muss.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.