- LiTime Speicher und Akkus         
Ergebnis 1 bis 7 von 7

Thema: If problem beim Schieberegister

  1. #1

    If problem beim Schieberegister

    Anzeige

    Powerstation Test
    C ist böse nein spaß

    Also da gibts ein sehr interesanntes problem beim ansteuern des schieberegisters.
    Wenn ich das Programm Simuliere will das ding nicht in die else abschnit springen es springt dierekt eins drunter.
    Hab ich was übersehen?

    Code:
    void Latch_Serialout(uint8_t DATA){
    	uint8_t Puffer = 1;
    	uint8_t Bitmask = 1;
    	PORTD &= ~(1<<PD1); //Serial clock Down
    	for (uint8_t x = 0;x < 8;x++)
    	{
    		Puffer = (DATA & Bitmask);
    		if (Puffer == 1)
    			PORTD |= (1<<PD0); //setzen;
    		else
    			PORTD &= ~(1<<PD0);
    		PORTD |= (1<<PD1); //setzen
    		PORTD &= ~(1<<PD1); //Rücksetzen
    		Bitmask = (Bitmask << 1);
    	}
    }

  2. #2
    Benutzer Stammmitglied
    Registriert seit
    16.04.2011
    Beiträge
    78
    Naja, wenn dein DATA nicht ebenfalls 1 ist, wird der else-Abschnitt ausgeführt.

    MfG Nik

  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    20.08.2008
    Ort
    Karlsruhe
    Alter
    36
    Beiträge
    1.225
    Zitat Zitat von Mathhias_199 Beitrag anzeigen
    Hab ich was übersehen?
    Ja. Du schiebst deine Bitmaske durch die Gegend, der Wert den du dann ausmaskierst ist aber nicht mehr gleich eins, sondern 2^n. Korrekt wäre:
    if (Puffer != 0) ...

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

  4. #4
    Erfahrener Benutzer Roboter Genie Avatar von robocat
    Registriert seit
    18.07.2006
    Beiträge
    935
    Beim ersten Bit (Bitmask=1) sollte es funktionieren, danach schiebst du allerdings Bitmask nach links, was zur Folge hat, dass "if(DATA & Bitmask==1){..}" nicht mehr erfüllt sein kann. Man würde wohl eher DATA nach rechts durchschieben und immer mit "if(DATA & 1==1){..}" prüfen.

  5. #5
    Youp ist mir klar war aber auch nicht fertig

    Code:
    void Latch_Serialout(uint8_t DATEN){
        PORTD &= ~(1<<PD1); //Serial clock Down
        uint8_t Puffer = 0;
        uint8_t Bitmask = 1;
        for (uint8_t x = 0;x < 8;x++)
        {
            Puffer = (DATEN & Bitmask);
            if ((Puffer == 1)||(Puffer == 2)||(Puffer == 4)||(Puffer == 8)||(Puffer == 16)||(Puffer == 32)||(Puffer == 64)||(Puffer == 128)){
                PORTD |= (1<<PD0); //setzen;
            }            
            else{        
                PORTD &= ~(1<<PD0); //Rüsetzen
            }            
            PORTD |= (1<<1); //setzen
            PORTD &= ~(1<<1); //Rücksetzen
            Bitmask = (Bitmask << 1);
        }
    }
    Der Simulator überspringt zuteil die Portsetz befehle mach ich da etwas falsch?

    EDIT: Kleines Beispiel wenn ich mit dem wert 255 in die Funktion gehe fängt meine bitmaske den Wert ab und der Puffer == 1 tritt ein.
    Das klappt auch aber der simulator überspringt dann
    PORTD |= (1<<PD1); //setzen
    und macht gleich
    PORTD &= ~(1<<PD1); //Rücksetzen

    Das ist natürlich doof den das latch bekommt dann keinen ganten takt

    EDIT:
    @ robocat deine idde find ich cool mit dem Daten nach rechts schieben.
    Aber im 255 fall funktioniert das ja nicht mehr weil das 7 bit 1 ist und doch 1er nachgeschoben werden. oder ist das beim AVR anders?

    EDIT:
    Ok es ist scheinbar anders bzw liegt am unsiend ... ich hab wohl nur siend geschiftet
    Code:
    void Latch_Serialout(uint8_t DATEN)void Latch_Serialout(uint8_t DATEN)
    {
    	PORTD &= ~(1<<PD1); //Serial clock Down
    	for (uint8_t x = 0;x < 8;x++)
    	{
    		if ((DATEN & 1) == 1){
    			PORTD |= (1<<PD0); //setzen;
    		}					
    		PORTD |= (1<<PD1); //setzen
    		PORTD &= ~(1<<PD1); //Rücksetzen
    		PORTD &= ~(1<<PD0); //Rüsetzen
    		DATEN = (DATEN >> 1);
    	}
    }





    Sieht jetz auch viel sauberer aus und braucht keine extra variablen mehr


    Geändert von Mathhias_199 (31.03.2013 um 01:22 Uhr)

  6. #6
    Erfahrener Benutzer Roboter Genie Avatar von robocat
    Registriert seit
    18.07.2006
    Beiträge
    935
    Zum einen schiebst du ja (max. 7 mal) nach rechts, da kann es egal sein, ob Einsen nachkommen, wenn du immer nur das letzte Bit prüfst. Zum anderen, ich vermute sehr, dass Null-Bits nachgeschoben werden, weiss aber nicht, ob das in ANSI-C eindeutig definiert ist.

    PORTD |= (1<<1); //setzen
    PORTD &= ~(1<<1); //Rücksetzen
    das wird ohne kleines Delay nicht klappen, vermute ich.

    Grüße

  7. #7
    Also erstmal frohe Ostern
    Dann danke für die Hilfe.

    Jop da haste recht es kann mir egal sein.
    Was ich mir aber sicher bin wenn du bei signed nach rechts shiftest und das signed bit 1 ist schiebt der rechner zumindest 1 nach, wär ja blöd wenn du das minus verlierst.
    Und es kann mir auch egal sein das Q7 und Q0 --- usw halt vertauscht werden, da es eh für ne 7 segment ansteuerung gedacht ist

    MFG Matze

    PS wie kann mann den hier im bord sein post auf erledigt setzen?

Ähnliche Themen

  1. Problem beim Compilieren
    Von KingKaiser im Forum Asuro
    Antworten: 9
    Letzter Beitrag: 15.01.2012, 20:02
  2. Problem beim Konfigurieren von TIMER1 beim M32-Board
    Von dirty_bird_981 im Forum Robby RP6
    Antworten: 8
    Letzter Beitrag: 10.01.2012, 23:52
  3. Schieberegister - Portzustand beim "rausschieben"
    Von VictimOfMyOwn im Forum Elektronik
    Antworten: 9
    Letzter Beitrag: 17.06.2006, 15:29
  4. ULN und Schieberegister problem
    Von colaturka im Forum Elektronik
    Antworten: 1
    Letzter Beitrag: 26.03.2006, 14:44
  5. Antworten: 9
    Letzter Beitrag: 14.03.2005, 21:08

Berechtigungen

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

LiTime Speicher und Akkus