; ; Aufgabe Nr.: Speichermodul fuer uP- Praktikum II ; Autor: Joerg Vollandt ; erstellt am : 01.07.1994 ; letzte Aenderung am : 02.08.1994 ; Bemerkung : ; ; Dateiname : run1.asm ; ;--------------------------------------------------------------------- Definitionen ENDE_MARKE EQU 0FFH SYNC_MARKE EQU 0FEH READY_MARKE EQU 0FDH DRILL_MARKE EQU 0FCH PenUp EQU 000H PenDown EQU 0FFH d_z EQU 200 ; Schritte fuer Auf-/Ab Queue_Const EQU 10 ; je Befehle ein GibReady an Frs ;--------------------------------------------------------------------- SEGMENT CODE ;--------------------------------------------------------------------- ; Funktion : Initialisierung ; Aufrufparameter : - ; Ruechgabeparameter : - ; Veraenderte Register : ; Stackbedarf : ; Zeitbedarf : ; INIT_RUN: CLR RUNNINGBIT CLR Sync_Waiting CLR Ready_Waiting CLR Drilling CLR Drill_down CLR FrsWarning CLR PAUSE CLR SingleStep CLR Break MOV R_Sync_Counter,#0 MOV Queue_Counter,#Queue_Const RET ;--------------------------------------------------------------------- ; Funktion : Runmodul liesst ein Fkt.-Byte oder eine komplette Msg. ; aus dem Speicher und schickt diese ins Netz. ; Aufrufparameter : - ; Ruechgabeparameter : - ; Veraenderte Register : ; Stackbedarf : ; Zeitbedarf : ; RUN_MODUL: PUSH_ALL JNB Break,RUN1 LJMP RUN_ENDE RUN1: LCALL GET_ELEMENT_MEM ; Anzahl Bytes JNC RUN4 ; Speicher leer LJMP RUN_LEER RUN4: CJNE A,#ENDE_MARKE,RUN5 ; Ende -MARKE im Speicher GET_16 RD_POINTER DEC_DPTR SET_16 RD_POINTER LJMP RUN_ENDE ; erkannt RUN5: CJNE A,#SYNC_MARKE,RUN6 ; Sync -MARKE im Speicher LJMP RUN_SYNC ; erkannt RUN6: CJNE A,#READY_MARKE,RUN7 ; Ready -MARKE im Speicher LJMP RUN_READY ; erkannt RUN7: CJNE A,#DRILL_MARKE,RUN8 ; Drill -MARKE im Speicher LJMP RUN_DRILL ; erkannt RUN8: LCD 40h,"Ablauf der Teachin- Datei. " PUSH ACC MOV B,A USING 1 ; Msg. MOV R0,#AR0 ; aus Speicher nach Bank 1 USING 0 RUN_Next_Byte: LCALL GET_ELEMENT_MEM ; Bytes aus Speicher MOV @R0,A ; holen INC R0 DJNZ B,RUN_Next_Byte POP B PUSH PSW CLR RS1 ; Bank 1 SETB RS0 MOV DPTR,#ModulNetAdr_Tab MOV A,R0 MOVC A,@A+DPTR SEND_NET ; Msg senden POP PSW ; alte Bank POP_ALL JNB SingleStep,RUN_Next_Ende PUSH_ALL LJMP RUN_READY RUN_Next_Ende: RET ; fertig ! RUN_READY: LCD 40h,"Warten bis Geraet fertig. " JNB P3.5,RUN_READY_FRS post_message2 #Frs,#GibReady,#MemFrs,#GetFrsReady,#0 ; Ready-Anforderung LJMP RUN_READY_WEITER ; schicken RUN_READY_FRS: post_message2 #Rob,#RobGibReady,#MemRob,#GetRobReady RUN_READY_WEITER: SETB Ready_Waiting POP_ALL RET RUN_SYNC: LCD 40h,"Warten auf Synchronisationspunkt Nr.: " LCALL GET_ELEMENT_MEM ; Sync_Counter aus Speicher LCALL A_LCD JB P3.5,RUN_SYNC_FRS post_message2 #MemFrs,#GetFrsSync,A ; Sync.-Meldung an Partner LJMP RUN_SYNC0 ; schicken RUN_SYNC_FRS: post_message2 #MemRob,#GetRobSync,A RUN_SYNC0: MOV B,A MOV A,R_Sync_Counter CJNE A,B,RUN_SYNC1 RUN_SYNC1: JNC RUN_SYNC_ENDE SETB Sync_Waiting RUN_SYNC_ENDE: POP_ALL RET RUN_DRILL: JNB P3.5,RUN_DRILL_ROB LJMP RUN_DRILL_FRS RUN_DRILL_ROB: LCD 40h,"Roboter kann nicht fraesen! Abbruch. " CLR RUNNINGBIT POP_ALL LCALL INIT_TEACH LCALL RESET_TEACH RET RUN_DRILL_FRS: LCD 40h,"Fraesdatei wird abgearbeitet. " SETB Drilling LCALL GET_ELEMENT_MEM ; Fraestiefe aus Speicher MOV Frs_Ref_Tiefe,A LCALL GET_ELEMENT_MEM MOV Frs_Ref_Tiefe+1,A post_message2 #Frs,#FrsVelocityDraw,#fast ; schnelle Bewegung post_message2 #Frs,#GoPieceRefPos ; Werkstueckreferenz post_message2 #Frs,#MoveRZ,#(d_z/256),#(d_z#256) ; Pen up post_message2 #Frs,#DRILL,#on ; Motor an clr DRILL_DOWN SETB DRILL_DOWN MOV A,MY_SLAVE_ADR SWAP A ; *16 ADD A,#MSG_PC_RESET+Msg_Frs_Datei MOV R0,A MOV A,#PC_Slave_Adr ; Datei oeffnen MOV B,#8 SEND_NET MOV A,MY_SLAVE_ADR SWAP A ; *16 ADD A,#MSG_PC_GET+Msg_Frs_Datei MOV R0,A MOV A,#PC_Slave_Adr ; MOV B,#8 MOV DPTR,#0 SET_16 BLOCKNR ; Blocknr.=0 setzen MOV R1,DPL ; Blocknr. MOV R2,DPH SEND_NET ; 0. Block laden POP_ALL RET RUN_LEER: LCD 40h,"Speicherinhalt defeckt. " CLR RUNNINGBIT POP_ALL LCALL INIT_TEACH LCALL RESET_TEACH RET RUN_ENDE: LCD 40h,"Ablauf beendet. " GET_16 NEXT_FREE DEC_DPTR SET_16 NEXT_FREE ; Ende- MARKE entfernen CLR RUNNINGBIT ; Ablaufbeenden MOV A,R_Sync_Counter MOV T_Sync_Counter,A GET_16 RD_POINTER SET_16 NEXT_FREE POP_ALL CLR Break RET ;--------------------------------------------------------------------- ; Funktion : Start des Runmoduls. Schreibt die Endemarke in den Speicher, ; setzt den Speicher zurueck und setzt das Bit RUNNINBIT. ; Aufrufparameter : - ; Ruechgabeparameter : - ; Veraenderte Register : ; Stackbedarf : ; Zeitbedarf : ; START_RUNNING: JB READY,START_R LJMP START_NICHT_BEREIT START_R: PUSH ACC MOV A,#ENDE_MARKE LCALL PUT_ELEMENT_MEM POP ACC LCALL RESET_MEM SETB RUNNINGBIT CLR Sync_Waiting CLR Ready_Waiting MOV R_Sync_Counter,#0 RET START_NICHT_BEREIT: LCD 40H,"Modul nicht bereit fuer Ablauf. " RET ;--------------------------------------------------------------------- ; Funktion : Piece-Ref-Position der Fraese speichern. 1. Teil: Position ; anforndern. ; Aufrufparameter : - ; Ruechgabeparameter : - ; Veraenderte Register : ; Stackbedarf : ; Zeitbedarf : ; STORE_PIECE_REF: PUSH PSW PUSH ACC PUSH AR0 JNB READY,STORE_P_REF_ENDE ; Fertig und Fraese? JNB P3.5,STORE_P_REF_ENDE ; MOV B,#4 ; Msg. an Frs um Pos. ; MOV R2,#MemFrs ; Empfaenger angeben ; MOV R3,#FrsPieceRef ; Msg.-Nr. Empfaenger angeben ; post_message1 Frs,GibFrsPos1 ; zu erfragen post_message2 #Frs,#GibFrsPos1,#MemFrs,#FrsPieceRef STORE_P_REF_ENDE: CLR READY ; Teach- In nicht bereit POP AR0 POP ACC POP PSW RET ;--------------------------------------------------------------------- ; Funktion : Piece-Ref-Position der Fraese speichern. 2. Teil: Position ; in x,y,z speichern, Ref_Flag setzen. ; Aufrufparameter : - ; Ruechgabeparameter : - ; Veraenderte Register : - ; Stackbedarf : ; Zeitbedarf : ; PIECE_REF_FROM_FRS: PUSH PSW PUSH ACC PUSH AR0 JNB READY,P_REF_FRS_DO ; NICHT Fertig und Roboter ? JB P3.5,P_REF_FRS_DO LJMP P_REF_FRS_ENDE P_REF_FRS_DO: MOV Frs_Ref_x,R2 ; Position speichern MOV Frs_Ref_x+1,R3 ; Position speichern MOV Frs_Ref_y,R4 ; Position speichern MOV Frs_Ref_y+1,R5 ; Position speichern MOV Frs_Ref_z,R6 ; Position speichern MOV Frs_Ref_z+1,R7 ; Position speichern P_REF_FRS_ENDE: POP AR0 POP ACC POP PSW SETB READY ; Teach- In wieder bereit SETB Ref_Flag RET ;--------------------------------------------------------------------- ; Funktion : Fraestiefe der Fraese speichern. 1. Teil: Position ; anforndern. ; Aufrufparameter : - ; Ruechgabeparameter : - ; Veraenderte Register : ; Stackbedarf : ; Zeitbedarf : ; STORE_TIEFE: PUSH PSW PUSH ACC PUSH AR0 JNB READY,STORE_TIEFE_ENDE ; Fertig und Fraese? JNB P3.5,STORE_TIEFE_ENDE ; MOV B,#4 ; Msg. an Frs um Pos. ; MOV R2,#MemFrs ; Empfaenger angeben ; MOV R3,#FrsTiefe ; Msg.-Nr. Empfaenger angeben ; post_message1 Frs,GibFrsPos1 ; zu erfragen post_message2 #Frs,#GibFrsPos1,#MemFrs,#FrsTiefe STORE_TIEFE_ENDE: CLR READY ; Teach- In nicht bereit POP AR0 POP ACC POP PSW RET ;--------------------------------------------------------------------- ; Funktion : Fraestiefe der Fraese speichern. 2. Teil: Tiefe berechnen ; und in Frs_Ref_Tiefe speichern, Tiefe_Flag setzen. ; Aufrufparameter : - ; Ruechgabeparameter : - ; Veraenderte Register : - ; Stackbedarf : ; Zeitbedarf : ; TIEFE_FROM_FRS: PUSH PSW PUSH ACC PUSH AR0 JNB READY,TIEFE_FRS_DO ; NICHT Fertig und Roboter ? JB P3.5,TIEFE_FRS_DO LJMP TIEFE_FRS_ENDE TIEFE_FRS_DO: ; MOV A,AR7 ; Fraestiefe berechnen ; CLR C ; und speichern ; SUBB A,Frs_Ref_Tiefe+1 MOV Frs_Ref_Tiefe+1,AR7 ; 7 ; MOV A,AR6 ; SUBB A,Frs_Ref_Tiefe MOV Frs_Ref_Tiefe,AR6 TIEFE_FRS_ENDE: POP AR0 POP ACC POP PSW SETB READY ; Teach- In wieder bereit SETB Tiefe_Flag RET ;--------------------------------------------------------------------- ; Funktion : Flags abfragen, nur wenn Ref_Flag und Tiefe_Flag low weiter. ; SetPieceRef Msg. in Speicher ablegen, Drill Marke ablegen, ; Tiefe ablegen. ; Aufrrameter : - ; Ruechgabeparameter : - ; Veraenderte Register : ; Stackbedarf : ; Zeitbedarf : ; STORE_DRILL: PUSH PSW PUSH ACC JNB Ref_Flag,STORE_DRILL_ERROR ; PieceRefPos und Tiefe JNB Tiefe_Flag,STORE_DRILL_ERROR ; definiert LJMP STORE_DRILL_OK STORE_DRILL_ERROR: LCD 40h,"Fehler: RefPos/ Tiefe nicht definiert. " POP ACC POP PSW RET STORE_DRILL_OK: MOV A,#8 ; Msg- Header speichern LCALL PUT_ELEMENT_MEM ; (Msg.-Laenge) ERROR 0 MOV A,#Frs ; Msg- Header speichern LCALL PUT_ELEMENT_MEM ; (Modulnr.) ERROR 0 MOV A,#SetPieceRef ; Msg- Header speichern LCALL PUT_ELEMENT_MEM ; (Msg.- Nr.) ERROR 0 MOV A,Frs_Ref_x ; Position speichern LCALL PUT_ELEMENT_MEM ; (Parameter 1 High) ERROR 0 MOV A,Frs_Ref_x+1 ; Position speichern LCALL PUT_ELEMENT_MEM ; (Parameter 1 Low) ERROR 0 MOV A,Frs_Ref_y ; Position speichern LCALL PUT_ELEMENT_MEM ; (Parameter 2 High) ERROR 0 MOV A,Frs_Ref_y+1 ; Position speichern LCALL PUT_ELEMENT_MEM ; (Parameter 2 Low) ERROR 0 MOV A,Frs_Ref_z ; Position speichern LCALL PUT_ELEMENT_MEM ; (Parameter 3 High) ERROR 0 MOV A,Frs_Ref_z+1 ; Position speichern LCALL PUT_ELEMENT_MEM ; (Parameter 3 Low) ERROR 0 MOV A,#DRILL_MARKE LCALL PUT_ELEMENT_MEM MOV A,Frs_Ref_Tiefe ; Position speichern LCALL PUT_ELEMENT_MEM ; (Parameter 3 High) ERROR 0 MOV A,Frs_Ref_Tiefe+1 ; Position speichern LCALL PUT_ELEMENT_MEM ; (Parameter 3 Low) ERROR 0 POP ACC POP PSW RET ;--------------------------------------------------------------------- ; Funktion : Speichert die Ready-MARKE im Speicher ; Aufrufparameter : - ; Ruechgabeparameter : - ; Veraenderte Register : ; Stackbedarf : ; Zeitbedarf : ; STORE_READY: PUSH ACC MOV A,#READY_MARKE LCALL PUT_ELEMENT_MEM POP ACC RET ;--------------------------------------------------------------------- ; Funktion : Speichert das Sync.-MARKE und den Sync.-Counter im Speicher ; Aufrufparameter : - ; Ruechgabeparameter : - ; Veraenderte Register : ; Stackbedarf : ; Zeitbedarf : ; STORE_SYNC: PUSH ACC MOV A,#SYNC_MARKE LCALL PUT_ELEMENT_MEM INC T_Sync_Counter ; Sync_Counter +1 MOV A,T_Sync_Counter LCALL PUT_ELEMENT_MEM LCD 29,"Sync.-Nr." LCALL A_LCD POP ACC RET ;--------------------------------------------------------------------- ; Funktion : Ready-Msg. erhalten und bearbeiten. ; Aufrufparameter : - ; Ruechgabeparameter : - ; Veraenderte Register : ; Stackbedarf : ; Zeitbedarf : ; GET_READY_MSG: LCD 40H," " CLR Ready_Waiting RET ;--------------------------------------------------------------------- ; Funktion : Sync.-Msg. erhalten und bearbeiten. Bricht Running ab ; wenn von Partner Sync.-Nr. 0 kommt. Wenn eigenes Modul ; noch nicht getstartet wird Sync.-Msg. mit #0 an Partner ; geschickt. ; Aufrufparameter : - ; Ruechgabeparameter : - ; Veraenderte Register : ; Stackbedarf : ; Zeitbedarf : ; GET_SYNC_MSG: JNB RunningBit,G_S_1 LJMP G_S_2 G_S_1: PUSH B MOV B,#3 ; Msg. MOV R2,#0 ; mit #0 JB P3.5,G_S_FRS post_message1 MemFrs,GetFrsSync ; Sync.-Meldung an Partner POP B RET ; schicken G_S_FRS: post_message1 MemRob,GetRobSync POP B RET G_S_2: PUSH PSW PUSH ACC INC R_Sync_Counter MOV A,R2 ; Sync_Counter aus Msg. holen CJNE A,#0,G_S_KEIN_ABBRUCH ; Abbruch bei #0 LJMP G_S_ABBRUCH G_S_KEIN_ABBRUCH: CJNE A,R_Sync_Counter,G_S_ERROR ; Fehler wenn ungleich CLR Sync_Waiting POP ACC POP PSW RET G_S_ABBRUCH: LCD 40h,"Partner nicht bereit. Abbruch. " CLR RUNNINGBIT POP ACC POP PSW LCALL INIT_TEACH LCALL RESET_TEACH RET G_S_ERROR: LCD 40h,"Synchronisationsfehler. " CLR RUNNINGBIT POP ACC POP PSW LCALL INIT_TEACH LCALL RESET_TEACH RET ;--------------------------------------------------------------------- ; Funktion : Testen ob Queue- Warnung von Frs gekommen ist. Wenn ja, ; GibReady an die Fraese schicken und warten bis kommt. ; Aufrufparameter : - ; Ruechgabeparameter : - ; Veraenderte Register : ; Stackbedarf : ; Zeitbedarf : ; queue_test macro Q_T_Main_Loop: LCALL MAIN_EVENT_LOOP JB PAUSE,Q_T_Main_Loop ; Pause aktiv JB READY_WAITING,Q_T_Main_Loop ; warten auf Ready von Frs LCALL READ_STATUS JB ACC.1,Q_T_Main_Loop endm ;--------------------------------------------------------------------- ; Funktion : Daten aus der Fraesdatei vom PC empfangen, konvertieren ; und an die Fraese schicken. ; Aufrufparameter : - ; Ruechgabeparameter : - ; Veraenderte Register : ; Stackbedarf : ; Zeitbedarf : ; GET_WORKFR_FROM_PC: PUSH_ALL JB RUNNINGBIT,GET_WORKFR_FROM_PC_START LJMP GET_WORKFR_FROM_PC_ABBRUCH GET_WORKFR_FROM_PC_START: MOV A,R1 ; testen ob Dateiende CJNE A,#0ffh,GET_WORKFR_FROM_PC_NEXT MOV A,R2 CJNE A,#0ffh,GET_WORKFR_FROM_PC_NEXT LJMP GET_WORKFR_FROM_PC_ENDE GET_WORKFR_FROM_PC_NEXT: ; naechste Msg. von PC PUSH_ALL ; konvertieren und an Frs queue_test MOV A,AR7 ; schicken CJNE A,#PenDown,G_W_PenUp ; Auf- oder Abbewegung? ljmp G_W_PenDown G_W_PenUp: jb drill_down,G_W_Make_Up ljmp G_W_Pen_Ready ; ist schon oben G_W_Make_Up: post_message2 #Frs,#MoveZ,Frs_Ref_z,Frs_Ref_z+1 ; Pen aus Werkstueck ziehen queue_test post_message2 #Frs,#FrsVelocityDraw,#fast ; schnelle Bewegung queue_test post_message2 #Frs,#MoveRZ,#(d_z/256),#(d_z#256) ; Pen up clr DRILL_DOWN queue_test LJMP G_W_Pen_Ready ; fertig G_W_PenDown: jnb drill_down,G_W_Make_Down ljmp G_W_Pen_Ready ; ist schon unten G_W_Make_Down: post_message2 #Frs,#MoveRZ,#(((-d_z) & 0ffffh) / 256),#(((-d_z) & 0ffffh) # 256) ; Ab queue_test post_message2 #Frs,#FrsVelocityDraw,#slow ; langsame Bewegung queue_test post_message2 #Frs,#MoveZ,Frs_Ref_Tiefe,Frs_Ref_Tiefe+1 ; Pen aus Werkstueck ziehen queue_test SETB DRILL_DOWN G_W_Pen_Ready: ; Pen fertig ! POP_ALL post_message2 #Frs,#MovePR,AR4,AR3,AR6,AR5,#0,#0 ; rel. Bewegung queue_test ; DJNZ Queue_Counter,G_W_Send_no_Ready ; MOV Queue_Counter,#Queue_Const ; PUSH_ALL ; post_message2 #Frs,#GibReady,#MemFrs,#GetFrsReady,#0 ; POP_ALL G_W_Send_no_Ready: GET_16 BLOCKNR INC DPTR SET_16 BLOCKNR ; Blocknr.=+1 setzen MOV R1,DPL ; Blocknr. MOV R2,DPH MOV A,MY_SLAVE_ADR SWAP A ; *16 ADD A,#MSG_PC_GET+Msg_Frs_Datei MOV R0,A MOV A,#PC_Slave_Adr MOV B,#8 SEND_NET ; naechsten Block anfordern POP_ALL RET GET_WORKFR_FROM_PC_ENDE: post_message2 #Frs,#DRILL,#off ; CLR Drilling POP_ALL LCD 40h,"Fraesdatei fertig. " RET GET_WORKFR_FROM_PC_ABBRUCH: CLR Drilling POP_ALL RET ;--------------------------------------------------------------------- ; Funktion : Warnung von Frs erhalten und verarbeiten. ; Aufrufparameter : - ; Ruechgabeparameter : - ; Veraenderte Register : ; Stackbedarf : ; Zeitbedarf : ; Get_Warning_From_Frs: LCD 40h,"Warnung Fraese: " PUSH ACC PUSH PSW PUSH B PUSH_DPTR MOV A,AR2 IFMAKE QUEUE_WARNING,SETB FrsWarning ; Queue Fraese laeuf ueber MOV DPTR,#ParamStr_Tab ; Tabellenbasis laden GWFF_NEXT: MOV A,#0 MOVC A,@A+DPTR ; Wert laden PUSH ACC ; retten MOV A,#1 MOVC A,@A+DPTR ; Stringlaenge laden MOV B,A POP ACC ; Wert mit empfangenem CJNE A,AR2,GWFF_LOOP ; vergleichen LJMP GWFF_AUSGABE GWFF_LOOP: MOV A,B ; Stringlaende auf Tabellen- ADD A,DPL ; zeiger addieren MOV DPL,A MOV A,#0 ADDC A,DPH MOV DPH,A LJMP GWFF_NEXT GWFF_AUSGABE: MOV A,#50h ; LCD- Position LCALL LCD_SET_DD_RAM_ADDRESS INC DPTR INC DPTR LCALL LCD_WRITE_STRING ; Meldung ausgeben MOV A,#0h ; LCD- Position LCALL LCD_SET_DD_RAM_ADDRESS POP_DPTR POP B POP PSW POP ACC RET ;--------------------------------------------------------------------- ; Funktion : Fehler von Frs erhalten und verarbeiten. ; Aufrufparameter : - ; Ruechgabeparameter : - ; Veraenderte Register : ; Stackbedarf : ; Zeitbedarf : ; Get_Error_From_Frs: LCD 40h,"Fehler Fraese: " PUSH ACC PUSH PSW PUSH B PUSH_DPTR MOV DPTR,#ParamStr_Tab ; Tabellenbasis laden GEFF_NEXT: MOV A,#0 MOVC A,@A+DPTR ; Wert laden PUSH ACC MOV A,#1 MOVC A,@A+DPTR ; Stringlaenge laden MOV B,A POP ACC ; Wert mit empfangenem CJNE A,AR2,GEFF_LOOP ; vergleichen LJMP GEFF_AUSGABE GEFF_LOOP: MOV A,B ; Stringlaende auf Tabellen- ADD A,DPL ; zeiger addieren MOV DPL,A MOV A,#0 ADDC A,DPH MOV DPH,A LJMP GEFF_NEXT GEFF_AUSGABE: MOV A,#4Fh ; LCD- Position LCALL LCD_SET_DD_RAM_ADDRESS INC DPTR INC DPTR LCALL LCD_WRITE_STRING ; Meldung ausgeben MOV A,#0h ; LCD- Position LCALL LCD_SET_DD_RAM_ADDRESS POP_DPTR POP B POP PSW POP ACC RET ;--------------------------------------------------------------------- ; Funktion : ; Aufrufparameter : - ; Ruechgabeparameter : - ; Veraenderte Register : ; Stackbedarf : ; Zeitbedarf : ; ;===================================================================== ; END ;---------------------------------------------------------------------