;   --------------------------------------------------------------
;               Handbetrieb mit BasicMaster
;   --------------------------------------------------------------
; Funktion :    kleines Vorprogramm
; 		Der Handbetrieb sollte immer am BasicMaster getestet werden,
; 		weil die Tastenabfrage über RS232 nicht so direkt wirkt

10 STRING 1500,16		; Str.laenge 16 => (1300-1)/(16+1)=80 Strings
12 T=GET
14 IF T<>0 THEN EA=0  ELSE EA=1         ; Falls Taste gedrueckt EA ueber PC
;15 EA=1				; EA: BaMa=1, PC=0 
20 GOSUB 10000			; Initialisierung und Einschaltmeldung
; einige Konstanten einstellen
22 SFAKT = 4			; Faktor Schritte / um
24 FHAND = 8000 : FHANDL = 1000	; Frequenzen Handbetrieb
30 GOTO 390			; Hauptprogramm Handbetrieb
39 END
;   --------------------------------------------------------------
;   ------------------ Position ausgeben ---------------------
;   --------------------------------------------------------------
;Funktion : Ausgabe des internen Positionszaehlers
;Eingang  : SFAKT Schrittfaktor/um
;Ausgang  : --
;lokal    : 
;global   : POS in steps, POSM in mm
40 CALL 3018H : POP POS         ; hole Pos
45 P.U.(###.###),               ; Formatieren
50 Y=SFAKT-1
55 IF POS<0 THEN Y=0
60 POSM=INT((POS+Y)/SFAKT)/1000	; darstellen als mm
70 CUR 0,8:P. POSM,		; ins Display
80 P.U.(0),                     ; Print wieder normal
90 RETURN
'   --------------------------------------------------------------
'                       Handbetrieb BasicMaster
'   --------------------------------------------------------------
'Funktion : - Verfahren des Motors über die Zifferntasten mit den
'             Geschwindigkeiten:  Einzelschritt = <1,7>
'                                         HAND1 = <2,8>
'                                         HAND2 = <3,9>
'             Die Endschalter werden überwacht. Wenn ein Endschalter
'             anspricht kann der Motor nur noch in entgegengesetzter
'             Richtung aus dem Endschalter herausgefahren werden.
'             Der Motor kann nur über die externe Tastatur verfahren werden.
'           - Aufruf der verschiedenen Menüs:
'
'Eingang  : FSTART,VHAND,SFAKT
'Ausgang  : --
'lokal    : T,R,TALT,F
'global   : POS,INF,MAXINF,BAINF

390 GOSUB 530                           ; Anzeige Handbetrieb neu
400   BITSET A0				; Beispiel: setze Ausgang Handbetrieb
415 GOSUB 685                           ; Endschalterüberwachung
420  T=GET				; Taste abfragen, wenn gedrueckt-> T<>0
430   IF E=2 THEN 455                   ; rückwärts gesperrt    <END1>
;       rückwärts
435   IF T = 49 THEN GOSUB 555		; Einzelschritt zurück  <1>
440   IF T = 50 THEN R=-1 : GOSUB 575	; langsam zurück        <2>
445   IF T = 51 THEN R=-1 : GOSUB 615	; schnell zurück        <3>
450   IF E=1 THEN 495			; vorwärts gesperrt     <END0>
;       vorwärts
455   IF T = 55 THEN GOSUB 555		; Einzelschritt vor     <7>
460   IF T = 56 THEN R= 1 : GOSUB 575	; langsam vor           <8>
465   IF T = 57 THEN R= 1 : GOSUB 615	; schnell vor           <9>
;       verschieden belegte Funktionstasten:
;470   IF T = INFO THEN GOSUB xxxx:GOTO 390	; Aufruf verschedener 
;475   IF T = F1 THEN GOSUB xxxx:GOTO 390	; Subroutinen
;480   IF T = F3 THEN GOSUB xxxx:GOTO 390	; z.B. Parameter, Service ...
;485   IF T = F5 THEN GOSUB xxxx:GOTO 390
;490   IF T = F4 THEN GOSUB xxxx:GOTO 390
495    IF T = ESC THEN CLS:INIT INP,0:INIT OUT,0:STOP	; nach Abbruch mit esc
510 GOTO 415				; Dauerschleife

' Handbetrieb neue Anzeige  -------------
530 CLS: PRINT "M  POS          ",      ; Identifier Handbetrieb
;535 CUR 1,0: PRINT 1,			; Beispiel: Programmnummer
540 GOSUB 40				; Beispiel: Positionsanzeige
545 DO:T=GET:UNTIL T=0			; Tastaturspeicher löschen
550 RETURN
'--- Handbetrieb Einzelschritt ---
'Alle 3 Geschwindigkeiten starten getrennt und enden gemeinsam in 935ff
555 FOR I=1 TO SFAKT 			; Schrittfaktor = Schritte pro Taste
560   IF T = 49 THEN CALL 300CH ELSE CALL 3009H	; Einzelschritt vor oder zurueck
565 NEXT
570 GOTO 665                            ; gemeinsamer Ausstieg, Code sparen!
'--- Handbetrieb langsam ---
575 TALT=T : EALT=E                     ; Gedrückte Taste aufheben
576 BITSET A2
580   DO
585     DRIVEFREQ FHANDL*R              ; Motor starten mit f = FHANDL, R=Richtung
590     CALL 4818H : POP T              ; Tastaturabfrage nur für PC
595     GOSUB 685                       ; Endschalterüberwachung
600     IF E=EALT THEN E=0              ; freifahren zulassen    
602   WHILE T=TALT.AND.E=0              ; STOP wenn Taste losgelassen wird
604 DBY(1AH)=2:DRIVEFREQ 0		; Schnellstop
606 GOSUB 685
608 BITTST 136 : GOTO 606		; läuft der Motor?
610 DBY(1AH)=10:BITCLR A2
612 GOTO 670                            ; gemeinsamer Ausstieg, Code sparen!
'--- Handbetrieb schnell ---
615   TALT=T : EALT=E                   ; Gedrückte Taste aufheben
618 BITSET A3
620   F=FSTART                          ; Startfrequenz
625   DO
630     DRIVEFREQ F*R                   ; Motor auf F beschleunigen
635     CALL 4818H : POP T              ; Tastaturabfrage nur für PC 
640     GOSUB 685                       ; Endschalterüberwachung
645     IF E=EALT THEN E=0              ; freifahren zulassen    
650     IF T=TALT THEN F=F+500          ; Beschleunigung um je 500 Hz
655     IF F>FHAND THEN F=FHAND         ; maximale Geschwindigkeit = FHAND
660   WHILE T=TALT.AND.E=0              ; STOP wenn Taste losgelassen wird
665   DRIVEFREQ 0 
670   GOSUB 685
675   BITTST 136 : GOTO 670             ; läuft der Motor?
678 BITCLR A3
680 RETURN				; Pos. speichern und zurück
'--- Endschalterüberwachung Handbetrieb ---
685 IF E<=3 THEN E=0			; Endschalterfehler löschen
690   GOSUB 40				; Poszähler anzeigen
695   BITTST !EN0 : E=1			; Endschalter
700   BITTST !EN1 : E=2			; Endschalter
705   BITTST !EN0,+!EN1 : E=3		; beide Endschalter
715 RETURN
;   --------------------------------------------------------------
;   --------------- Motor Initialisierung -------------------
;   --------------------------------------------------------------
;Funktion : Das Frequenzprofil (Profil 1 = lineare Beschleunigung)
;           wird mit den angegeben Parametern im RAM angelegt.
;       FMAX darf nicht groesser als 8000 bei Steigung 20 sein. (<700 Eintraege)
;       Sonst werden die BASIC-Var. ueberschrieben.
;Eingang  : --
;Ausgang  : --
;lokal    : --
;global   : 
9520 CUR 1,0 : PRINT $(68),             ; ? MOTOR INIT
9530 INIT MOT
9540 INIT FREQ,1,F1,FMAX,ACC		; lineare Beschleunigung 
;               Fstart,Fmax,Beschl.
9550  POP X :IF X<4000 THEN 9580
; wenn Rampe zu gross
9560 ACC=2*ACC
9570 CUR 1,0:P. ">>>>",$(1),:GOTO 9540
9580  INIT TIM 
9600  RETURN
;   --------------------------------------------------------------
;               Initialisierung
;   --------------------------------------------------------------
; --- Ein/Ausgabe initialisieren ---
10000 INIT DISP                 ; Display initialisieren
10010 INIT INP,EA*3             ; Eingabe initialisieren, EA = PC oder Tast
10020 INIT OUT,EA               ; Ausgabe initialisieren  EA = PC oder Disp
10030 PUSH 12 : CALL 481EH      ; Cursor aus
10110 CUR 0,0 : PRINT "TEST HANDBETRIEB"
; --- Parameter lesen ---
10180 CUR 1,0 :?"betriebsbereit  ",
10220 GOSUB 10320               ; Konstanten definieren
10230 BITCLR LEDR:BITSET LEDG   ; rote LED aus, gruene an
10290 GOSUB 9520                ; Motor init ohne die Position zu speichern
10310 RETURN
; =============================================================
; -------------- Konstanten definieren -----------------------
10320 A0=0		; Ausgang 
10330 A1=1		; Ausgang 
10340 A2=2		; Ausgang 2
10350 A3=3		; Ausgang 3
10360 A4=4		; Ausgang 4
10370 A5=5		; Ausgang 
10380 A6=6		; Ausgang 
10390 A7=7		; Ausgang 
10400 A8=157		; Ausgang 
10410 EN0=0		; Endschalter 1
10420 EN1=4		; Endschalter 2
10430 STRG=5		; Eingang "Stoerung Endstufe"
10440 E0=8		; Eingang "Hand=0 Auto=1"
10450 E1=9		; Eingang 
10460 E2=10		; Eingang 
10470 E3=11		; Eingang 
10480 E4=12		; Eingang 
10490 E5=13		; Eingang 
10500 E6=14		; Eingang 
10510 E7=15		; Eingang 
10512 E8=20		; Eingang 
10515 E9=21		; Eingang reserviert
10520 LEDR=159		; Leuchtdiode rot
10530 LEDG=158     	; Leuchtdiode gruen

; mit diesen Werten spielen, danach aber immer MotoInit aufrufen
10555 FMAX=10000	; max. Frequenz
10556 F1 = 50		; Startfreq
10557 ACC = 20		; Beschleunigung
; ---- Initialisierung Tastaturcodes ----
; gesteuert ueber Variable <EA> 0=PC 1=LEA ---
;---- Initcodes fuer BAMA und LEA ---
10560 ESC = 27      	; Tastaturcode <Escape>
10570 F1  = 80     	; Tastaturcode <F1>
10580 F2  = 73      	; Tastaturcode <F2>
10590 F3  = 85       	; Tastaturcode <F3>
10600 F4  = 78       	; Tastaturcode <F4>
10610 F5  = 79      	; Tastaturcode <F5>
10620 F6  = 84      	; Tastaturcode <F6>
10630 INFO = 44    	; Tastaturcode <i>
10640 RET = 13          ; Tastaturcode <Return>
10650 DEL = 8           ; Tastaturcode <Backspace>
10660 PKT = 46          ; Tastaturcode <Punkt>
10670 IF EA>0 THEN RETURN       ; Initcodes fuer PC
; --- Initcodes fuer PC ---
10680 F1  = 33          ; Tastaturcode <shift 1>
10690 F2  = 34          ; Tastaturcode <shift 2>
10700 F3  = 167         ; Tastaturcode <shift 3>
10710 F4  = 36          ; Tastaturcode <shift 4>
10720 F5  = 37          ; Tastaturcode <shift 5>
10730 F6  = 38          ; Tastaturcode <shift 6>
10740 INFO = 105        ; Tastaturcode <i>
10750 DEL = 127         ; Tastaturcode <Backspace>
10760 RETURN


