Forum: Mikrocontroller und Digitale Elektronik C Makro, Bits aus verschiedenen Registern setzen


von Elias B. (bouni)


Lesenswert?

Hi,

Ich habe 26 Transistoren die an 26 Pins eines AtMega2560 (Arduino 
Mega2560) angeschlossen sind.
Jeweils einer ist fürs setzen und einer fürs Rücksetzen.
Leider sind die Pins nicht schön der Reihe nach und auch über mehrere 
Ports verstreut.
1
/*
2
[Arduino Pins connected to row transistors]
3
SET   ROW 0    = PA0 = 22
4
RESET ROW 0    = PA1 = 23
5
SET   ROW 1    = PA2 = 24
6
RESET ROW 1    = PA3 = 25 
7
SET   ROW 2    = PA4 = 26
8
RESET ROW 3    = PA5 = 27
9
SET   ROW 4    = PA6 = 28
10
RESET ROW 4    = PA7 = 29 
11
SET   ROW 5    = PC7 = 30
12
RESET ROW 5    = PC6 = 31
13
SET   ROW 6    = PC5 = 32
14
RESET ROW 6    = PC4 = 33
15
SET   ROW 7    = PC3 = 34
16
RESET ROW 7    = PC2 = 35
17
SET   ROW 8    = PC1 = 36
18
RESET ROW 8    = PC0 = 37
19
SET   ROW 9    = PD7 = 38
20
RESET ROW 9    = PG2 = 39
21
SET   ROW 10   = PG1 = 40
22
RESET ROW 10   = PG0 = 41
23
SET   ROW 11   = PL7 = 42
24
RESET ROW 11   = PL6 = 43
25
SET   ROW 12   = PL5 = 44
26
RESET ROW 12   = PL4 = 45
27
*/

Gibt es eine Möglichkeit mit hilfe eines Makros das setzen des richtigen 
Pins über die Nummer zu bewerkstelligen?

Standart wäre ja z.B.
1
PORTA |= (1<<PA0);

Aber ich würde gerne sowas in die Richtung haben:
1
set_row(11);
die dann den passenden Port und das entsprechende Bit nimmt und setzt.

Kann man sowas über ein PreProzessor Makro machen?

Danke schon mal für eure Hilfe!

Bouni

von Klaus B. (klaus_b51)


Lesenswert?

Hallo Elias,

schau bitte einmal unter: 
Beitrag "Frage zu Struktur für IO-Port bei AVRs"
Maileintrag: 02.03.2013 17:00 nach.

Peter Dannegger hat hier einen excelenten Code "main.c" sowie "sbit.h"
geschrieben.

Ich denke, den kannst du für deine Anwendung nutzen.

Gruß
Klaus Becker

von Elias B. (bouni)


Lesenswert?

Hi,

Danke für die schnelle Antowrt!
Schau ich mir gleich mal an :)

Gruss Elias

von Elias B. (bouni)


Lesenswert?

Ich hab mir das angesehen und denke das das nicht ganz das ist wonach 
ich suche.

ich möchte ja nicht statisch in den Code schreiben das z.B. die Reihe 11 
gesetzt werden soll, sondern die Nummer soll variabel übergeben werden.

von Ingo (Gast)


Lesenswert?

Warum willst du ein Makro und keine Funktion? Es schreit geradezu nach 
einer Funktion.


Ingo

von Fabian O. (xfr)


Lesenswert?

Würde da auch eine Funktion draus machen. Die sucht dann entweder per 
Switch-Case-Statement oder Lookup-Tabelle den richtigen Port raus.

von Uwe (de0508)


Lesenswert?

Hallo Fabian,

nutze Switch-Case-Statement in deinen Funktionen, das ist sehr einfach 
und übersichtlich.

Desweiteren könntest Du trotzdem sbit.h verwenden.

http://www.mikrocontroller.net/attachment/171581/sbit.h

Damit wird dein Code noch einfacher lesbar.

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.