PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Fertiges Programm vereinfachen?



Marc2007
12.12.2006, 11:35
Hallo zusammen,

habe mir in den letzten tagen ein Programm gemacht mit dem es mir möglich ist schrittmotoren zu steuern und das auf signale wie lichtschranke usw reagiert.

Leider bin ich noch " sehr frisch " beim programieren und bin noch nicht so vertraut mit einigen befehlen ...
deswegen sieht mein Programm auch zimlich "verwierend" und sehr lang aus ?!

würde mich freuen wenn sich einige heir kurz gedanken über das programm machen könnetn und mir vll einige verbesserungs oder vereinfachungsvorschläge hätten.

wär euch sehr dankbar. !!

desweiteren gibt es eine möglichkeit die "Unterprogramme" in verschiedenen .asm dateien abzuspeichern das sich das Programm (ablauf) und die rutinen unterscheiden ?

sicher ist es schwer sich in solch ein programm reinzudenken wenn man nicht genau weiss was es erfüllt.
würde mich trozdem freuen wenn einige es versuchen würden! DANKE

noch ne kurze erklärung:

P1.4 -P 1.7 sind lichtschranken mit , einer seite dauer HIGH pegel
und andere seite dauer low pegel.

P2.0 - P2.7 sind ausgänge an eine endstufe ! für 3 Motoren
P2.0 + P2.1 gehören zusammen
P2.2 + P2.3 gehören zusammen ... und so weiter ;)

P3.5 Start Taste
P3.4 Test ( wird eig nicht benötigt war nur ein versuch )
P3.7 auswahl wiviel schritte ein motor machen soll.

motoren müssen von position x egal wo .. auf lichtschranke ( 0 punkt )
alle motoren gemeinsam von punkt 0 auf 54 schritte rechts / gleiche auch links möglich sowie das gleich mit 74 schritten
nach ereichen von 54 schritten warten und dann ( wenn nicht gestoppt) zurück zu 0 das 5 mal ;)
zum messen der schritgenauigkeit.
das wärs erstmal. vielen dank schonmal...

für weitere fragen einfach schreiben ...

THX
Gruß marc
Hier das Programm:

; --------------------------------------------------
; --- Prozessor Typ ---
; --------------------------------------------------
INCLUDE 89C51.mc
; --------------------------------------------------
; --- Start / Test Taste | 3.5=Start // 3.4=Test ---
; --------------------------------------------------
Programm:
Start_0:
JB P3.4, Start
Test:
LCALL Rechtslauf_Test
LJMP Test
Start:
JB P3.5, Start_0
; --------------------------------------------------
; --- Programm START Lichtschranke suchen ---
; --------------------------------------------------
LCALL M1_Licht
; --------------------------------------------------
; --- 0-Punkt erreicht ---
; --------------------------------------------------
Weiter:
MOV R5, #5d
Wieder-S:
LCALL Warten
; --------------------------------------------------
; --- 54 / 74 Schritte wählen ---
; --------------------------------------------------
JB P3.7, Schritt74
MOV R6, #54d
LJMP Schritte1
Schritt74:
MOV R6, #74d
; --------------------------------------------------
; --- Gewählte Schritte nach Rechts ---
; --------------------------------------------------
Schritte1:
LCALL Rechtslauf_Test
LCALL Warten
Stop:
JNB P3.4, STOP
LCALL M1_Licht
DJNZ R5, Wieder-S
LCALL M1_Licht
; --------------------------------------------------
; --- 0-Punkt erreicht ---
; --------------------------------------------------
Mov:
MOV R5, #5d
Wieder-S_L:
LCALL Warten
; --------------------------------------------------
; --- 54 / 74 Schritte wählen ---
; --------------------------------------------------
JB P3.7, Schritt74_L
MOV R6, #54d
LJMP Schritte1_L
Schritt74_L:
MOV R6, #74d
; --------------------------------------------------
; --- Gewählte Schritte nach Links ---
; --------------------------------------------------
Schritte1_L:
LCALL Linkslauf_Test
LCALL Warten
Stop_L:
JNB P3.4, Stop_L
LCALL M1_Licht
DJNZ R5, Wieder-S_L
LJMP Start_0


; --------------------------------------------------
; --- UNTERPROGRAMME ---
; --------------------------------------------------

