Hallo,
wie kann man follgendes schreiben:
fals am PINC1 ein high anliegt und an PINB1 ein low soll PORTD1 high
sein
mein kläglicher Versuch sieht so aus:
if((PINC & (1 << PINC1)) && (PINB & !(1 << PINB1))){ PORTD |= (1<<PD1);
Danke für die Hilfe
vG Rocco
Gast
#2040086
Sieht ganz gut aus, aber:
1 | |
muss
1 | |
heissen. Außerdem fehlt ein "}" (bzw. das "{" ist zu viel), die
Formatierung allgemein ist verbesserungswürdig.
Rocco L. schrieb: > Hallo, > > wie kann man follgendes schreiben: > > fals am PINC1 ein high anliegt und an PINB1 ein low soll PORTD1 high > sein > > mein kläglicher Versuch sieht so aus: > if((PINC & (1 << PINC1)) && (PINB & !(1 << PINB1))){ PORTD |= (1<<PD1); > Der Knackpunkt liegt darin, dass du die Formulierung
1 | |
umformulierst in
1 | |
Warum ist das so? WEil du mittels if( iregendetwas & ( 1 << Pinnummer ) ) aubfragst ob etwas high ist. Ob dieses etwas low ist, ist dann einfach die gegenteilige Bedingung if( !( irgendetwas & ( 1 << Pinnummer ) ) aber die 'Phrase'
1 | |
die musst du so wie sie ist erhalten. Denn die isoliert dir dieses eine bestimmte Bit aus dem irgendetwas. Und erst dann, wenn du dieses Bit hast, kannst du entscheiden und abfragen ob dieses Bit jetzt 0 oder nicht 0 sein soll.
Danke für die schnellen antworten Unb besonderen Dank and die schöne Erklährung von Herrn Buchegger. Diese "irgendwas" Erklährungen liegen mir auch total ;-) Nein erlich - vielen Dank, habe es glaube verstanden und versuche es gleich mal umzusetzen.
irgend was passt trotzdem noch nicht... Ziel sol es sein einen einfachen Motor anzusteuern. Die H-Brücke für den Motor hängt an D0 und D1. Der Atmega bekommt seinen Befehl von einem Weiteren Controler der ihm sagt in welche Richtung der Atmega den Motor drehen lassen soll. Bevor das alles los geht gibt es eine Initialisierung wo der Motor so lange Richtung Kältebad fährt bis ein Arm einen Taster auslöst. Damit soll der Atmega wissen das der Motor nun im Kältebad ist. Also drehe so lange nach links bis B0 ein high bekommt.
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
28 | |
29 | |
30 | |
31 | |
32 | |
33 | |
34 | |
35 | |
36 | |
37 | |
38 | |
39 | |
40 | |
41 | |
42 | |
43 | |
44 | |
45 | |
46 | |
47 | |
48 | |
49 | |
50 | |
51 | |
52 | |
53 | |
54 | |
55 | |
56 | |
57 | |
58 | |
59 | |
60 | |
Was jetzt genau dein Problem ist, hab ich auch noch nicht heraus. Da muss ich deine Fehlerbeschreibung noch weiter studieren. Und bitte: Sag nicht 'da passt noch irgendewtwas noch nicht', denn darunter kann sich auf dieser Seite des Monitors keiner etwas vorstellen. Aber eines gleich mal vorweg
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
Frag nicht zuviel ab! Das else ist schon erfunden. Wenn ein bestimmtes Bit nicht 1 ist, dann muss es 0 sein. Eine andere Möglichkeit gibt es nicht! Anstelle das du da haufenweise Bedingungen abprüfst, die man bei der Fehlersuche alle wieder einzeln untersuchen und überlegen muss, schreib doch einfach else, dann ist nämlich alles klar.
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
und dann sieht man jetzt nämnlich auch: Egal ob das Bit HIgh oder Low ist, du breakst dich in jedem Fall aus der SChleife raus. In diesem Fall wäre es überhaupt besser, auf das break zu verzichten. Mach es doch weniger kompliziert so
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
das ist einfach, simpel, überschaubar und man muss nicht dauernd um die Ecke denken, wann und wo jetzt welche Schleife aus welchem Grund verlassen wird. Zudem entspricht das besser dem, wie man wohl als Mensch an die Sache rangehen würde.
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
Die beiden "if" haben genau komplementäre Bedingungen und in beiden Code-Blöcken steht ein "break". Also wird die umgebende Endlosschleife nur einmal durchlaufen (außer der Pin ändert genau dazwischen den Zustand). Wohl kaum das, was du eigentlich haben wolltest.
1 | |
2 | |
3 | |
4 | |
In den Kommentaren stehen unterschiedliche Bedingungen, die if-Bedingungen sind aber identisch. Wie passt das zusammen?
1 | |
2 | |
3 | |
4 | |
Dito.
ok, habe das mal so weit umgesetzt. das mit dem if und else und dem break verstehe ich auch. Blöd ist nur das Zeile 27 doch dazu führen müste das der Motor erst mal in eine Richtung los dreht so lange der Positionstatster nicht erreicht wurde..aber er dreht gar nicht erst los:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
Den 2ten Teil von Stefan verstehe ich nicht so ganz... es sind doch unterschiedliche dinge die ich in den if Bedingungen möchte... Kanst Du mir das genauer erklären wo ich da falsch denke.
Wie Stefan schon schrieb. Bei dem 2.ten Teil des Programms hast du dich durch übermässige unübersichtliche Vergleiche mächtig selbst ausgetrickst. Das würde ich dir empfehlen: SChmeiss es weg und schreib es nochmal neu. Aber trenne diesmal die Dinge. In deinen Abfragen kommt immer wieder der Teil (falls ccw vom Mainframe vor). Daskann man auch durchaus herausziehen
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
tricks dich nicht selber mit übermässig komplexen Abfragen aus! Ein gutes Programm ist nicht eines, bei dem möglichst viel in einer Zeile steht und die man erst 2 Minuten studieren muss um sie zu verstehen und zu entschlüsseln! Ein gutes Programm liest sich wie eine Geschichte und ist leicht zu verstehen.
Rocco L. schrieb: > Blöd ist nur das Zeile 27 doch dazu führen müste das der Motor erst mal > in eine Richtung los dreht so lange der Positionstatster nicht erreicht > wurde..aber er d reht gar nicht erst los: zeig bitte alles! hast du die SChleife noch? WIe sieht die jetzt aus. Wie ich weiter oben schon gesagt habe: Formuliere das alles um! Dein Programm ist viel zu kompliziert und unübersichtlich und die Komplexität erschlägt dich im Moment noch
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
Ich werde dem Ratschlag folgen und es noch mal neu probieren. Übung macht je den Meister - und mir kann sie ja nicht schaden. Danke für die Hilfe und bis dann. fG Rocco
Karl heinz Buchegger schrieb: > ; // nichts tun und den Motor fahren lassen ^^das geht? ich meine, ist das C? Möchte noch sagen das ich mir alles selber angelesen habe und es nicht gelernt habe... es soll also keine Verbesserung sein sondern wirklich eine interessierte Frage
Rocco L. schrieb: > Karl heinz Buchegger schrieb: >> ; // nichts tun und den Motor fahren lassen > > ^^das geht? ich meine, ist das C? Ja klar. C kennt die leere Anweisung, also einen einzelnen ; Den Fehler macht wohl jeder mal
1 | |
2 | |
und der einzelne Strichpunkt am Zeilenende vom if verändert die logische Struktur :-) wenn es dir mehr hilft, dann schreibs halt so
1 | |
2 | |
3 | |
Gast
#2041839
Karl heinz Buchegger schrieb: > wenn es dir mehr hilft, dann schreibs halt so
1 | |
2 | |
3 | |
Ggf. hilft es auch dem Compiler. Bei neueren GCC-Versionen bekommt man bei der Variante mit dem Semikolon eine (meiner Meinung nach unsinnige) Warnung, die einem vorschlägt, stattdessen die Klammern zu verwenden.
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.