Forum: Mikrocontroller und Digitale Elektronik Verfälscht externer Quarz Bitmasken?


von Daniel L. (dannynrw)


Lesenswert?

Hi Leutz,
möchte mit dem AVR-Testboard (MK2 mit Atmega8) schon mal testweise ein 
Programm erstellen, welches dann später leicht abgewandelt auf einem 
Attiny13 lauffähig ist.
Daher benutze ich auf dem AVR-Testboard natürlich ausschließlich den 
Port B. Dieser wird belegt mit zwei digitalen Eingängen, einem digitalen 
Ausgang und einem PWM-Ausgang.
Nun möchte ich logischerweise Bitmuster abfragen, um diese als 
Einschaltbedingungen für den digitalen Ausgang zu nutzen.
Kann es sein, daß mir der externe Quarz (dieser hängt ja an PB6 und PB7)
da hineinfunkt und ich nicht direkt Bitmuster abfragen kann?
Hier mal als Beispiel:

DDRB=0b00000011;   //Bit 1 und 2 sind Ausgänge
PORTB=0b11111100;  //Pull UP Bit 3-8 auf EIN
.
.
.
if ((Variable1==1) & (!(PINB==0b11111111)))
   PORTB=0xFF;

Hier soll abgefragt werden, ob Variable 1 gesetzt ist und gleichzeitig 
kein Taster gedrückt ist.
Dies würde, wenn ich dies als PIND deklariere, tadellos funktionieren.
Bei PINB jedoch klappt das nicht, wie ich mir das wünsche.
Weiß da jemand Rat?
Danke schon mal :-).
Daniel

von spess53 (Gast)


Lesenswert?

Hi

>Kann es sein, daß mir der externe Quarz (dieser hängt ja an PB6 und PB7)
>da hineinfunkt und ich nicht direkt Bitmuster abfragen kann?

Nicht der Takt. Bit 6 und 7 gibt es nicht.

Datenblatt:

If PB7 is used as a clock pin, DDB7, PORTB7 and PINB7 will all read 0.

MfG Spess

von Daniel L. (dannynrw)


Lesenswert?

Das heißt, wenn PB6 und PB7 wegfallen, würde meine Bitmaske z.B. so 
aussehen?

if (!(PINB & 0b100000))
...


Wobei die "1" in diesem Ausdruck dann PB5 beschreibt, sehe ich das 
richtig?

von Falk B. (falk)


Lesenswert?

@  Daniel Lo (dannynrw)

>Das heißt, wenn PB6 und PB7 wegfallen, würde meine Bitmaske z.B. so
>aussehen?

>if (!(PINB & 0b100000))
>...


>Wobei die "1" in diesem Ausdruck dann PB5 beschreibt, sehe ich das
>richtig?

ja. Aber das schreibt man eher so, da ist es deutlich besser lesbar.

if (!(PINB & (1<<PB5)))

Siehe Bitmanipulation

von Peter D. (peda)


Lesenswert?

Daniel Lo schrieb:
> Daher benutze ich auf dem AVR-Testboard natürlich ausschließlich den
> Port B. Dieser wird belegt mit zwei digitalen Eingängen, einem digitalen
> Ausgang und einem PWM-Ausgang.

Dann fragt man eben nur die beiden Eingänge ab. Das Isolieren bestimmter 
Bits nennt sich Maskieren (& - Operator). Danach sind alle unnützen Bits 
egal.
Z.B. Pin 0 und 7:
1
  uint8_t inval = PINB & (1<<PB0 | 1<<PB7);


Peter

von Daniel L. (dannynrw)


Lesenswert?

Danke für die Tipps, habe die Tage mal ein wenig damit rumexperimentiert 
und bin jetzt ein bißchen weiter.
Beste Grüße :-).
Daniel

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
Noch kein Account? Hier anmelden.