- 3D-Druck Einstieg und Tipps         
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
    @Matthias habe deinen Code mal probieert und er funktioniert, dafür erstmal vielen Dank!
    @Felix ..habe noch mal den Code wie er funktioniert reingestellt... ich habe das mit dieser für mich tiefgreifenden Bitmanipulation auch wenn es nur ne Abfrage ist, echt noch nicht so gut raus!!! Aber ich arbeite dran! Versprochen.Mich würde noch mal interessieren was Deine Funktion genau macht???

    Vielen Dank euch beiden Grüße Stephan

    EDIT:
    Code:
    int anzahl_Zyl(void)        //fragt BP1-PB4 ab und giebt Einstellung Zylinderanzahl zurück
    {
    
    DDRB |= 0x00;    //0000 0000 -> 0 TIMER && Z-Interface ZYL 1 ; 1-4 BITs Portabfrage Anzahl Zylinder ,5 LCD on/off ,  5-7 ISP
    int a = 0;
    int test ;
    
    
    test=PINB;                 // Das Register in einer Variable speichern 
    test &=0b00011110;         //unwichtige Bits ausmaskieren
            
            switch(test) //Switch case Abfrage
            {
                
                case 0b00000010: a=1;break;
                
                case 0b00000100: a=2;break;
                
                case 0b00000110: a=3;break;
                
                case 0b00001000: a=4;break;
                
                case 0b00001010: a=5;break;
                
                case 0b00001100: a=6;break;
                
                case 0b00001110: a=7;break;
                
                case 0b00010000: a=8;break;
                
                case 0b00010010: a=9;break;
                
                case 0b00010100: a=10;break;
                
                case 0b00010110: a=11;break;
                
                case 0b00011000: a=12;break;
            }
                
    
    return a;
    
    }
    @Felix : Ich habe es glaube ich verstanden!!?? Dein Code funktioniert auch, habe es gerade getestet!
    Geändert von masterx (07.03.2011 um 23:29 Uhr)

  2. #2
    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
    Zitat Zitat von masterx Beitrag anzeigen
    @Felix ..habe noch mal den Code wie er funktioniert reingestellt... ich habe das mit dieser für mich tiefgreifenden Bitmanipulation auch wenn es nur ne Abfrage ist, echt noch nicht so gut raus!!! Aber ich arbeite dran! Versprochen.Mich würde noch mal interessieren was Deine Funktion genau macht???
    Meine Funktion macht das gleiche, nur kürzer

    Ich versuche mal das genauer zu erklären...
    Zuerst maskiere ich den Wert von PINB mit 0x1E, wodurch nur die interessanten Bits übrig bleiben
    Code:
    PINB & 0x1E
    0x1E ist die hexadezimale Schreibweise für 0b00011110, bis hierhin gibt es also noch keine Unterschiede.

    Die Bits 1 bis 4 enthalten jetzt schon die gesuchte Zahl, nur leider um 1 nach links verschoben. Daher schiebe ich die Zahl mit >> 1 an die richtige Stelle.


    edit:
    ehrlicherweise muss ich zugeben, daß es einen kleinen Unterschied gibt: meine Funktion akzeptiert auch die Werte 13, 14 und 15.
    Falls das ein Problem ist, müsste man sie also noch um ein if() erweitern
    So viele Treppen und so wenig Zeit!

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    10.02.2011
    Beiträge
    26
    Das macht nichts denn ich gebe es ja per Jumper vor, kann also nichts schief gehen!Das mit dem verschieben habe ich immer überlesen weil ich es einfach nicht begriffen habe!Werde das wohl so lange durchkauen müssen bis ichs drin habe!
    Ich begreife nur nicht wenn doch schon die gesuchte Zahl auf den Plätzen der Maskierten Einsen steht ,warum muß dann noch etwas verschoben werden??
    Aber das verstehe ich sicher wenn ich das mit dem Verschieben drauf habe...

    Vielen Dank nochmal an Euch für die Mühe, bis dahin viele Grüße Stephan

    EDIT: oder besser warum die Zahl um 1 nach links verschoben ist....

  4. #4
    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
    Aller Anfang ist schwer, aber keine Sorge das wird schon...

    Das Verschieben ist notwendig, weil nach dem Maskieren zwar alle "unerwünschten" Bits auf 0 gesetzt sind, aber trotzdem ist das ganze für den µC immernoch eine komplette 8-Bit Zahl (Er kann ja nicht wissen, daß Bit 0 für dich uninteressant ist). Wenn man alle Bits um 1 nach rechts schiebt ist das kein Problem mehr, denn dann stimmt der Wert auch wenn man alle 8 Bit auswertet.

    edit:
    die Zahl ist um 1 nach links verschoben, weil sie nicht bei Bit 0 beginnt, sondern bei Bit 1
    So viele Treppen und so wenig Zeit!

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    10.02.2011
    Beiträge
    26
    Ahhhh... also bestimmen die 1sen der Maske welche Bits sich ändern dürfen und weil ne00011110 als zahl in 8 Bit ja 1e ist wird nach dem verschieben dann eine ff daraus....

    Der Groschen ist gefallen!

  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 bestimmen die 1sen der Maske welche Bits sich ändern dürfen
    Ja, denn alle Bits die in der Maske 0 sind, werden auch im Ergebnis immer 0 sein. Nur da wo die Maske 1 ist, steht im Ergebnis das entsprechende Bit aus dem maskierten Wert.
    So viele Treppen und so wenig Zeit!

Berechtigungen

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

12V Akku bauen