Forum: Mikrocontroller und Digitale Elektronik Verständnisproblem mit PWM Code


von Florian L. (hilfselektrode)


Lesenswert?

Hallo,

ich habe einen PWM Quellcode, er funktioniert und alles ist so wie ich 
es mir wünsche. Aber ich habe ein "kleines" Verständnisroblem mit der 
Endlosschleife für die Tasterabfrage.

while()
{
tasten =~ PINA;

    if (tasten & (1 << PINA0))  //PINA0 Helligkeitssteuerung
     {
      if (OCR0 < 255)
      {
       OCR0++;
      }
     }

Danach folgt das selbe Spiel nochmal mit PINA1.
Mir ist klar das ich damit das Puls/Pausen Verhältnis einmal erhöhe und 
eine vermindere. Eigentlich liegt das Hauptproblem in der Zeile:

tasten =~ PINA;

    if (tasten & (1 << PINA0))

Ich lasse das ganze an meinem STK 500 laufen, falls das wegen der 
invertierten Logik eine Rolle spielt.
Vielleicht kann ja einer von euch meinen eingerosteten C Kenntnissen 
helfen. Schonmal vielen Dank soweit.

von jemand (Gast)


Lesenswert?

& (1 << PINA0) is ein "ausmaskieren" wenn z.b. PINA0=3 ist wird 0000 
0001  3 mal nach links geschoben also so: 0000 1000 und das bitweise 
und-verknüpft mit dem ganzen 8 bit von pin A. somit betrachtest du nur 
ein bit und nicht die ganzen 8 von pin A.

von jemand (Gast)


Lesenswert?

Ergänzung: tasten =~ PINA;
~ ist ein invertieren, also ist tasten ein invertiertes PINA

von Florian L. (hilfselektrode)


Lesenswert?

Danke für die schnelle Antwort.
kann ich das so verstehen?

tasten        =~       PINA0 (ist PINA0 nicht nur das erste Bit von 
PINA?)
0000 1111              1111 0000

if (tasten & (1<<PINA0))

da in PINA0 eine 0 steht wird die 1 um 0 Stellen von PINA0 verschoben?
und damit würde die und Verknüpfung so aussehen

0000 1111 & 1111 0001

und meine Verzweigungsbedingung wäre erfüllt, oder?

von typ (Gast)


Lesenswert?

PINA0 ist wie der Name vermuten lässt eine null also ist das Ergebnis 
von: (1<<PINA0) = 0000 0001

wenn in PINA jetzt z.b. 1010 1010 steht steht in tasten 0101 0101.

also bleibt in der if-abfrage 01010101 & 00000001 = 00000001 = true

von typ (Gast)


Lesenswert?

1<<0 = 0000 0001
1<<1 = 0000 0010
1<<2 = 0000 0100
1<<3 = 0000 1000
1<<4 = 0001 0000
1<<5 = 0010 0000
1<<6 = 0100 0000
1<<7 = 1000 0000

beim verschieben in C wird immer eine null hinein geschoben, und das 
heraus geschobene Bit weg geworfen. In assembler gibt verschiedene 
Schiebeoperationen die null oder das carry bit hinein schieben oder 
rotieren usw.

von typ (Gast)


Lesenswert?

in C ist & bitweise und && logisch, d.h.

0000 0001 &  0000 0001 = 0000 0001 = true
0000 0001 && 0000 0001 = true

0000 0001 &  0000 0010 = 0000 0000 = false
0000 0001 && 0000 0010 = true

so, alle Klarheiten beseitigt? ^^

von Florian L. (hilfselektrode)


Lesenswert?

Kannst du mir vielleicht noch den besonderen Hintergrund erklären?
Ich meine warum frage ich nicht einfach den Eingang ab? Es dreht sich ja 
eigentlich nur um einen Taster der an PINA0 hängt und wenn ich diesen 
betätige soll der µC das merken.

MfG Flo

von Kai S. (zigzeg)


Lesenswert?

Was schwebt Dir denn vor ?

Diese Lösung erkennt z.B. auch, wenn mehrere Taster gleichzeitig 
gedrückt werden.

ZigZeg

von Karl H. (kbuchegg)


Lesenswert?

Florian L. schrieb:
> Kannst du mir vielleicht noch den besonderen Hintergrund erklären?
> Ich meine warum frage ich nicht einfach den Eingang ab?

Weil du die ABfrage gerne so gestalten möchtest, dass sie NUR und 
AUSSCHLIESSLICH vom Pin beeinflusst wird, an dem der Taster hängt. Alle 
anderen physichen Pin am diesem Port, seien sie Ausgang oder Eingang 
sollen diese Abfrage nicht beeinflussen. Weder heute noch in 2 Wochen, 
wenn du an den Port A noch weitere LED anhängst.

Ergo: du willst dir dieses eine Bit, welches mit dem Taster 
korrespondiert, freimaskieren und alle anderen Bits zum Zwecke der 
Tasterabfrage gezielt auf 0 setzen.

von typ (Gast)


Lesenswert?

das Problem ist das du 8 Eingänge in einer variablen hast, wenn du nur 
einen Taster angeschlossen hast kannst du einfach das gesamte PINA 
abfragen, wenn du mehrere Taster angeschlossen hast MUSST du deine 
abfrage aber auf bestimmte Bits beziehen.

Du kannst dir auch das invertieren, bitschieben und und-verknüpfen 
sparen und gleich abfragen

if (PINA==0b11111110)

oder das selbe hexadezimal geschrieben:

if (PINA==0xFE)

dann hast du aber das Problem das die Bedingung nicht erfüllt ist wenn 2 
Tasten gleichzeitig gedrückt sind, z.b. Taste0 und Taste2 = 0b11111010 = 
0xFA.

für einfache Testprogramme frage ich auch so ab (if (PINA==0xFE)) weil 
man damit zeit beim tippen spart^^

von Florian (Gast)


Lesenswert?

Jetzt hab ich's verstanden, ich dachte ich kann mit PINA0 nur das Bit an 
der Stelle 0 abfragen. Der Rest klingt ja dann logisch ;)
Vielen Dank für die vielen und schnellen Antworten.

MfG Flo

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.