Moin,
gibt es eine Möglichkeit, bei den AVRs (bei mir ein Atmega8535) die Pins
mit ihrer Pin-Nummer aus dem Datenblatt anzusprechen, anstatt der
üblichen port(pin) abfrage?
Also im Stil
1
on_off=pinnummer(i);
Gibt es so eine Zuweisung schon bzw wenn selbst schreiben wie sollte das
aussehen? Schreibe in C.
Ich bin dabei etwas eingerostet, vllt könnte jemand nen kurzen
bBispielcode mitgeben?
Grüße
Phil
Phillip Hommel schrieb:
> gibt es eine Möglichkeit, bei den AVRs (bei mir ein Atmega8535) die Pins> mit ihrer Pin-Nummer aus dem Datenblatt anzusprechen, anstatt der> üblichen port(pin) abfrage?
Du meinst die physikalischen Pin-Nummern? Oder wie muss ich das
verstehen. Was ist 'die übliche port(pin) abfrage'
Mach mal ein konkretes Beispiel
> Also im Stil>
1
>on_off=pinnummer(i);
2
>
Mit genügend Makros und Funktionen kann man fast alles erreichen.
Wäre mir neu, was aber nichts heißt. ;-)
Aber anstatt hierfür einen (unnötigen) Fuktionsaufruf zu erzeugen, bau
die doch deinen eigenen Header mit Makros/Defines auf.
Anstatt
1
on_off=pinnummer(i);
lieber
1
on_off=PIN_NR_1
und im header steht dann in etwa
1
PIN_NR_1(PINB&PB1)
2
...
3
PORT_NR_1(PORTB|PB1)
4
...
Keine Ahnung, ob PB1 wirklich der Pin mit der Nr 1 ist, ist nur ein
Beispiel.
Da die Pinbelegung nicht nur von unterschiedlichen AVR-Typen
unterschiedlich ist, sondern auch von der Gehäuseform abhängt (DIL,
TQFP), ist so eine Funktion wie du sie willst relativ sinnfrei
Wenn ich das so absolut nicht brauchen würde hätte ich die Frage nicht
gestellt.
Der Code soll nur für die DIL-Version des 8535 sein. Hintergrund ist
der, daß ich ein System aufbauen will bei dem später einmal der code der
über bootloader geschickt wird einfach über eine Graphischen Oberfläche
erzeugt werden soll wobei der (in Elektronik absolut ahnungslose)
Benutzer einfach für jeden Pin per Pull-Down Menü einer Systemvariablen
zuweisen soll. Dabei sind an den Pins jeweils eine Input und eine
Output-Variable zur Auswahl (Bool), als auch, je nachdem was der Pin
noch so kann (ADC), eben auch zb eine INT.
Im Program läuft dann eine Schleife die Pin für Pin abfragt und dazu
jeweils in ein Array schaut in dem drin steht, welcher art die Abfrage
ist (einfach Pin lesen/schreiben, ADC wandeln, PWM ausgeben o.ä.).
Und dafür ist es m.e. einfacher, eben einfach die Pins
durchzunummerieren.
Die letzte Lösung, mit dem Header-File gefällt mir gut, war mir nicht
sicher ob so ein Makro(richtiger Ausdruck?) funktioniert. Wie gesagt,
bin da etwas rostig nach über einem Jahr nichts in dieser Richtung zu
machen.
Phillip Hommel schrieb:
> Im Program läuft dann eine Schleife die Pin für Pin abfragt und dazu> jeweils in ein Array schaut in dem drin steht, welcher art die Abfrage> ist (einfach Pin lesen/schreiben, ADC wandeln, PWM ausgeben o.ä.).> Und dafür ist es m.e. einfacher, eben einfach die Pins> durchzunummerieren.> Die letzte Lösung, mit dem Header-File gefällt mir gut, war mir nicht> sicher ob so ein Makro(richtiger Ausdruck?) funktioniert. Wie gesagt,> bin da etwas rostig nach über einem Jahr nichts in dieser Richtung zu> machen.
Mach dir eine Struktur, die jeden Pin mit
* Art der Funktion
* Portbezeichnung
* Pinbezeichnung
* Adresse der Systemvariablen
verknüpft
Wenn das zuviel Speicher verbraucht, könnte man sicherlich immer noch
eine Formel finden, die die Pinnummer in einen Port umpfriemelt. Die
Ports sind ja nicht wild über den Prozessor verstreut sondern in Gruppen
angeordnet. Das kann man ausnutzen.
warum führst du in der Gui nicht die logischen Geräte des µC auf anstatt
die phyisischen Pins?
Ist doch auch übersichtlicher, wenn man von einem Port die pins 0-7 in
aufsteigender Folge in der Gui hat, anstatt bei den einem Port 7-0, bei
dem anderen 0-5, dann um die ecke erst der 6. usw.
Mann muss halt "nur" die doppelbelegung günstig abbilden und dem User
klarmachen, dass, wenn er sowohl PortC.1 als output und ADC1 als
betreiben will, dass das nicht geht, weil das ein physischer Pin ist.
Zb ein µC -Bild in der mitte mit pins, wo beim mouseover die zugehörigen
logischen geräte gehighlighted werde. und umgedreht, wenn ich dem ADC
bereich einen der Kanäle mouseovere (-: dass dann der Pin gehighlighted
wird.
wird ein gerät benutzt, sollten alle alterniv-funktionen irgendwie
farblich gekennzeichnet werden und bei doppelbelegung die konflikte rot.
Das fänd ich ansrechender.
ich weiß ja aber nicht, was die Zielgruppe und der Zweck dieser
Anwendung ist. verrat doch mal etwas mehr.
Vlad Tepesch schrieb:
> und umgedreht, wenn ich dem ADC bereich einen der Kanäle mouseovere (-:> dass dann der Pin gehighlighted wird.
Nominiert für den Satz des Jahres :-)
Das ganze ist (mal wieder) ein neuer Anstatz beim Interfacing in einem
Flugsimulator. Der alte Ansatz macht so viele Schwierigkeiten daß wir
uns zu einer neuentwicklung entschieden haben.
Da gibt es alle möglichen Module die jeweils msit Schalter und LEDs, ab
und zu aber auch dreh-encoder, 7segment-anzeigen oder potis beinhalten.
Ich möchte jetzt eine universelle Plattine haben auf der jeder Pin auf
eine Phoenix-Klemme rausgeführt wird, plus der Möglichkeit zb an den
verbelibenden 6Pins von PortD oder an SPI noch externe Peripherie
(Porterweiterungen mittels Schieberegister, 7seg Treiber etc).
Der Benutzer soll dann beim Aufbau eines neuen Moduls quasi aus einer
Toolbox oder per Pulldown an jedem Pin einfach auswählen was er für
Funktionen hat und wo die hin sollen. Die Idee mit den logischen Geräten
anstatt Pins finde ich super, da könnte man dann einfach das Menu für
PinA0 disablen wenn im menü für Poti0 was ausgewählt wird. Es kann ja
dann am Ende einfach ein PDF erzeugt werden, in dem dann die Pinbelegung
Gerätespeziefisch ausgeweisen wird. Find ich super, danke dafür!
Die GUI soll aber hier noch gar nicht mein Problem sein, sondern die
Struktur meines Codes. Die zuweisung die die GUI macht soll ja am Ende
nur in ein Header-File einfließen die nur sagt welche Funktionen genutzt
werden und welche Pins davon betroffen sind.
Es soll dem User ja ohne weiteres Möglich sein (wenn er es für
Übersichtlicher hält) einen Port wild abwechselnd mit In-, Out- und
Sonderfunktionen zu versehen.
Bisher ist meine Idee eben die gewesen, die PinNummern durchzuzählen und
die jeweils passende Auslese-Routine aufzurufen.
Allerdings kommt mir beim schreiben eben der Gedanke, das wahrscheinlich
auch besser nach Geräten zu Trennen und dann lieber in Arrays
festzuhalten, welche "Kanäle" des jeweiligen Gerätes abgefragt werden
sollen.
Was denkt Ihr dazu?