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???
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.
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
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)) ???
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))
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.
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.
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.
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
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
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?
danny schrieb: > gibt es eine Möglichkeit dem > PINA0 den Name Taster zu geben Ja: Beitrag "Re: Port als Variable"
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.