PINs in Variablen speichern und später vergleichen

OP #2552432
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
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
> 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
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
OP #2562494
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.
Moderator (Firma: Titel) Persönliche Seite #2562499
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
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
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

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.