; --------------------------------------------------
; --- Lichtschranke suchen Rechts / Links ---
; --------------------------------------------------
; --------------------------------------------------
; --- Linkslauf Motor 1 Lichtschranke ---
; --------------------------------------------------
Lichtschranke_Links:
M1_Licht_L:
MOV R3, #6d
M1_Start_L:
JNB P1.7, Lichtschranke_1_L
LCALL Linkslauf_M_1_1
JNB P1.7, Lichtschranke_1_L
LCALL Linkslauf_M_1_2
JNB P1.7, Lichtschranke_1_L
LCALL Linkslauf_M_1_3
JNB P1.7, Lichtschranke_1_L
LCALL Linkslauf_M_1_4
JNB P1.7, Lichtschranke_1_L
LJMP M1_Licht_L
Lichtschranke_1_L:
; --------------------------------------------------
; --- Linkslauf Motor 2 Lichtschranke ---
; --------------------------------------------------
M2_Licht_L:
JNB P1.5, Lichtschranke_2_L
LCALL Linkslauf_M_2_1
JNB P1.5, Lichtschranke_2_L
LCALL Linkslauf_M_2_2
JNB P1.5, Lichtschranke_2_L
LCALL Linkslauf_M_2_3
JNB P1.5, Lichtschranke_2_L
LCALL Linkslauf_M_2_4
JNB P1.5, Lichtschranke_2_L
LJMP M2_Licht_L
Lichtschranke_2_L:
; --------------------------------------------------
; --- Linkslauf Motor 3 Lichtschranke ---
; --------------------------------------------------
M3_Licht_L:
JNB P1.4, Lichtschranke_3_L
LCALL Linkslauf_M_3_1
JNB P1.4, Lichtschranke_3_L
LCALL Linkslauf_M_3_2
JNB P1.4, Lichtschranke_3_L
LCALL Linkslauf_M_3_3
JNB P1.4, Lichtschranke_3_L
LCALL Linkslauf_M_3_4
JNB P1.4, Lichtschranke_3_L
LJMP M3_Licht_L
Lichtschranke_3_L:
DJNZ R3, M1_Start_L
RET
; --------------------------------------------------
; --- Rechtslauf Motor 1 Lichtschranke ---
; --------------------------------------------------
Lichtschranke_Rechts:
M1_Licht:
JB P1.7, Lichtschranke_1
LCALL Rechtslauf_M_1_1
JB P1.7, Lichtschranke_1
LCALL Rechtslauf_M_1_2
JB P1.7, Lichtschranke_1
LCALL Rechtslauf_M_1_3
JB P1.7, Lichtschranke_1
LCALL Rechtslauf_M_1_4
JB P1.7, Lichtschranke_1
LJMP M1_Licht
Lichtschranke_1:
; --------------------------------------------------
; --- Rechtslauf Motor 2 Lichtschranke ---
; --------------------------------------------------
M2_Licht:
JB P1.5, Lichtschranke_2
LCALL Rechtslauf_M_2_1
JB P1.5, Lichtschranke_2
LCALL Rechtslauf_M_2_2
JB P1.5, Lichtschranke_2
LCALL Rechtslauf_M_2_3
JB P1.5, Lichtschranke_2
LCALL Rechtslauf_M_2_4
JB P1.5, Lichtschranke_2
LJMP M2_Licht
Lichtschranke_2:
; --------------------------------------------------
; --- Rechtslauf Motor 3 Lichtschranke ---
; --------------------------------------------------
M3_Licht:
JB P1.4, Lichtschranke_3
LCALL Rechtslauf_M_3_1
JB P1.4, Lichtschranke_3
LCALL Rechtslauf_M_3_2
JB P1.4, Lichtschranke_3
LCALL Rechtslauf_M_3_3
JB P1.4, Lichtschranke_3
LCALL Rechtslauf_M_3_4
JB P1.4, Lichtschranke_3
LJMP M3_Licht
Lichtschranke_3:
DJNZ R3, M1_Licht
LJMP M1_Licht_L
; --------------------------------------------------
;---------------------------------------------------
; --------------------------------------------------
; --- 54/74 Schritte Motor 1-4 Rechts / Links ---
; --------------------------------------------------
; --------------------------------------------------
; --- Motor 1-4 Schritte Rechts ---
; --------------------------------------------------
Rechtslauf_Test:
Weiter5:
CLR P2.0 ; Ausgang 1
CLR P2.2
CLR P2.4
CLR P2.6
DJNZ R6, Weiter1
RET
Weiter1:
LCALL Pause ; Pause
CLR P2.1
CLR P2.3
CLR P2.5
CLR P2.7
DJNZ R6, Weiter2
RET
Weiter2:
LCALL Pause ; Pause
SETB P2.0
SETB P2.1
SETB P2.2
SETB P2.3
SETB P2.4
SETB P2.5
SETB P2.6
SETB P2.7
DJNZ R6, Weiter3
RET
Weiter3:
LCALL Pause ; Pause
CLR P2.1
CLR P2.3
CLR P2.5
CLR P2.7
DJNZ R6, Weiter4
RET
Weiter4:
LCALL Pause ; Pause
SETB P2.1
SETB P2.3
SETB P2.5
SETB P2.7
LJMP Weiter5
;---------------------------------------------------
; --- Motor 1-4 Schritte Links ---
;---------------------------------------------------
Linkslauf_Test:
Weiter5_L:
CLR P2.0 ; Ausgang 1
CLR P2.1 ; Ausgang 2
CLR P2.2
CLR P2.3
CLR P2.4
CLR P2.5
CLR P2.6
CLR P2.7
DJNZ R6, Weiter1_L
RET
Weiter1_L:
LCALL Pause ; Pause
SETB P2.1
SETB P2.3
SETB P2.5
SETB P2.7
DJNZ R6, Weiter2_L
RET
Weiter2_L:
LCALL Pause ; Pause
SETB P2.0
SETB P2.2
SETB P2.4
SETB P2.6
CLR P2.1
CLR P2.3
CLR P2.5
CLR P2.7
DJNZ R6, Weiter3_L
RET
Weiter3_L:
LCALL Pause ; Pause
SETB P2.1
SETB P2.3
SETB P2.5
SETB P2.7
LCALL Pause
DJNZ R6, Weiter5_L
RET
Weiter4_L:
;---------------------------------------------------
;---------------------------------------------------

