www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik AVR nummerische Pinbelegung im Text


Autor: Phillip Hommel (philharmony)
Datum:

Bewertung
0 lesenswert
nicht 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
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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

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

Autor: Sepp (Gast)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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
>
> on_off = pinnummer(i);
> 

Mit genügend Makros und Funktionen kann man fast alles erreichen.

Autor: TimTom (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
on_off = pinnummer(i);
lieber
on_off = PIN_NR_1
und im header steht dann in etwa
PIN_NR_1   (PINB  & PB1)
...
PORT_NR_1  (PORTB | PB1)
...

Keine Ahnung, ob PB1 wirklich der Pin mit der Nr 1 ist, ist nur ein 
Beispiel.

Autor: Sumynona (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Phillip Hommel (philharmony)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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
#define READ    0
#define WRITE   1
#define UNKNOWN 2

struct PinHeader
{
  uint8_t            Function;
  volatile uint8_t * Port;
  uint8_t            PinMask;
  uint8_t            Variable;
}

struct PinHeader Pins[] =
{ { UNKNOWN, PORTA, 1<<PA1, NULL },      // Pin 0 ist: PortA, PA1
  { UNKNOWN, PORTA, 1<<PA2, NULL },      // Pin 1 ist: PortA, PA2
  .....
};

#define NR_PINS  ( sizeof( Pins) / sizeof( *Pins) )

void OutputPins()
{
  uint8_t i;

  for( i = 0; i < NR_PINS; ++i ) {
    if( Pins[i].Function == WRITE && Variable ) {
      if( *Variable )
        *Pins[i].Port |= Pins[i].PinMask;
      else
        *Pins[i].Port &= ~( Pins[i].PinMask );
    }
  }
}


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.

Autor: Vlad Tepesch (vlad_tepesch)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Mark Brandis (markbrandis)
Datum:

Bewertung
0 lesenswert
nicht 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 :-)

Autor: Phillip Hommel (philharmony)
Datum:

Bewertung
0 lesenswert
nicht 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?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.