Forum: Mikrocontroller und Digitale Elektronik PINs in Variablen speichern und später vergleichen


von Tobias x. (dertobias)


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

von Karl H. (kbuchegg)


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 :-)

von Tobias x. (dertobias)


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.

von Tobias x. (dertobias)


Lesenswert?

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

von Tobias x. (dertobias)


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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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...

von Tobias x. (dertobias)


Lesenswert?

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.

von Tobias x. (dertobias)


Lesenswert?

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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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

von Tobias x. (dertobias)


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.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Tobias xxx schrieb:
> wo ich mir den Inhalt der von mir erstellten variablen mal angucken kann
Im Watch-Fenster sollte das gehen...

von Tobias x. (dertobias)


Lesenswert?

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.

von spess53 (Gast)


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

von Jonas B. (jibi)


Lesenswert?

Im Debugmodus: Variable markieren, rechtsklick-> "Add Watch"

Gruß Jonas

von Tobias x. (dertobias)


Lesenswert?

Vielen Dank

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
Noch kein Account? Hier anmelden.