Hallo Julian
Ein wirklich tolles Projekt habt ihr da am laufen, Respekt!
Deshalb hätte ich gerne, dass ich die Funktion so aufrufe: io_set(15); io_set soll dann io_info aufrufen und sich von io_info die zu Pin 15 zugehörigen Register abholen. Das würde das Hauptprogramm ungemein übersichtlicher machen.
io_set() braucht von io_info() zwei Zeiger auf die Register, die verwendet werden sollen sowie die Nummer des Pins am Port. Die Register-Konstanten sind ja eigentlich auch nichts weiter die Adressen, wo sich die Register befinden, also solltest du diese direkt zurück geben können. Weil es mehrere Werte sind verwenden wir für die Rückgabewerte Parameter (Zeiger auf Zeiger). Hier der C-ähnliche Pseudocode (mangels Compiler nicht getestet):
void io_info(int pin_id, int** pddreg, int** pvalreg, int* pin) {
/* Pin von Port A */
if (0 <= pin_id && pin_id <= 7) {
*pddreg = DDRA;
*pvalreg = PORTA;
*pin = pin_id;
} else
/* Pin von Port B */
if (8 <= pin_id && pin_id <= 15) {
*pddreg = DDRB;
*pvalreg = PORTB;
*pin = pin_id - 8;
} else { /* Unbekannter Pin */
*pddreg = null;
*pvalreg = null;
}
}
void io_set(int pin_id) {
int* pDDR; // Adresse DDR
int* pPORT; // Adresse Port
int nPin; // Nummer des Pins
io_info(pin_id, &pDDR, &pPORT, &nPin);
if (pDDR != null && pPORT != null) {
/* DDR auf Ausgang setzen (Annahme: 1 = Ausgang) */
*pDDR |= nPin;
/* Pin setzen */
*pPORT |= nPin;
}
}
Besser wäre noch, wenn du den Erfolg der Aktion über den Rückgabewert prüfbar machst. In deinem eigentlichen Programmcode definierst du dann Konstanten für die Pins, so dass du sie nach belieben vertauschen kannst (1x Kabel umhängen + 1x Konstante anpassen).
Was du hier entwickelst verschönert nicht nur deinen Programmcode, es enkoppelt auch gleich die Programmlogik von der Hardware. Wenn du das konsequent durchziest hast du am Schluss ein sog. HAL, ein Hardware Abstraction Layer. Das hat den Vorteil, dass du deinen Programmcode auch direkt auf dem PC oder einem anderen uC laufen lassen kannst, wenn du dafür eine eigene Abwandlung der HAL-Funktionen schreibst.
Gruss
Tom2
PS: Kennst du http://www.mikrocontroller.net?