Marc2007
12.12.2006, 11:36
hier der rest vom Programm .. sry für die länge :(((

; --------------------------------------------------
; --- Schrittfolge Motoren 1 - 4 Rechts u. Links ---
; --------------------------------------------------
; --------------------------------------------------
; --- Schrittfolge für Motor 1 Links ---
; --------------------------------------------------
Linkslauf_M_1_1:
CLR P2.0 ; Ausgang 1
CLR P2.1 ; Ausgang 2
LCALL Pause ; Pause
RET
Linkslauf_M_1_2:
SETB P2.1
LCALL Pause ; Pause
RET
Linkslauf_M_1_3:
SETB P2.0
CLR P2.1
LCALL Pause ; Pause
RET
Linkslauf_M_1_4:
SETB P2.1
LCALL Pause ; Pause
RET
; --------------------------------------------------
; --- Schrittfolge für Motor 1 Rechts ---
; --------------------------------------------------
Rechtslauf_M_1_1:
CLR P2.0 ; Ausgang 1
LCALL Pause ; Pause
RET
Rechtslauf_M_1_2:
CLR P2.1
LCALL Pause ; Pause
RET
Rechtslauf_M_1_3:
SETB P2.0
SETB P2.1
LCALL Pause ; Pause
RET
Rechtslauf_M_1_4:
CLR P2.1
LCALL Pause ; Pause
SETB P2.1
RET
; --------------------------------------------------
; --- Schrittfolge für Motor 2 Links ---
; --------------------------------------------------
Linkslauf_M_2_1:
CLR P2.4 ; Ausgang 1
CLR P2.5 ; Ausgang 2
LCALL Pause ; Pause
RET
Linkslauf_M_2_2:
SETB P2.5
LCALL Pause ; Pause
RET
Linkslauf_M_2_3:
SETB P2.4
CLR P2.5
LCALL Pause ; Pause
RET
Linkslauf_M_2_4:
SETB P2.5
LCALL Pause ; Pause
RET
; --------------------------------------------------
; --- Schrittfolge für Motor 2 Rechts ---
; --------------------------------------------------
Rechtslauf_M_2_1:
CLR P2.4 ; Ausgang 1
LCALL Pause ; Pause
RET
Rechtslauf_M_2_2:
CLR P2.5
LCALL Pause ; Pause
RET
Rechtslauf_M_2_3:
SETB P2.4
SETB P2.5
LCALL Pause ; Pause
RET
Rechtslauf_M_2_4:
CLR P2.5
LCALL Pause ; Pause
SETB P2.5
RET
; --------------------------------------------------
; --- Schrittfolge für Motor 3 Links ---
; --------------------------------------------------
Linkslauf_M_3_1:
CLR P2.6 ; Ausgang 1
CLR P2.7 ; Ausgang 2
LCALL Pause ; Pause
RET
Linkslauf_M_3_2:
SETB P2.7
LCALL Pause ; Pause
RET
Linkslauf_M_3_3:
SETB P2.6
CLR P2.7
LCALL Pause ; Pause
RET
Linkslauf_M_3_4:
SETB P2.7
LCALL Pause ; Pause
RET
; --------------------------------------------------
; --- Schrittfolge für Motor 3 Rechts ---
; --------------------------------------------------
Rechtslauf_M_3_1:
CLR P2.6 ; Ausgang 1
LCALL Pause ; Pause
RET
Rechtslauf_M_3_2:
CLR P2.7
LCALL Pause ; Pause
RET
Rechtslauf_M_3_3:
SETB P2.6
SETB P2.7
LCALL Pause ; Pause
RET
Rechtslauf_M_3_4:
CLR P2.7
LCALL Pause ; Pause
SETB P2.7
RET
; --------------------------------------------------
; --------------------------------------------------
; --------------------------------------------------
; --- Pausenprogramme / Wartezeiten ---
; --------------------------------------------------
; --------------------------------------------------
; --- Wartezeit für zwischen halt oben / unten ---
; --------------------------------------------------
Warten: ; Warten ( Auf Auto-Start) ca 2 Sek
Schleife3:
MOV R0,#FFh
Schleife4:
MOV R1,#FFh
Schleife5:
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
DJNZ R1, Schleife5
DJNZ R0, Schleife4
RET
; --------------------------------------------------
; --- Pause für Schrittgeschwindigkeit ---
; --------------------------------------------------
Pause: ; Pausendauer
MOV R0,#35h
Schleife6:
MOV R1,#35h
Schleife7:
NOP
NOP
DJNZ R1, Schleife7
DJNZ R0, Schleife6
RET
; --------------------------------------------------
; --------------------------------------------------

edgar
12.12.2006, 14:03
mein Rat ist sehr einfach: schaue Dir andere Assemblerprogramme an und versuche sie zu verstehen.

Hast Du Platzmangel in dem Chip? Nein? na dann ist doch alles gut.
Funktioniert dein Projekt? Noch besser :D

Alles kann man verbessern ...aber nur wenn es einen vernuenftigen Grund dafuer gibt.

End

Bruder_M
12.12.2006, 15:15
Moin,

ich meld mich mal zu Wort, weil ich auch z.Z. ein größeres Assembler-Pojekt entwickle, auch wenn ich nicht gerade der Meister-Programmierer bin.
Das Program ist insofern in Ordnung, als dass du noch selbst durchsteigst.
Die Länge ist OK, ich bin derzeit bei über 1800 Zeilen...

Versuche Redundanzen frühstmöglich zu verhindern oder zu beseitigen, ich weiß, wenn man schnell was ausprobieren will, schreibt man einfach drauf los, aber irgendwann kommt man an den Punkt, wo sich viele Schritte wiederholen,
statt z.B.
SETB P2.0
SETB P2.1
SETB P2.2
SETB P2.3
SETB P2.4
SETB P2.5
SETB P2.6
SETB P2.7

oder

CLR P2.0 ; Ausgang 1
CLR P2.1 ; Ausgang 2
CLR P2.2
CLR P2.3
CLR P2.4
CLR P2.5
CLR P2.6
CLR P2.7

zu schreiben, mach doch einfach nur MOV P2, #FFh, oder MOV P2, #00h damit hast du auf einen Schlag alle Pins gelöscht oder gesetzt.

Statt
SETB P2.1
SETB P2.3
SETB P2.5
SETB P2.7

kann man auch schreiben ORL P2, #10101010.

Ich weiß nicht mehr, ob das Progstudio Macros und IF/FOR/NEXT/DO/WHILE-Strukturen unterstützt, ansonsten kann man damit schon bisschen mehr in "Hochsprache" denken.

Versuche auch unbedingte Sprünge wie LJMP zu vermeiden um zu ganz anderen Programmstellen zu verzeigen. Ich verwende nur bedingte Sprünge (JB, JNB) um mir so eine Art "IF"-Strukur aufzubauen, die ich dann, und nur dann, ggf. mit einem LJMP verlängere, wenn ich innerhalb mehr als 127 Byte Befehle abarbeiten muss.

An sonsten einfach nur üben und ausprobieren und gucken, womit man am Besten zurecht kommt.

Beste Grüße, Marek

Marc2007
12.12.2006, 16:04
erstmal danke für eure beiträge.

speicher reicht noch ;)

projekt tut auch ..

das ist nicht da problem aber gerad so tips wie

mov P2, #ffh

oder so des ist super dann kann ich mir das beim nächsten mal sparen..ansonst würd ich genau gleich umständlich wieder programieren ....

werd sicher mal noch versuchen es zu vereinfachen bin aber um jebe hilfe dankbar.

gruß marc