kleines Problem mit Schieberegister

Klaus.Ka

Level-1
Beiträge
124
Reaktionspunkte
8
Zuviel Werbung?
-> Hier kostenlos registrieren
huhu
ich bin gerade dabei ein kleines Schieberegister für eine Anlage zu programmieren.Leider macht er nicht das was ich vorhabe..

FUNCTION FC 1 : VOID
TITLE =Schieberegister
AUTHOR :
VERSION : 0.1

VAR_INPUT
DB_NR : INT ; //DB_NR des Schieberegisters
Laenge : INT ; //Länge des Schieberegisters
Eingabe : BYTE ; //Aktueller Wert
Schiebetakt : BOOL ; //Schiebetakt
END_VAR
VAR_IN_OUT
HM_Flanke : BOOL ;
END_VAR
VAR_TEMP
DB_Nummer : INT ; //Hilfsnummer
Schleifenzaehler : INT ;
Zeiger_lesen : DWORD ;
Zeiger_schreiben : DWORD ;
Adresse_erster_DS : DWORD ; //Adresse des Datensatzes
END_VAR
BEGIN
NETWORK
TITLE =DB aufschlagen
L #DB_NR;
T #DB_Nummer;
AUF DB [#DB_Nummer];
NETWORK
TITLE =Länge des Schieberegister prüfen
L #Laenge;
L 1;
==I ;
SPB Lae1;
NETWORK
TITLE =Länge des Schieberegisters berechnen
L #Laenge;
+ -1;
SLD 3;
T #Adresse_erster_DS;
// Lesezeiger initialisieren
L P#1.0;
T #Zeiger_lesen;
// Schiebetakt generieren
U #Schiebetakt;
FP #HM_Flanke;
SPBN Ende;
NETWORK
TITLE =Schleife für Schieberegister
L #Laenge;
+ -1;
schl: T #Schleifenzaehler;
L #Zeiger_lesen;
SRD 3;
+ 1;
SLD 3;
T #Zeiger_schreiben;
L DBB [#Zeiger_lesen];
T DBB [#Zeiger_schreiben];
// neuen Lesezeiger berechnen (1 Byte erhöhen)
L #Zeiger_lesen;
SRD 3;
+ 1;
SLD 3;
T #Zeiger_lesen;
L #Schleifenzaehler;
LOOP schl;
Ende: NOP 0;
NETWORK
TITLE =Aktuellen Wert ins Schieberegister schreiben
Lae1: L #Eingabe;
T DBB [#Adresse_erster_DS];
END_FUNCTION

Vielleicht hat hier jemand eine Idee was ich falsch gemacht habe...
danke im voraus
ciao
klaus.ka
 
frage: was macht er denn nicht?

hinweis: deine adressberechnung ist ziemlich aufwendig um nicht zu sagen kompliziert ...

bitte: code-tags benutzen!
 
huhu vierlagig
sorry er schiebt den wert nicht weiter...
warum aufwendig bzw kompliziert?
hast du nen besseren vorschlag?
ciao
klaus.ka

Schiebt er ihn gar nicht, oder steht hinterher etwas Falsches drin? Ich hab den Code nur mal so überflogen.

Du schiebst immer von:

1 nach 2
2 nach 3
3 nach 4
4 nach 5
...

Wenn du also in 1 eine 15 stehen hast, wird die in einer Schleife (1 Schiebetakt) komplett durchgeschoben, bleibt aber auf 1 erhalten, da sie dort nicht gelöscht wird.
Du mußt hinten anfangen zu schieben:

...
6 nach 7
5 nach 6
4 nach 5
3 nach 4
2 nach 3
1 nach 2
1 löschen
 
Zuviel Werbung?
-> Hier kostenlos registrieren
huhu vierlagig
werd mir deinen code mal anschauen....

huhu ralle
nein der code wird einmal eingetragen und bleibt und bleibt dann dort...
eigentlich sollte das schieberegister rückwärts laufen also von 15 nach 1
:confused:
ciao
klaus.ka
 
huhu vierlagig
werd mir deinen code mal anschauen....

huhu ralle
nein der code wird einmal eingetragen und bleibt und bleibt dann dort...
eigentlich sollte das schieberegister rückwärts laufen also von 15 nach 1
:confused:
ciao
klaus.ka

Wo trägst du den Code ein, an Stelle 1 des SR?, da bleibt er auch, da er da ja nie gelöscht wird.

Du fängst an mit Zeiger_lesen P#1.0 daraus Zeiger schreiben (+1) macht P#2.0. In der nächsten Schleife erhöhst du um 1, also lesen: P#2.0. Schreiben P#3.0.
Damit jagst du den Wert an P#1.0 bei einem kompletten Schleifendurchlauf einmal durch dein Schieberegister. Das ist so sicher nicht gewollt oder?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wo trägst du den Code ein, an Stelle 1 des SR?, da bleibt er auch, da er da ja nie gelöscht wird.

Du fängst an mit Zeiger_lesen P#1.0 daraus Zeiger schreiben (+1) macht P#2.0. In der nächsten Schleife erhöhst du um 1, also lesen: P#2.0. Schreiben P#3.0.
Damit jagst du den Wert an P#1.0 bei einem kompletten Schleifendurchlauf einmal durch dein Schieberegister. Das ist so sicher nicht gewollt oder?

huhu ralle
stimmt du hast recht aber ich versteh net warum er nicht bei p#1.0 anfängt sondern bei p#10.0 und nicht richtig arbeitet.
irgendwo seh ich den wald vor lauter bäumen nicht.muß glaub ich nochmal neu anfangen...
ciao
klaus.ka
 
Wenn ich das richtig sehe, willst du ja von links nach rechts also vom Ende zum Anfang schieben. Du stellst deinen Wert z.Bsp. in 10 ein und schiebst in dann Richtung 1, also vom "höheren" Speicheort zum "niedrigeren", richtig?

dann mußt du deine Lesen- und Schreiben-Zeiger anders berechnen.

Mit dem hohen Wert anfangen, z.Bsp 10, bei Länge 10 des SR:

2 nach 1 (2-->lesen, 1-->schreiben)
3 nach 2
4 nach 3
...
9 nach 8
10 nach 9
neuer Wert in 10.
 
Zuletzt bearbeitet:
huhu ralle
ja genau von oben nach unten....
bin gerade wieder am ändern... mal schaun ob es klappt ;)
schönen sonntag
ciao
klaus.ka

Hab meinen Denkfehler gefunden....
JUhU
 
Zuletzt bearbeitet:
Zurück
Oben