LEDs an-/ausschalten

Gast #177961
Lesenswert?
• ▲
▼
Hallo,

ich versuche seit einigen Tagen einen ATMEGA 8 so zu programmieren,
dass wenn ich einen Knopf auf meinem STK500 drücke die entsprechende
LED ausgeht und nach nochmaligem drücken des selben Knopfes die LED,
die gerade ausgegangen ist, wieder angeht. Mit dem ausgehen klapts, nur
das wieder angehen will nicht.

Kann mir da wer helfen? (bisherigen Quellcode siehe Anhang)

Thomas
Angehängte Dateien:
Gast #177962
Lesenswert?
• ▲
▼
Das funktioniert so nicht:
  //Lampe i ist aus -> anmachen
  PORTB |= (0<<i);

Du steuerst Deine LED low-aktiv an, korrekt?
Dann musst Du so schreiben:
  PORTB &= ~(1<<i);


Überleg mal, was der Befehl genau macht: (Bsp.: i = 2):
  1<<i  bedeutet: eine 1 um i (Bsp.: 2) Stellen nach links schieben,
  also:  0000 0100 binär

  1<<i bedeutet: eine Null (!) um i STellen nach links schieben,
  und das ergibt immer wieder Null, egal was i für ein Wert ist.

Ok, Du hast jetzt aus 1<<i eine "Maske gemacht. Diese Maske wird zum
VerODERn (->Pin auf high schalten) oder invertiert zum verUNDen (Pin
auf GND schalten) benutzt:
  PORTB |= 00000100b bedeutet: Bit 2 des PB wird gesetzt.

Das VerUNDen ist nur geringfügig komplizierter:
  PORTB &= ~00000100b bedeutet:
  PORTB UND invertierte Maske
  00000100b invertiert -> 11111011b, also:
  PORTB &= 11111011b
  D.h. alle Bits des Ports bleiben unverändert bis auf Bit 2, das
  wird immer Null.

Viel Spass, Stefan
Gast #177963
Lesenswert?
• ▲
▼
Ich baue mir so ein Toggle-Led immer ein wenn eine Funktion nicht so
richtig tut was ich will. Z.B
SIGNAL(SIG_OVERFLOW1) /*TIMER 1 ÜBERLAUF*/
     if(PORTD&0x80){  /*ist PORTD 7 gesetzt ?*/
         cbi(PORTD,7);/*wenn ja  PORT löschen*/
      }
     else{
         sbi(PORTD,7); /* wenn nicht dann Port setzen*/
       }

Anstelle des Interrupt brauchst du ja nur die Taste abfragen und dir
das jeweilige Port aussuchen an dem die LED hängt.
Gast #177968
Lesenswert?
• ▲
▼
@Oldbug:
Warum nur Assembler? Aus
  PINB |= _BV(1)     wird beim gcc:

 149:buskoppler.c  ****   PINB |= _BV(1);
 433                 .LM21:
 434 0058 B19A          sbi 54-0x20,1

Die Frage ist nur, wofür man den Befehl sinnvoll nutzt. Vielleicht ist
es ganz interessant, wenn das Ganze auch für einen kompletten Port
funktioniert. Dann könnte man ein ganzes Bitpattern mit einem Schlag
invertieren.

Viele Grüße, Stefan
Gast #177969
Lesenswert?
• ▲
▼
Stimmt auch wieder...

Ich war jetzt schon nen Schritt weiter :-)

PORTB ^= _BV(1);

Müsste der neuen Funktion nach auch in "sbi PINB, 1" übersetzt
werden...

Aber trotzdem Vorsicht: Das geht alles nur so lange die Werte Konstant
sind!

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.