Arduino Mega IO Lib

OP #2363174
Lesenswert?
• ▲
▼
Hi,
da es mir auf den Nerv ging immer in den Datenblaettern zu blaettern, 
hab ich mir die Muehe gemacht die IO-Lib von Julian Mendel 
http://derjulian.net/mikrocontroller zu erweitern und die Servo 
Funktionen zu entfernen. Damit kann man jetzt die Ports des Arduino Mega 
mit 1280 CPU direkt ansprechen.
Alle Ports lassen sich mit D0 bis D69 ansprechen.
Die Analogen Ports kann man mit A0 bis A15 ansprechen.
Die PWM Port mit PWM0 bis PWM11.
Desweiteren kann man folgende Ports direkt ansprechen:
SDA, SDL, RX, TX, RX1, TX1, RX2, TX2, RX3, TX3
Die beiden Funktionen sind

set_io(ionr, status); - Damit setzt man einen Port
Moegliche Parameter fuer Status sind:
OUTPUT          - Port als Ausgang
INPUT           - Port als Eingang
OUTPUT_LOW      - Ausgang low setzten
OUTPUT_HIGH     - Ausgang high setzten
INPUT_HIGH      - Port als Eingang mit internem Pullup
INPUT_LOW       - Port als Eingang ohne internem Pullup
ENABLE_PULLUP   - Schaltet internen Pullup ein
DISABLE_PULLUP  - Schaltet internen Pullup aus

get_io(ionr);  - Damit liest man den Zustand eines Ports

Vielleicht kann ja Jemand was damit anfangen.

Gruesse

Dusty
Angehängte Dateien:
Gast #2364101
Lesenswert?
• ▲
▼
Wenn man die Konstanten für OUTPUT, OUTPUT_HIGH, OUTPUT_LOW usw. 
sinnvoll gewählt hätte, bräuchte man kein switch(), sondern nur einfache 
Bitoperationen.

Gleiches gilt für die Portnummern. Hätte man die sinnvoll gewählt, 
könnte man mit einer Bitmaske arbeiten und die ganzen Port-Adressen in 
eine Tabelle verfrachten.
OP #2364893
Lesenswert?
• ▲
▼
Und da erkennt man, dass du nicht weiss, wie ein Arduino aufgebaut ist.

>Gleiches gilt für die Portnummern. Hätte man die sinnvoll gewählt,
>könnte man mit einer Bitmaske arbeiten und die ganzen Port-Adressen in
>eine Tabelle verfrachten.

Die Portadressen sind nun mal so bei den Boards und man muss damit klar 
kommen.

Gruesse

Dusty
Gast #2365641
Lesenswert?
• ▲
▼
Aha.
Naja, bei dem Quelltext, den du da produziert hast, scheinst du immerhin 
noch ein paar andere Dinge nicht verstanden zu haben.

Ich hätte das so gelöst:
1
struct port_info_t {
2
  uint8_t *ddr;
3
  uint8_t *port;
4
  uint8_t *pin;
5
} port_info[] = {
6

7
  { &DDRA, &PORTA, &PINA },
8
  { &DDRB, &PORTB, &PINB },
9
  { &DDRC, &PORTC, &PINC },
10
  { &DDRD, &PORTD, &PIND },
11
  { &DDRE, &PORTE, &PINE },
12
  { &DDRF, &PORTF, &PINF },
13
  { &DDRG, &PORTG, &PING },
14
  { &DDRH, &PORTH, &PINH },
15
  { &DDRJ, &PORTJ, &PINJ },
16
  { &DDRK, &PORTK, &PINK },
17

18
};
19

20
#define PIN(port, bit) \\
21
  ( ((port) << 3) | (bit) )
22

23
enum pins_e {
24
  D0 = PIN(4, 0),
25
  D1 = PIN(4, 1),
26
  /* ... */
27
};
28

29
void set_io(uint8_t pin, uint8_t status) {
30
  uint8_t port = pin >> 3;
31
  uint8_t bit = pin & 0x07;
32

33
  uint8_t *ddr = pgm_read_byte(&port_info[port].ddr);
34
  uint8_t *port = pgm_read_byte(&port_info[port].port);
35

36
  /* ... */
37
}

Wenn man sich dann überlegt, wie sinnvoll es ist, einen Pin auf Ausgang 
zu schalten, ohne ihm einen Zustand mitzugeben, kann man den 'status' 
auf eine Bitmaske eindampfen.
Ich könnte mir zudem vorstellen, dass die Ports im Adressraum des 
Prozessors hintereinander liegen. Damit ließe sich die Port-Tabelle auf 
ein bisschen Mathematik reduzieren.

In jedem Fall besser, als dieses unwartbare Zahlengewusel, welches du da 
verbrochen hast.
#2898097
Lesenswert?
• ▲
▼
Toll, dass hier jeder der hier nicht gleich mit "mathematischem Genie"
brilliert, gleich dafür verhauen wird, wenn er seine Mühe anderen zu 
Verfügung stellt.

EINE Lösung ist doch immer besser als KEINE Lösung.

Danke für deine Mühe!

Wenn ich es brauche, werde ich das sicher einbinden.

Gruß
Frank

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.