Hallo, wir haben zur Zeit das Problem, dass wir in unserem Code dynamisch auf Pins zugreifen können müssen. So wie es jetzt ist überprüfen wir mit nem relativ großen switch-case den anzusteuernden Index und greifen dann von Hand auf Port* und DDR* zu was den Code unnötig aufbläht. Um das zu optimieren bräuchten wir ein Array in dem die IO-Adressen der Ports stehen, so dass man über einen Index die Adresse auslesen kann und dann auf der Adresse die Daten ausgeben kann. Die Port*-Defines bekommen wir irgendwie nicht so in einem Array gespeichert, dass wir danach auf die Ports zugreifen können. Gibt es da irgendwelche Tricks über Pointer/Dereferenzierung oder müssen wir die kompletten Adressen für alle Controller von Hand in eine Liste eintragen? Grüße, Chris
Da die gängige Methode mit gcc einen Port in eine Funktion hinein zu übergeben darin besteht, einen Pointer an die Funktion zu übergeben
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
müsste das eigentlich auch mit einem Array aus Pointern klappen. Ich kanns hier nicht ausprobieren, aber irgendwas in der Art:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
Wie gesagt: Ich kanns hier nicht testen. Was habt ihr denn so ausprobiert?
Gast
#542378
Das ist fast so etwas... http://www.circuitcellar.com/avr2006/winners/AT3296.htm Gruß Werner
Gast
#542512
@Karl heinz: Da fehlt noch das bei I/O-Ports obligatorische volatile.
Rolf Magnus wrote:
> @Karl heinz: Da fehlt noch das bei I/O-Ports obligatorische volatile.
Ja richtig.
Hab ich im Eifer des Gefechts übersehen.
Vielen Dank.
Danke euch, das sieht echt gut aus (konnte es noch nicht probieren bis jetzt ;) ). Eine Frage noch: In dem Code auf den Werner gelinkt hat wird die DDR*-Adresse berechnet indem 1 von der Port*-Adresse abgezogen wird ... gilt das für alle ATmegas? Grüße, Chris
Gast
#542528
Darauf würde ich mich lieber nicht verlassen. Wenn du für einen bestimmten AVR programmierst, kannst du ja im Datenblatt nachschauen.
Karl heinz Buchegger wrote:
>1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
//EDIT: Ignoriert das hier, volatile vergessen ;) OLD Haben das jetzt mal so probiert (nur die Arrays global statt lokal) und da gibt der Compiler folgenden Fehler zurück: "../main.c:9: warning: initialization discards qualifiers from pointer target type" Hat da jemand eine Idee? Ansonsten müsste beim Zugriff doch noch ein * vor das Ddrs[1] / Ports[1]? Gruß, Chris
Christian Illy wrote: > Karl heinz Buchegger wrote: >>
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
> > Haben das jetzt mal so probiert (nur die Arrays global statt lokal) und > da gibt der Compiler folgenden Fehler zurück: > "../main.c:9: warning: initialization discards qualifiers from pointer > target type" > > Hat da jemand eine Idee? Das ist das volatile das ich vergessen habe: volatile uint8_t* Ddrs[] = { &DDRB, &DDRC, &DDRD }; Ditto für das andere Array > Ansonsten müsste beim Zugriff doch noch ein * vor das Ddrs[1] / > Ports[1]? Ja, klar. Ist im Eifer des Gefechts passiert. Sorry
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.