PINs in Variablen speichern und später vergleichen

OP #2552432
Lesenswert?

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
#2552439
Lesenswert?

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 :-)
OP #2552464
Lesenswert?

> 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.
OP #2562482
Lesenswert?

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
Moderator (Firma: Titel) Persönliche Seite #2562499
Lesenswert?

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
OP #2562519
Lesenswert?

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.
Gast #2562579
Lesenswert?

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren