Forum: Projekte & Code Arduino Mega IO Lib


von Stephan K. (dustpuppy)


Angehängte Dateien:

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

von Stephan K. (dustpuppy)


Lesenswert?

Noch mal ich,
waere schoen, wenn ihr auch was dazu schreibt. Ich will doch wissen, 
ob's was taucht ;-)

Gruesse

Dusty

von Sven P. (Gast)


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.

von Stephan K. (dustpuppy)


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

von Sven P. (Gast)


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.

von F. F. (foldi)


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

von Markus _. (markush)


Lesenswert?

Hey, diese Diskussion ist schon über ein Jahr alt. Haste aber schon 
gemerkt, oder?

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.