www.mikrocontroller.net

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


Autor: Florian L. (hilfselektrode)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: jemand (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: jemand (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ergänzung: tasten =~ PINA;
~ ist ein invertieren, also ist tasten ein invertiertes PINA

Autor: Florian L. (hilfselektrode)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: typ (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: typ (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: typ (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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? ^^

Autor: Florian L. (hilfselektrode)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Kai S. (zigzeg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was schwebt Dir denn vor ?

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

ZigZeg

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: typ (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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^^

Autor: Florian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.