Naja, wenn dein DATA nicht ebenfalls 1 ist, wird der else-Abschnitt ausgeführt.
MfG Nik
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); } }
Naja, wenn dein DATA nicht ebenfalls 1 ist, wird der else-Abschnitt ausgeführt.
MfG Nik
Tiny ASURO Library: Thread und sf.net Seite
Youp ist mir klar war aber auch nicht fertig
Der Simulator überspringt zuteil die Portsetz befehle mach ich da etwas falsch?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); } }
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 00:22 Uhr)
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.
das wird ohne kleines Delay nicht klappen, vermute ich.PORTD |= (1<<1); //setzen
PORTD &= ~(1<<1); //Rücksetzen
Grüße
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?
Lesezeichen