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.
& (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.
Ergänzung: tasten =~ PINA; ~ ist ein invertieren, also ist tasten ein invertiertes PINA
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?
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
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.
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? ^^
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
Was schwebt Dir denn vor ? Diese Lösung erkennt z.B. auch, wenn mehrere Taster gleichzeitig gedrückt werden. ZigZeg
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.
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^^
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.