Atmega8-Programmierung Anfängerfrage!

Gast #3094790
Ich habe vor kurzem mit dem Programmieren von Atmega8 und Attiny13 
begonnen. Ich habe schon Blink- und Lauflichter mit LEDs programmiert. 
Jetzt habe ich eine Frage:

Wenn ich ein Byte zu einem Port schreiben will (sag man das so?) habe 
ich das so gemacht:
1
PORTB = 0b10011001;

Die 1.,4.,5. und 8. LED leuchtet, die 2.,3.,6. und 7. bleibt dunkel.

Jetzt möchte ich, dass bspw. die ersten drei Ausgänge entweder 0 oder 1 
sind, abhängig von irgendwas...

Nachher die restlichen 5 LEDs in einer Reihenfolge(von irgendetwas 
abhängig) blinken lassen.

Wenn ich aber den Status des 1. Ausgangs nicht kenne, den 6. und 7. aber 
auf HIGH haben möchte funktioniert das nicht:
1
PORTB = 0b01100000;

Da ich ja alle anderen Bits auf 0 setzte.

Ich möchte also den Wert einzelner Bits ändern, ohne die anderen zu 
beeinflussen.

Ich hoffe man versteht meine Frage.
Ich habe das AVR-GCC Tutorial gesehen, nur ist das ohne 
Programmiererfahrungen etwas schwierig.

Stefan
Gast
Die Zauberwörter heissen "und", "oder" und "nicht".

Such dir ein gutes C-Buch, und arbeite das durch. Irgenwann kommt darin 
ein Kapitel mit den Operatoren, darin sind dann auch die Bit-Operatoren 
beschrieben. Wenn du das gelesen hast, dann lies nochmals das Kapitel 
dazu im Tutorial durch. Denn da steht eigentlich alles drin.

Ganz ohne Grundlagen lernen und verstehen wird das sonst sehr schwierig.

Oliver
Jörg Wunsch schrieb:
> Wenn es sich der Controller merkt, ist das aber überflüssig.

Ich hatte jetzt eher daran gedacht, dass sich die verschiedenen 
Bitzustände ja irgendwie ergeben|empfangen|berechnet|manipuliert werden 
müssen. Dazu müssen die Grundlagen ja irgendwo herkommen. Der Ausgang 
wird ja nicht von außen geändert...
Moderator Persönliche Seite
Ja, aber wenn man (was nicht untypisch ist) die Bits in völlig
unabhängigen Zweigen berechnet (weil beispielsweise an Bit 0 bis
2 Status-LEDs hängen, während bit 4 und 5 irgendwelche externe
Peripherie steuern), dann ist das Rücklesen von PORTB schon der
sinnvollste Platz um zu ermitteln, welchen Zustand die Portpins
gerade haben.
(Firma: Zodiac)
Für solche zwecke habe ich in meinen Projekten immer folgende defines 
angelegt:

#define setBit(byte, mask) byte = byte | (mask)
#define clearBit(byte, mask) byte = byte & ~(mask)
#define changeBit(byte, setMsk, clsMsk) byte = (byte | (setMsk)) & 
~(clsMsk)

setBit setzt die Bits die in mask = 1 sind
und clearBit löscht alle Bits (auf 0 setzen) die in mask = 1 sind

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 13 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.