Ich programmiere gerade AVR Controller mit FPC. Dort sind in einer Unit "ATmega328P" die Register des Controllers definiert. Zum Beispiel für die IO-Ports:
Code: Alles auswählen
// PORTB
PORTB : byte absolute $00+$25; // Port B Data Register
DDRB : byte absolute $00+$24; // Port B Data Direction Register
PINB : byte absolute $00+$23; // Port B Input Pins
// PORTC
PORTC : byte absolute $00+$28; // Port C Data Register
DDRC : byte absolute $00+$27; // Port C Data Direction Register
PINC : byte absolute $00+$26; // Port C Input Pins
// PORTD
PORTD : byte absolute $00+$2B; // Port D Data Register
DDRD : byte absolute $00+$2A; // Port D Data Direction Register
PIND : byte absolute $00+$29; // Port D Input Pins
Wenn ich die Ports jetzt anspreche, kann ich das über diese Namen machen:
Code: Alles auswählen
PORTD := PORTD or Ppwm1; // LED ein
PORTD := PORTD and (not Ppwm1); // LED aus
In Assembler kann ich auch weitere Definitionen für den Port angeben:
Code: Alles auswählen
#define DDR_LED DDRD // LED Test
#define PORT_LED PORTD
Damit wäre dann sowas möglich:
Code: Alles auswählen
PORT_LED := PORT_LED or Ppwm1; // LED ein
PORT_LED := PORT_LED and (not Ppwm1); // LED aus
Ich bräuchte aber eine Zuweisung, mit der ich die Variable PORTD auf die Variable PORT_LED "umbiegen" kann. In der Unit "ATmega328P" will ich dabei nicht rumpfuschen. Die Zuweisung nochmal selbst zu machen möchte ich wegen der Portierbarkeit nicht.
Das Mappen wäre halt schön, weil dann Routinen wie Software-I2C oder Software-Uart einfach auf andere Ports portiert werden könnten ohne an jeder Stelle die Portnamen zu ändern. Im Assembler hat sich das bewährt.