- LiTime Speicher und Akkus         
Ergebnis 1 bis 7 von 7

Thema: bitmuster durchschieben (Port)

  1. #1
    Erfahrener Benutzer Roboter Genie Avatar von oderlachs
    Registriert seit
    17.05.2010
    Ort
    Oderberg
    Alter
    73
    Beiträge
    1.175
    Blog-Einträge
    1

    bitmuster durchschieben (Port)

    Anzeige

    Praxistest und DIY Projekte
    Wer kann mir bitte mal weiter helfen , komme mit der Bitmanipulation nicht so klar. ich möchte ein gewisses Bitmuster durch einen Port(LED beschaltet) schieben, bin am verzweifeln. Vielleicht sind auch meine Gedankengänge falsch....
    Es ändern sich nur die untersten 4 Bit(PortPins)
    Code:
    //CPU ATMega8515
    
    int main( void )
    {
        DDRC =  0xFF ;       // PC0 an PORTC als Ausgang setzen
        PORTC = 0xFF;       // Alle PIN C auf High =LED Aus (STK500)
       
        while(1)                  // Endlosschleife
        {   
                    
        PORTC =  (1<< PORTC)   // 1 Durchschieben ???
        _delay_ms(100);           // Eine Sekunde warten...
           
        }
     
        return 0;
    }
    ich danke schon mal den netten Helfern!

    Gerhard
    Arduinos, STK-500(AVR), EasyPIC-40, PICKIT 3 & MPLABX-IDE , Linux Mint

  2. #2
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Code:
    //CPU ATMega8515
    
    int main( void )
    {
        DDRC =  0xFF ;       // PC0 an PORTC als Ausgang setzen
        PORTC = 0xFF;       // Pin PC0 auf high setzen
    
        while(1)                  // Endlosschleife
        {
    
        _delay_ms(1000);           // Eine Sekunde warten...
        PORTC =  (PORTC << 1)   // Portstatus einlesen, Bits nach links schieben und ausgeben
    
        }
    
        return 0;
    }
    (ungetestet)

    Wieviele LED sind es denn und an welchen Pins sind sie angschlossen?
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    20.08.2008
    Ort
    Karlsruhe
    Alter
    36
    Beiträge
    1.225
    Dein Code funktioniert nicht, weil du eine "1" um den Wert des Bitmusters verschiebst. Radbruch hat vergessen, das oberste Bit wieder an den Anfang zurückzuführen.

    Code:
    //CPU ATMega8515
    
    include <stdint.h>
    
    int main( void )
    {
        DDRC =  0xFF ;       // PC0 an PORTC als Ausgang setzen
        PORTC = 0xFF;       // Alle PIN C auf High =LED Aus (STK500)
    
        PORTC &= ~(1 << 0); // Erstes Bit löschen -> Bitmuster mit einer laufenden LED
       
        while(1)                  // Endlosschleife
        {   
            const uint8_t pattern = PORTC;
    
            PORTC = (pattern << 1) | ((pattern & (1 << 7)) >> 7); // Alle Bits um eins nach links schieben, oberstes Bit maskieren und ganz nach rechts schieben
            _delay_ms(100);           // Eine Sekunde warten...
           
        }
     
        return 0;
    }
    Tiny ASURO Library: Thread und sf.net Seite

  4. #4
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Hab ich nicht "vergessen" sondern weggelassen
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  5. #5
    Erfahrener Benutzer Roboter Genie Avatar von oderlachs
    Registriert seit
    17.05.2010
    Ort
    Oderberg
    Alter
    73
    Beiträge
    1.175
    Blog-Einträge
    1
    Vielen Dank Euch beiden, habe das Bsp von Marcus reinkopiert funzt bestens !!!
    das Dumme dabei ist nur noch das ich nicht kapiere was da so passiert oder wie ich ein anderes (bestimmtes) Bitmuster auf diese Art und Weise durchlaufen lasse.
    Natürlich ich teste jetzt nur auf einem STK500 mit den 8 LED. Es geht mir ums Verstehen der Sache, um später es in anderen Anwendungen (Lichtschlauch, o.ä. ) anzuwenden.
    Ich hatte damals Ausbildungszeit leider einen Unfall, das war dann das Ende, so habe ich die Binäre Programmierung in C nicht mehr mitbekommen, nun möchte ich es selber noch nachholen, des Lernen wegens und der Interesse daran. Aber ich hatte beim Binären schon immer meine Probleme....
    Na werde mich durchkämpfen...und viel hier lesen

    Danke

    Gerhard
    Arduinos, STK-500(AVR), EasyPIC-40, PICKIT 3 & MPLABX-IDE , Linux Mint

  6. #6
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    20.08.2008
    Ort
    Karlsruhe
    Alter
    36
    Beiträge
    1.225
    Zitat Zitat von radbruch Beitrag anzeigen
    Hab ich nicht "vergessen" sondern weggelassen
    Pardon.

    @Gerhard:

    Im Grunde ist es ziemlich einfach. Du hast im Register ein Bitmuster stehen: 76543210
    Jeder der Zahlen steht für ein Bit das entweder 0 oder 1 sein kann. Wenn du jetzt darauf den Schiebe-Operator anwendest, passiert folgendes:
    76543210 << 1 (einmal nach links schieben) wird zu 6543210_, wobei die "Fehlstelle" _ den Wert 0 hat. Der Schiebeoperator füllt in beide Richtungen immer mit Nullen auf.
    Dementsprechend wird 76543210 >> 1 (einmal nach rechts schieben) wird zu _7654321

    So, du wolltest das Muster nach links wandern lassen, bekommst also 6543210_. Um jetzt den Wert der ursprünglich in Bit 7 stand ganz ans Ende zu bekommen, sind folgende Schritte nötig:
    1. Ausmaskieren von Bit 7: 76543210 & (1 << 7) entspricht 76543210 & 1000000 (Bitmaske!) und wird damit zu 7_________ (_ haben den Wert 0)
    2. Verschieben der Maske nach rechts: 7_______ >> 7 wird zu _______7 (wie oben, die nachgerückten Bits haben den Wert 0)
    3. Binäres Oder mit dem ursprünglichen Wert 6543210_: 6543210_ | _______7 wird zu 65432107. Damit ist alles einmal nach links gewandert und das Bit von Position sieben steht jetzt ganz rechts. Das funktioniert, weil überall wo ein Unterstrich stand, das Bit den Wert 0 hatte. X | 0 ist nur genau dann 1 wenn X den Wert 1 hat.

    Hoffe das hilft etwas weiter.

    mfG
    Markus
    Tiny ASURO Library: Thread und sf.net Seite

  7. #7
    Erfahrener Benutzer Roboter Genie Avatar von oderlachs
    Registriert seit
    17.05.2010
    Ort
    Oderberg
    Alter
    73
    Beiträge
    1.175
    Blog-Einträge
    1
    Hallo Markus !
    ich möchte Dir ein grosses Dankeschön sagen für Deine Hilfe !!! Ich denke damit kann ich jetzt mir einiges beim Probieren erklärlicher machen.

    Gruss und Dank

    Gerhard
    Arduinos, STK-500(AVR), EasyPIC-40, PICKIT 3 & MPLABX-IDE , Linux Mint

Ähnliche Themen

  1. Bitmuster auf verschiedene Ports aufteilen
    Von Arkon im Forum C - Programmierung (GCC u.a.)
    Antworten: 4
    Letzter Beitrag: 27.10.2011, 20:53
  2. Bitmuster für 5-Pin Stepper?
    Von Jacob2 im Forum Motoren
    Antworten: 8
    Letzter Beitrag: 28.04.2009, 11:07
  3. ATMEGA16 Bitmuster am Eingang mit Analogwert multiplizieren
    Von alze1970 im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 1
    Letzter Beitrag: 17.05.2007, 16:05
  4. Welchen Port kann ich als PWM-Port benutzen?
    Von Zeroeightfifteen im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 6
    Letzter Beitrag: 26.12.2005, 14:01
  5. Bitmuster auswerten mit Bascom??
    Von michaelF im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 2
    Letzter Beitrag: 03.08.2004, 06:46

Berechtigungen

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

LiTime Speicher und Akkus