mikrocontroller.net

Forum: Compiler & IDEs LED einschalten - Code Variante


Autor: Ingo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

habe mal eine Anfängerfrage:

In einem ersten Testprogramm möchte ich eine LED an PORTB1 einschalten.

Kann ich über eine define-Anweisung erreichen das ich nur schreiben 
brauche
Z.B.

#define LED1 PB1
...
DDRB = 0x0F;
...

LED1 = 1;     ???


Ich möchte einen anderen weg ausprobieren als PORTB |= (1<<PB1) zum 
Beipsiel.
Ist das möglich bzw. macht das in euren Augen einen sinn?

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ingo schrieb:

> Ich möchte einen anderen weg ausprobieren als PORTB |= (1<<PB1) zum
> Beipsiel.

Effektiv wird es immer darauf hinauslaufen müssen (und der Compiler
wird daraus den passenden SBI-Befehl basteln, wenn man ihn
optimieren lässt).

Wenn du nun Wert auf Portierbarkeit legst, kannst du sowas
schreiben:
#define GLUE(a, b)     a##b
#define SET_(what, p, m) GLUE(what, p) |= (1 << (m))
#define CLR_(what, p, m) GLUE(what, p) &= ~(1 << (m))
#define SET(what, x) SET_(what, x)
#define CLR(what, x) CLR_(what, x)

#define LED1 B, 1

#include <avr/io.h>
#define F_CPU 1000000UL
#include <util/delay.h>

void port_init(void)
{
  SET(DDR, LED1);  /* enable output for LED1 */
}

void flash_led1(void)
{
  SET(PORT, LED1);
  _delay_ms(100);
  CLR(PORT, LED1);
}

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
p.s.: Hier der daraus generierte Assemblercode für einen ATmega88:
.global port_init
        .type   port_init, @function
port_init:
/* prologue: frame size=0 */
/* prologue end (size=0) */
        sbi 36-0x20,1
/* epilogue: frame size=0 */
        ret
/* epilogue end (size=1) */
/* function port_init size 2 (1) */
        .size   port_init, .-port_init
.global flash_led1
        .type   flash_led1, @function
flash_led1:
/* prologue: frame size=0 */
/* prologue end (size=0) */
        sbi 37-0x20,1
        ldi r24,lo8(25000)
        ldi r25,hi8(25000)
/* #APP */
        1: sbiw r24,1
        brne 1b
/* #NOAPP */
        cbi 37-0x20,1
/* epilogue: frame size=0 */
        ret
/* epilogue end (size=1) */
/* function flash_led1 size 9 (8) */
        .size   flash_led1, .-flash_led1

Autor: technikus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,


warum nicht so ?
//Makros zur Bitverarbeitung
#define SET(x,y)  (x)|=(1<<(y))  //Bit set
#define CLR(x,y)  (x)&=~(1<<(y))  //Bit clear
#define TOGGLE(x,y)  (x)^=(1<<(y))  //Bit toggle

#define READ(x,y)  (x)&(1<<(y))  //Bit read

//Bit setzen
SET(DDRB,PB1);



sondern mit glue (noch nie gehört) ???


Daniel

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
GLUE ist nur der Makroname, könntest auch KLEBEFIX nennen.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
technikus schrieb:

> warum nicht so ?

Weil du dann an mehr als einer Stelle ändern musst, wenn deine LED
demnächst nicht mehr an Port B sondern E klemmt.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.