Forum: Compiler & IDEs Port benennen


von danny (Gast)


Lesenswert?

Hi,

normalerweise programmiere ich in Bascom, aber wollte mich mal mit AVR 
Studio  versuchen, da ich mit der freien Version an die 4kB Grenze 
stoße.
Komm aber schon bei einer eigentlich ganz einfachen Sache nicht weiter.
Entweder bin ich zu doof zum suchen oder es findet sich tatsächlich nix 
brauchbares.

Ich möchte einfach erst einmal mit einem Atmega 32 per Tasterdruck eine 
LED aufleuchten lassen.
Das ist eigentlich nicht das Problem, ich möchte aber nicht immer mit 
PINA0 und so arbeiten, darum meine Frage, gibt es eine Möglichkeit dem 
PINA0 den Name Taster zu geben der dann die LED am PORTB0 aufleuchten 
lässt und ich die LED auch mit LED im Programm anspreche und wie würde 
der Programm Code dazu aussehen???

von vcd (Gast)


Lesenswert?

Ich geb dir mal einen Schubs: Das Stichwort heißt #define
Und zum Lesen hast du hier was:
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial
Da findest du auch die Lösung für deine Frage.

von chris (Gast)


Lesenswert?

Für die LEDs kann das z. B. so aussehen:
1
#define LED_PORT  PORTD
2
#define LED_DDR    DDRD
3
4
5
#define LED_1      7
6
#define LED_2      5
7
#define LED_3      6
8
9
#define LED_ON(x)    (LED_PORT |= (1<<x))
10
#define LED_OFF(x)    (LED_PORT &= ~(1<<x))

Im Programm dann so benutzbar:
1
LED_DDR |= (1<<LED_1) | (1<<LED_2) | (1<<LED_3);  // LEDs als Ausgang konfigurieren
2
3
LED_ON(LED_1);
4
LED_OFF(LED_2);

lg
Chris

von danny (Gast)


Lesenswert?

Danke schonmal für die Antworten,
mit der C Schreibweise muss ich mich echt noch anfreunden,das ist ganz 
schön gewöhnungsbedürftig.

Mit #define LED_PORT PORTD benenne ich den PORT
mit #define LED_DDR DDRD das I/O Register

aber was macht man mit

#define LED_1       7
#define LED_ON(x)    (LED_PORT |= (1<<x))
#define LED_OFF(x)    (LED_PORT &= ~(1<<x))

???

von Pascal (Gast)


Lesenswert?

Wieso wurde das beim ATmega eigentlich so umständlich gelöst? Beim PIC 
geht das meiner Meinung nach viel intuitiver.

PORTCbits.RC2=1;
vs.
PORTC|=(1<<PC2);

PORTCbits.RC2=0;
vs.
PORTC&=~(1<<PC2);

if(PORTCbits.RC2)
vs.
if(PINC&(1<<PINC2))

von Peter II (Gast)


Lesenswert?

Pascal schrieb:
> Wieso wurde das beim ATmega eigentlich so umständlich gelöst? Beim PIC
> geht das meiner Meinung nach viel intuitiver.

das hat doch nichts mit PIC oder Atmel zu tun. Das ist alles eine Frage 
vom Compiler und Toolchain.

von Ein (Gast)


Lesenswert?

Pascal schrieb:
> PORTC|=(1<<PC2);

dann schreib

PORTC|=_BV(PC2);

von F. F. (foldi)


Lesenswert?

Pascal schrieb:
> if(PORTCbits.RC2)
> vs.
> if(PINC&(1<<PINC2))

Ist doch immer wie man es gewohnt ist.
BesAnLwUKdo war für mich auch mal völlig normal und für dich sicher 
nicht lesbar.

von Karl H. (kbuchegg)


Lesenswert?

danny schrieb:
> Danke schonmal für die Antworten,
> mit der C Schreibweise muss ich mich echt noch anfreunden,das ist ganz
> schön gewöhnungsbedürftig.
>
> Mit #define LED_PORT PORTD benenne ich den PORT

