PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : If problem beim Schieberegister



Mathhias_199
30.03.2013, 16:26
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?


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);
}
}

Liquidator
30.03.2013, 19:00
Naja, wenn dein DATA nicht ebenfalls 1 ist, wird der else-Abschnitt ausgeführt.

MfG Nik

markusj
30.03.2013, 19:34
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

robocat
30.03.2013, 19:35
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.

Mathhias_199
30.03.2013, 23:17
Youp ist mir klar war aber auch nicht fertig :)


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 (https://www.roboternetz.de/community/members/21936-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

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

robocat
31.03.2013, 00:54
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

Mathhias_199
31.03.2013, 11:29
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?