Forum: Mikrocontroller und Digitale Elektronik AVR nummerische Pinbelegung im Text


von Phillip H. (philharmony)


Lesenswert?

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

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Nein, so etwas gibt es nicht. Und so etwas ... braucht eigentlich auch 
keiner.

von Sepp (Gast)


Lesenswert?

Man könnte sich eine Funktion schreiben die dass macht.
Aber dass benötigt wertvollen Speicherplatz und Prozessorzeit.

von Karl H. (kbuchegg)


Lesenswert?

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.

von TimTom (Gast)


Lesenswert?

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.

von Sumynona (Gast)


Lesenswert?

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

von Phillip H. (philharmony)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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
1
#define READ    0
2
#define WRITE   1
3
#define UNKNOWN 2
4
5
struct PinHeader
6
{
7
  uint8_t            Function;
8
  volatile uint8_t * Port;
9
  uint8_t            PinMask;
10
  uint8_t            Variable;
11
}
12
13
struct PinHeader Pins[] =
14
{ { UNKNOWN, PORTA, 1<<PA1, NULL },      // Pin 0 ist: PortA, PA1
15
  { UNKNOWN, PORTA, 1<<PA2, NULL },      // Pin 1 ist: PortA, PA2
16
  .....
17
};
18
19
#define NR_PINS  ( sizeof( Pins) / sizeof( *Pins) )
20
21
void OutputPins()
22
{
23
  uint8_t i;
24
25
  for( i = 0; i < NR_PINS; ++i ) {
26
    if( Pins[i].Function == WRITE && Variable ) {
27
      if( *Variable )
28
        *Pins[i].Port |= Pins[i].PinMask;
29
      else
30
        *Pins[i].Port &= ~( Pins[i].PinMask );
31
    }
32
  }
33
}

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.

von Vlad T. (vlad_tepesch)


Lesenswert?

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.

von Mark B. (markbrandis)


Lesenswert?

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 :-)

von Phillip H. (philharmony)


Lesenswert?

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?

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.