Hallo, Wie kann ich den Zustand von 2 Pins (PORTB0 und PORTB1) in einer variablen abspeichern? Muss 2 Schleifen abfragen. und erst nach 3 sekunden soll etwas passieren. Desswegen wollte ich den zustand einmal abfragen und abspeichern und das ganze nach 3 sekunden nochmal tuen. (In der zwischenzeit läuft anderer Code ab). Diese beiden abgespeicherten werte. was ja nur 00 01 10 oder 11 sein kann, möchte ich dann auf gleihcheit überprüfen. sind die beiden variablen unterschiedlich. soll das programm fortgeführt werden, wenn sie aber gleich sind UND 01 oder 10 sind. soll in ein entsprechendes UP gesprungen werden. bei gleihcheit von 00 und 11 soll normal im code weiter gegangen werden. Dachte da irgendwie an eine Überprüfung und dann eine case anweisung? Vielen Dank
Tobias xxx schrieb: > Hallo, > > Wie kann ich den Zustand von 2 Pins (PORTB0 und PORTB1) in einer > variablen abspeichern? indem du dir eine Variable machst (welch Überraschung) und dort einfach den PIN Wert reinspeicherst uint8_t Variable; Variable = PINB; wenn du nur an 2 Bits interessiert bist, ist es vielleicht ganz hilfreich, sofort mal alle anderen Bits definiert auf 0 zu setzen Variable = PIND & ( 1 << PB7 | 1 << PB6 ); > Dachte da irgendwie an eine Überprüfung und dann eine case anweisung? was du immer mit deinem case hast :-)
> wenn du nur an 2 Bits interessiert bist, ist es vielleicht ganz > hilfreich, sofort mal alle anderen Bits definiert auf 0 zu setzen > > Variable = PIND & ( 1 << PB7 | 1 << PB6 ); Dein PIND wird warscheinlich ein PINB sein schätze ich mal. und alle anderen Bits auf 0 setzen? Die anderen Pins darf ich nicht verändern. Oder verstehe ich das falsch? Und ja was hab ich mit meiner case anweisung. Das ist halt eine der sachen, diewir in der schule schon genutzt haben und simpel ist. kann es natürlich auch mit if schleifen wieder abfragen.
Schon wieder übersehen das das ja quasi eine Maskierung ist ^^ Klappt alles supi. Jetzt kommt meine case anweisung oder if anweisung noch. mal schauen ob das auch was wird Vielen DANK
Hallo, ich habe dochnoch ein problem: Ich will 2 PINS abfragen und speichern, um sie hinterher zu vergleichen.
1 | uint8_t induk1; |
2 | uint8_t induk2; |
3 | uint8_t indukzwischen; |
4 | |
5 | int automatik(void) |
6 | {
|
7 | |
8 | induk1 = (PINB & ( 1 << PB0 )) | (PINB & ( 1 << PB1 )); //Zustand der Induktionseingänge in induk1 speichern |
9 | |
10 | for (autozaehl = 0; autozaehl < 3; autozaehl++) //Zählschleife für automatiklauf um auf ca. 3sekunden zu kommen. Delay zeit wird noch verändert |
11 | {
|
12 | automatiklauf(); |
13 | indukzwischen = (PINB & ( 1 << PB0 )) | (PINB & ( 1 << PB1 )); //Nochmal Induktionsschleifen abfragen und zwischen speichern |
14 | if (induk1 == indukzwischen) |
15 | {
|
16 | }
|
17 | else
|
18 | {
|
19 | automatik(); |
20 | }
|
21 | |
22 | if ((PINB & (1 << PINB6)) == 0 | ((PINB & (1 << PINB7)) == 0 )) //Wenn ein Betriebsartenpin auf 0 dann... |
23 | {
|
24 | i = 0; //setze i auf 0 und ... |
25 | //_delay_ms(50); //Entprellung
|
26 | return; //verlasse das UP udn geh zum main |
27 | }
|
28 | }
|
29 | |
30 | induk2 = (PINB & ( 1 << PB0 )) | (PINB & ( 1 << PB1 )); //Zustand der Induktionseingänge abfragen und in induk2 speichern |
31 | |
32 | if (induk1 == induk2) //sind induk1 und induk2 gleich |
33 | {
|
34 | if (induk1 == 0b00000001) //dann schau ob dieses bitmuster in induk1 vorliegt |
35 | linkslauf(); //wenn ja spring in linkslauf |
36 | else
|
37 | if (induk1 == 0b00000010) //wenn nicht guck ob dieses bitmuster anliegt |
38 | rechtslauf(); //und gehe wenn ja in den rechtslauf |
39 | else //ansonsten |
40 | return; //verlass das UP und geh in die Main zurück |
41 | }
|
42 | else //wenn die beiden werte nicht gleich sind... |
43 | {
|
44 | return; //.. geh aus dem UP zurück in die main |
45 | }
|
46 | |
47 | }
|
Kann mir wer sagen, warum meine Abfrage nie in den Elsezweig springt, obwohl ich die eingänge ändere und somit meine variablen mit unterschiedlichen Werten fülle. Vielen Dank
Tobias xxx schrieb: > if (induk1 == induk2) //sind induk1 und induk2 gleich Solche Kommentare sind UNNÖTIG und VERWIRREND und UNLESERLICH! > indukzwischen = (PINB & ( 1 << PB0 )) | (PINB & ( 1 << PB1 )); Das geht kürzer: indukzwischen = PINB & (1<<PB0 | 1<<PB1); > nie in den Elsezweig springt In welchen? Da sind so viele...
Hi,
1 | if (induk1 == indukzwischen) |
2 | {
|
3 | }
|
4 | else
|
5 | {
|
6 | automatik(); |
7 | }
|
hier wird nie in den elsezweig gesprungen, obwohl ich die beiden variablen unterschiedlich beschreiben lassen habe. Danke für den Tipp, das das speichern auch mit weniger code geht.
Habe gerade deine Kürzung des abspeicherns umgesetzt, und jetzt scheint es zu funktionieren. leider weiß ich nicht woran das liegen kann. Werde das nochmal auif herz und nieren testen. Danke
Tobias xxx schrieb: > hier wird nie in den elsezweig gesprungen Wie stellst du das fest? > obwohl ich die beiden variablen unterschiedlich beschreiben lassen habe. Wie stellst du das fest? > beschreiben lassen habe. Von wem? > Danke für den Tipp, das das speichern auch mit weniger code geht. Keine Ursache. Was ich da angewendet habe sind nur Kenntnisse von Bitmanipulation und Operatorenprioritäten http://de.wikibooks.org/wiki/C-Programmierung:_Liste_der_Operatoren_nach_Priorität
Ich habe das programm gedebugt mit dem avr studio im step betrieb also schritt für schritt. Und kurz vor der Abspeicherung habe ich das eine Bit manuell geändert. und vor der nächsten abspeicherung nochmal geändert, sodass die beiden variablen ja nicht gleihc sein können. Ne andere möglichkeit weiß ich nicht, da ich nicht weiß wo ich mir den Inhalt der von mir erstellten variablen mal angucken kann wärend ich das programm debugge. Aber habe jetzt ein bisschen was getestet und es scheint zu funktionieren.
Tobias xxx schrieb: > wo ich mir den Inhalt der von mir erstellten variablen mal angucken kann Im Watch-Fenster sollte das gehen...
Also unter watch 1 und watch2 steht garnix- und in der i/o view stehen ja sonstwas für bezeichnungen. Da weiß ich nicht wo ich unter den bits meine variable finden soll.
Hi >Also unter watch 1 und watch2 steht garnix- Klar. Da trägt man ja auch die Variablen ein, die man sehen möchte. >...und in der i/o view stehen ja sonstwas für bezeichnungen. Wenn dir das, was dort steht nichts sagt solltest du dich erst mal mit den Grundlagen beschäftigen. MfG Spess
Im Debugmodus: Variable markieren, rechtsklick-> "Add Watch" Gruß Jonas
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.