Jain.
Genau genommen, vereinbarst du nur, dass dir der Präprozessor im 
restlichen Programmtext den Text "LED_PORT" durch den Text "PORTD" 
ersetzen soll, ehe es dann durch den eigentlichen Compiler geht.
(Und der Text "PORTD" wird dann eigentlich wieder durch einen anderen 
Text ersetzt)

> #define LED_1       7
> #define LED_ON(x)    (LED_PORT |= (1<<x))
> #define LED_OFF(x)    (LED_PORT &= ~(1<<x))
>
> ???

Genau dasselbe.
Mittels #define vereinbarst du einfach nur eine Textersetzung.

Lies ein C Buch und arbeite es durch. Da gibt es für dich noch so 
manches zu entdecken.

von Karl H. (kbuchegg)


Lesenswert?

Peter II schrieb:

> das hat doch nichts mit PIC oder Atmel zu tun. Das ist alles eine Frage
> vom Compiler und Toolchain.

Noch nicht mal das.
Es ist alles eine Frage, ob man sein C beherrscht oder nicht.
Mittels Strukturen und Bitfields kann man sich auch problemlos die 
Syntax
1
   LedPort.ErrorLed = ON;
zusammensetzen.
Nur muss man halt seine Sprache auch beherrschen.

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

Pascal schrieb:
> Wieso wurde das beim ATmega eigentlich so umständlich gelöst?


Weil es letzten Endes völlig egal ist, wie du dir ein bischen 
Makro-Magie zurechtlegst, damit du im Programm
1
  ....
2
  LED_ON( ERROR_LED )
3
  ....

schreiben kannst.
Denn ernsthaft: Ob du im Programm
1
  PORTCbits.RC2=1;
schreibst, oder ob du
1
  PORTC|=(1<<PC2);
scheibst, schenkst sich nicht wirklich viel. Du willst das eine 
genausoenig haben wie das andere sondern
1
  LED_ON( ERROR_LED );
oder
1
  ERROR_LED = ON;
schreiben, also in problemangepassten Termen schreiben und nicht in 
low-Level Ports und Bits.

Mal ganz davon abgesehen, dass du in
1
  PORTC |= ( 1 << PC1 ) | ( 1 << PC2 );
die beiden Bits so gleichzeitig wie nur irgend möglich auf 1 schalten 
kannst, was du mit
1
  PORTCbits.RC1=1;
2
  PORTCbits.RC2=1;
nun mal so nicht kriegst. Zugegeben, es unterscheidet sich nur im µs 
Bereich. Aber auch das kann manchmal wichtig sein.

: Bearbeitet durch User
von Pascal (Gast)


Lesenswert?

Karl Heinz schrieb:
> die beiden Bits so gleichzeitig wie nur irgend möglich auf 1 schalten
> kannst, was du mit
Dann muss ich auf die Bitmanipulation mit |= bzw. &= abweichen.
Ich kann mir auch vorstellen, dass die beim ATmega oft verwendete 
Schreibweise gar nicht mehr so umständlich ist, wenn man sie mal gewohnt 
ist.
Also kurz gesagt, es hat keinen bestimmten Grund, Atmel oder wer auch 
immer die <avr/portpins.h> hat entschieden es so zu machen?

von Peter D. (peda)


Lesenswert?

danny schrieb:
> gibt es eine Möglichkeit dem
> PINA0 den Name Taster zu geben

Ja:

Beitrag "Re: Port als Variable"

von Karl H. (kbuchegg)


Lesenswert?

Pascal schrieb:

> Also kurz gesagt, es hat keinen bestimmten Grund, Atmel oder wer auch
> immer die <avr/portpins.h> hat entschieden es so zu machen?

Ja, aber das ist nicht Gott gegeben und nicht in Stein gemeisselt.
Wenn du C gut genug kannst, kannst du dein Programm auch so formulieren, 
dass du deine gewohnte Schreibweise wieder benutzen kannst.

-> Es läuft alles darauf hinaus, ob man sein C kann oder ob man es nicht 
kann.

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.