- fchao-Sinus-Wechselrichter AliExpress         
Ergebnis 1 bis 10 von 14

Thema: Pinabfrage mehrerer Pins

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    10.02.2011
    Beiträge
    26

    Pinabfrage mehrerer Pins

    Tag zusammen! Ich möchte PORTB 1 bis 4 abfragen?
    Habe schon vieles probiert aber nichts hat wirklich funktioniert!

    Hier mein letzter versuchUnd wenn das denn mal geht.... giebt es eine kürzere Möglichkeit???)

    Code:
    int anzahl_Zyl(void)        //fragt BP1-PB4 ab und giebt Einstellung Zylinderanzahl zurück
    {
    
    DDRB |= 0x00;   
    int a = 0;
                                                                                                     //PORTB   765 4 321 0
    if((PINB |= ~(1<<PINB1) && (PINB |= ~(1<<PINB2) && (PINB |= ~(1<<PINB3) && (PINB &   (1<<PINB4))a =1;    //000 1 000 0
    if((PINB |= ~(1<<PINB1) && (PINB |= ~(1<<PINB2) && (PINB &   (1<<PINB3) && (PINB |= ~(1<<PINB4))a =2;    //000 0 100 0
    if((PINB |= ~(1<<PINB1) && (PINB |= ~(1<<PINB2) && (PINB &   (1<<PINB3) && (PINB &   (1<<PINB4))a =3;    //000 1 100 0
    if((PINB |= ~(1<<PINB1) && (PINB &   (1<<PINB2) && (PINB |= ~(1<<PINB3) && (PINB |= ~(1<<PINB4))a =4;    //000 0 010 0
    if((PINB |= ~(1<<PINB1) && (PINB &   (1<<PINB2) && (PINB |= ~(1<<PINB3) && (PINB &   (1<<PINB4))a =5;    //000 1 001 0
    if((PINB |= ~(1<<PINB1) && (PINB &   (1<<PINB2) && (PINB &   (1<<PINB3) && (PINB |= ~(1<<PINB4))a =6;    //000 0 110 0
    if((PINB |= ~(1<<PINB1) && (PINB &   (1<<PINB2) && (PINB &   (1<<PINB3) && (PINB &   (1<<PINB4))a =7;    //000 1 110 0
    if((PINB   & (1<<PINB1) && (PINB |= ~(1<<PINB2) && (PINB |= ~(1<<PINB3) && (PINB |= ~(1<<PINB4))a =8;    //000 0 001 0
    if((PINB   & (1<<PINB1) && (PINB |= ~(1<<PINB2) && (PINB |= ~(1<<PINB3) && (PINB &   (1<<PINB4))a =9;    //000 1 101 0
    if((PINB   & (1<<PINB1) && (PINB |= ~(1<<PINB2) && (PINB &   (1<<PINB3) && (PINB |= ~(1<<PINB4))a =10;   //000 0 101 0
    if((PINB   & (1<<PINB1) && (PINB |= ~(1<<PINB2) && (PINB &   (1<<PINB3) && (PINB &   (1<<PINB4))a =11;   //000 1 101 0
    if((PINB   & (1<<PINB1) && (PINB &   (1<<PINB2) && (PINB |= ~(1<<PINB3) && (PINB |= ~(1<<PINB4))a =12;   //000 0 011 0
    
    return a;
    
    }
    Und die einzelne Abfrage eines Pins auf logisch 0 habe ich bis jetzt auch nicht gefunden!

    Grüße Stephan
    Geändert von masterx (07.03.2011 um 18:42 Uhr)

  2. #2
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    09.02.2005
    Ort
    München
    Alter
    40
    Beiträge
    389
    Hallo Stephan,
    für die Abfrage eins Pins ist das von dir verwendete Verfahren ok aber da du ja eine genau Vorstellung hast wie der ganze Port ausschauen muss würde ich anders vorgehen.
    Code:
        uint8_t Test=0, a=0;
        while(1)
        {
            Test=PINB; // Das Register in einer Variable speichern 
            Test &=0b00011110; //unwichtige Bits ausmaskieren
            
            switch(Test) //Switch case Abfrage
            {
                case 0b00010000: a=1;break;
                case 0b00001000: a=2;break;
                default: a=199; 
            } 
        }
    Habs grade im Simulator ausprobiert geht 1A

    Gruß Matthias

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    10.02.2011
    Beiträge
    26
    Erstmal vielen Dank!
    Werden durch das Maskieren die bits gesetzt?
    Weil auf dem port noch die Abfrage eines Tasters zur Led Beleuchtung liegt und wenn das Bit gesetzt würde geht das LCD immer an und aus weil alles in einer Schleife läuft!

    Grüße Stephan

  4. #4
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    09.02.2005
    Ort
    München
    Alter
    40
    Beiträge
    389
    Nein, du maskierst ja nur die Variable "Test".
    Das eigentliche maskieren und Speicher wäre auch in einem Schritt möglich mit
    Test= PINB & 0b0011110;
    Zur Übersichtlichkeit habe ichs mal in zwei Zeilen geschrieben.

    Gruß Matthias

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    10.02.2011
    Beiträge
    26
    Jetzt bin ich leider völlig durcheinander!
    Was bedeutet den Maskieren??
    Bewirkt es ,das nur PB1-PB4 abgefragt werden und dann in Test geschrieben werden???

    Also ich stelle mit Jumpern die Zustände an den Pins ein und das Programm sol darauf reagieren....
    Es währe sehr schlecht wenn ich bei oder vor der Abfrage Portpins ändere!!!

    Tut mir leid ich bin nicht ganz so schnell von kp!!

    Viele Grüße Stephan

  6. #6
    Erfahrener Benutzer Robotik Einstein Avatar von Felix G
    Registriert seit
    29.06.2004
    Ort
    49°32'N 8°40'E
    Alter
    42
    Beiträge
    1.780
    Also beginnen wir mal mit der Abfrage auf logisch 0...
    die geht genauso wie die Abfrage auf logisch 1, nur mit einem ! davor
    Code:
    !(PINB   & (1<<PINB1))
    Weiter geht's mit deinem Code, der in dieser Form nicht funktionieren kann (hauptsächlich wegen der fehlerhaften Abfrage auf logisch 0).
    Außerdem passen die Kommentare nicht so ganz, daher habe ich versucht das nochmal etwas übersichtlicher darzustellen:

    Code:
    //PORTB 1234
    //      0001
    //      0010
    //      0011
    //      0100
    //      0101
    //      0110
    //      0111
    //      1000
    //      1001
    //      1010
    //      1011
    //      1100
    Dabei werden 2 Dinge offensichtlich:
    1. Das wären die Zahlen von 1 bis 12 im Binärformat...
    2. wenn die Bits nicht "rückwärts" angeordnet wären

    Kannst du das noch ändern, oder ist die Zuordnung so festgelegt?
    Denn falls die Reihenfolge anders wäre, könnte man deine Funktion bis auf das hier reduzieren:

    Code:
    int anzahl_Zyl(void)        //fragt BP1-PB4 ab und giebt Einstellung Zylinderanzahl zurück
    {
        DDRB |= 0x00;   
        return ((PINB & 0x1E) >> 1);
    }
    So viele Treppen und so wenig Zeit!

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    10.02.2011
    Beiträge
    26
    Habe gerade eine Antwort geschrieben ,aber das System hat mich raus gekickt!
    Ich gebe an PB1- BP4 per Jumper einen Binären Wert von 1-12 vor(Anordnung PortB 01234567 auf der Platine), da ich das zählen von rechts nach links gewöhnt bin --->der gedrehte code !
    Die Funktion muß diesen Binären Wert dann als Int-Wert zurückgeben!
    Die anderen Port-Pins dürfen auf gar keinen Fall mit abgeprüft werden!!!Weil sie sich willkürlich ändern!

    Grüße Stephan

  8. #8
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    09.02.2005
    Ort
    München
    Alter
    40
    Beiträge
    389
    Maskieren bedeutet das Anwenden eine Binären Operation auf ein Byte und einer Definierten Maske(Bitmuster) die nur die Relevanten Bit anzeigt und alle anderen auf 0 (oder 1 je nach Einsatzzweck) setzt.
    http://de.wikipedia.org/wiki/Bitmaske


    Gruß Matthias

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Labornetzteil AliExpress