Atmega8-Programmierung Anfängerfrage!

Gast #3094790
Lesenswert?

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 #3094807
Lesenswert?

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
Moderator Persönliche Seite #3096108
Lesenswert?

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) #3098576
Lesenswert?

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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren