; Aufgabe Nr.: Teach- In Einheit fuer uP- Praktikum II ; --- Link- Modul --- ; Autor: Joerg Vollandt ; erstellt am : 13.06.1994 ; letzte Aenderung am : 02.08.1994 ; Bemerkung : ; ; Dateiname : t_mod1.asm ; ;===================================================================== SEGMENT CODE USING 0 INCLUDE MAKRO1.ASM INCLUDE TAST1.ASM INCLUDE MEM1.ASM INCLUDE TEACH1.ASM INCLUDE RUN1.ASM INCLUDE DEBUG.ASM ;===================================================================== ; Definitionen der Funktionen der Teach- In Einheit Adr_InitRobTeach EQU INIT_TEACH ; Initialisieren der Teach- In Einheit Adr_InitFrsTeach EQU INIT_TEACH ; Initialisieren der Teach- In Einheit Adr_DeinitRobTeach EQU DEINIT_TEACH ; Deinitialisieren der Teach- In Einheit Adr_DeinitFrsTeach EQU DEINIT_TEACH ; Deinitialisieren der Teach- In Einheit Adr_ClearRobTeach EQU CLEAR_TEACH ; Speicher loeschen Adr_ClearFrsTeach EQU CLEAR_TEACH ; Speicher loeschen Adr_ResetRobTeach EQU RESET_TEACH ; Speicher zum lesen zuruecksetzen Adr_ResetFrsTeach EQU RESET_TEACH ; Speicher zum lesen zuruecksetzen Adr_StoreRobPos EQU STORE_ROB ; Position Roboter speichern Adr_StoreFrsPos EQU STORE_FRAES ; Position Fraese speichern Adr_StoreRobSync EQU STORE_SYNC ; Synchronisation speichern Adr_StoreFrsSync EQU STORE_SYNC ; Synchronisation speichern Adr_StoreRobReady EQU STORE_READY ; Warten auf Geraet speichern Adr_StoreFrsReady EQU STORE_READY ; Warten auf Geraet speichern Adr_StoreFrsPieceRef EQU STORE_PIECE_REF ; Werkstueck Nullpkt. festlegen Adr_StoreFrsTiefe EQU STORE_TIEFE ; Fraestiefe festlegen Adr_StoreFrsDrill EQU STORE_DRILL ; Fraesdatei bearbeiten Adr_GetRobSync EQU GET_SYNC_MSG ; Synchronisation empfangen Adr_GetFrsSync EQU GET_SYNC_MSG ; Synchronisation empfangen Adr_GetRobReady EQU GET_READY_MSG ; Ready empfangen Adr_GetFrsReady EQU GET_READY_MSG ; Ready empfangen Adr_LoadRob EQU LOAD_ROB ; Roboter Teach- In Datei von PC laden Adr_LoadFrs EQU LOAD_FRAES ; Fraese- Teach- In Datei von PC laden Adr_SaveRob EQU SAVE_ROB ; Roboter Teach- In Datei auf PC speichern Adr_SaveFrs EQU SAVE_FRAES ; Fraese- Teach- In Datei auf PC speichern Adr_RobPos1 EQU FIRST_FROM_ROB ; Position von Roboter 1. Teil Adr_RobPos2 EQU SECOND_FROM_ROB ; Position von Roboter 2. Teil Adr_FrsPos1 EQU FIRST_FROM_FRS ; Position von Fraese 1. Teil Adr_FrsPos2 EQU SECOND_FROM_FRS ; Position von Fraese 2. Teil Adr_FrsPieceRef EQU PIECE_REF_FROM_FRS ; Position von Fraese Adr_FrsTiefe EQU TIEFE_FROM_FRS ; Position von Fraese Adr_DebugRob EQU DEBUG_MEM ; Position von Roboter 2. Teil Adr_DebugFrs EQU DEBUG_MEM ; Position von Roboter 2. Teil Adr_StartRobRun EQU START_RUNNING ; Runmanager starten Adr_StartFrsRun EQU START_RUNNING ; Runmanager starten Adr_GetFrsError EQU Get_Error_from_frs ; Adr_GetFrsWarning EQU Get_Warning_from_frs ; MemRob_MsgCall_Tab: include defMsg.inc MemRob_MsgCall_Tend: MemFrs_MsgCall_Tab: include defMsg.inc MemFrs_MsgCall_Tend: ;------------------------------------------------------------------------------ ; Speicherdefinitionen SEGMENT BITDATA MSG DB ? Sp_MSG DB ? READY DB ? CRC DB ? TESTBIT DB ? RUNNINGBIT DB ? Sync_Waiting DB ? Ready_Waiting DB ? Drilling DB ? Drill_down DB ? PAUSE DB ? FrsWarning DB ? SingleStep DB ? Break DB ? Ref_Flag DB ? Tiefe_Flag DB ? SEGMENT DATA Sp_MSG_Buffer DB ? T_Sync_Counter DB ? R_Sync_Counter DB ? Queue_Counter DB ? Frs_Ref_x DW ? Frs_Ref_y DW ? Frs_Ref_z DW ? Frs_Ref_Tiefe DW ? ;--------------------------------------------------------------------- SEGMENT CODE ;--------------------------------------------------------------------- ; Funktion : CALL_BACK- Fkt. wird nach Empfang einer Message ; aufgerufen. ; Aufrufparameter : - ; Ruechgabeparameter : - ; Veraenderte Register : ; Stackbedarf : ; Zeitbedarf : ; MESSAGE_BIT BIT ACC.0 ; Message Bits SPECIAL_MESSAGE_BIT BIT ACC.2 START_BIT BIT ACC.0 ; Special- Message Bits STOP_BIT BIT ACC.1 RESET_BIT BIT ACC.3 PAUSE_BIT BIT ACC.2 AUX1_BIT BIT ACC.4 AUX2_BIT BIT ACC.5 MESSAGE_INTERRUPT: PUSH ACC LCALL READ_STATUS JNB SPECIAL_MESSAGE_BIT,MESSAGE_INTERRUPT1 LCALL READ_SPECIAL_MESSAGE ; Special_Message lesen MOV Sp_MSG_Buffer,A ; und retten SETB Sp_MSG POP ACC RET MESSAGE_INTERRUPT1: JNB MESSAGE_BIT,MESSAGE_INTERRUPT2 SETB MSG ; Normale Msg.empfangen MESSAGE_INTERRUPT2: POP ACC RET ;--------------------------------------------------------------------- ; Funktion : Message- Scheduler fuer Speichermodul. ; Aufrufparameter : - ; Ruechgabeparameter : - ; Veraenderte Register : - ; Stackbedarf : ; Zeitbedarf : ; ; **************************************************************************** ; R0 Empf„nger (logische Adresse) ; R1 Message ; R2 - R7 Parameter ; **************************************************************************** Message_Handler MACRO Modul push PSW push ACC push DPH push DPL mov DPTR,#Msg_Hndl_Ret ; Ruecksprungadresse vom indirekten push DPL ; Jump ergibt indirekten Call push DPH mov DPTR,#Modul_MsgCall_Tab mov A,AR1 clr C rlc A mov AR1,A jnc No_inc inc DPH No_inc: movc A,@A+DPTR push ACC inc DPTR mov A,AR1 movc A,@A+DPTR push ACC ret ; indireckter Sprung Msg_Hndl_Ret: pop DPL pop DPH Msg_Ha_Exit: pop ACC pop PSW ENDM ;--------------------------------------------------------------------- ; Funktion : Message- Scheduler fuer PC- Messages. ; Aufrufparameter : - ; Ruechgabeparameter : - ; Veraenderte Register : - ; Stackbedarf : ; Zeitbedarf : ; MEM_SCHEDULER: PUSH PSW PUSH ACC CLR MSG MOV A,R0 IFCALL 02h,GET_FROM_PC ; TI-Datei von PC an Roboter IFCALL 03h,GET_FROM_PC ; TI-Datei von PC an Fraese IFCALL 01h,GET_WORKFR_FROM_PC ; Fraesdatei von PC POP ACC POP PSW RET ;--------------------------------------------------------------------- ; Funktion : Message auf die Module verteilen ; Aufrufparameter : - ; Ruechgabeparameter : - ; Veraenderte Register : - ; Stackbedarf : ; Zeitbedarf : ; Dispatch_Msg: PUSH PSW PUSH ACC MOV A,R0 CJNE A,#10h,Dis_Msg0 ; Msg.-Nr. <=10h sind von PC Dis_Msg0: JC Dis_Msg01 ; und werden von MEM_SCHEDULER LJMP Dis_Msg02 ; bearbeitet Dis_Msg01: LCALL MEM_SCHEDULER LJMP Dis_Msg_Ret Dis_Msg02: cjne A,#TeachRob,Dis_Msg10 LJMP Dis_Msg11 Dis_Msg10: LJMP Dis_Msg2 Dis_Msg11: ifdef TeachRob_MsgCall_Tab Message_Handler TeachRob endif ljmp Dis_Msg_Ret Dis_Msg2: cjne A,#TeachFrs,Dis_Msg20 LJMP Dis_Msg21 Dis_Msg20: LJMP Dis_Msg3 Dis_Msg21: ifdef TeachFrs_MsgCall_Tab Message_Handler TeachFrs endif ljmp Dis_Msg_Ret Dis_Msg3: cjne A,#Rob,Dis_Msg30 LJMP Dis_Msg31 Dis_Msg30: LJMP Dis_Msg4 Dis_Msg31: ifdef Rob_MsgCall_Tab Message_Handler Rob endif ljmp Dis_Msg_Ret Dis_Msg4: cjne A,#Frs,Dis_Msg40 LJMP Dis_Msg41 Dis_Msg40: LJMP Dis_Msg5 Dis_Msg41: ifdef Frs_MsgCall_Tab Message_Handler Frs endif ljmp Dis_Msg_Ret Dis_Msg5: cjne A,#MemFrs,Dis_Msg50 LJMP Dis_Msg51 Dis_Msg50: LJMP Dis_Msg6 Dis_Msg51: ifdef MemFrs_MsgCall_Tab Message_Handler MemFrs endif ljmp Dis_Msg_Ret Dis_Msg6: cjne A,#MemRob,Dis_Msg60 LJMP Dis_Msg61 Dis_Msg60: LJMP Dis_Msg7 Dis_Msg61: ifdef MemRob_MsgCall_Tab Message_Handler MemRob endif ljmp Dis_Msg_Ret Dis_Msg7: Dis_Msg_Ret: POP ACC POP PSW RET ;--------------------------------------------------------------------- ; Funktion : START-Routine ; Aufrufparameter : Wird durch die globale Message "START" ausgeloesst ; Ruechgabeparameter : - ; Veraenderte Register : ; Stackbedarf : ; Zeitbedarf : ; GLOBAL_START: ;LCD 40H,"START-Routine " LCALL START_RUNNING RET ;--------------------------------------------------------------------- ; Funktion : NOTAUS-Routine ; Aufrufparameter : Wird durch die globale Message "STOP" ausgeloesst ; Ruechgabeparameter : - ; Veraenderte Register : ; Stackbedarf : ; Zeitbedarf : ; GLOBAL_NOTAUS: LCD 40H,"NOTAUS!!! Abbruch. " CLR RUNNINGBIT LCALL INIT_TEACH LCALL RESET_TEACH RET ;--------------------------------------------------------------------- ; Funktion : RESET-Routine ; Aufrufparameter : Wird durch die globale Message "RESET" ausgeloesst ; Ruechgabeparameter : - ; Veraenderte Register : ; Stackbedarf : ; Zeitbedarf : ; GLOBAL_RESET: LCD 40H,"Teachin- u. Runmanager initialisiert. " LCALL INIT_TEACH LCALL INIT_RUN LCALL RESET_TEACH LCALL INIT_FRS CLR TESTBIT RET ;--------------------------------------------------------------------- ; Funktion : PAUSE-Routine ; Aufrufparameter : Wird durch die globale Message "PAUSE" ausgeloesst ; Ruechgabeparameter : - ; Veraenderte Register : ; Stackbedarf : ; Zeitbedarf : ; GLOBAL_PAUSE: JB RUNNINGBIT,GLOBAL_PAUSE_1 LJMP GLOBAL_PAUSE_ENDE GLOBAL_PAUSE_1: CPL PAUSE JNB PAUSE,GLOBAL_PAUSE_AUS LCD 40H,"Pausemodus. Weiter mit . " RET GLOBAL_PAUSE_AUS: LCD 40H,"Pausemodus aufgehoben. " RET GLOBAL_PAUSE_ENDE: RET ;--------------------------------------------------------------------- ; Funktion : AUX1-Routine ; Aufrufparameter : Wird durch die globale Message "AUX1" ausgeloesst ; Ruechgabeparameter : - ; Veraenderte Register : ; Stackbedarf : ; Zeitbedarf : ; GLOBAL_AUX1: LCD 40H,"AUX1-Routine " SETB SingleStep JNB Ready_Waiting,GLOBAL_AUX1_ENDE SETB Break GLOBAL_AUX1_ENDE RET ;--------------------------------------------------------------------- ; Funktion : AUX2-Routine ; Aufrufparameter : Wird durch die globale Message "AUX2" ausgeloesst ; Ruechgabeparameter : - ; Veraenderte Register : ; Stackbedarf : ; Zeitbedarf : ; GLOBAL_AUX2: ;LCD 40H,"AUX2-Routine " LCD 40H,"Teachin- Datei wird gelaeden. " LCALL LOAD_ROB LCALL LOAD_FRAES RET ;--------------------------------------------------------------------- ; Funktion : Hauptprogramm fuer das Speichermodul ; Aufrufparameter : - ; Ruechgabeparameter : - ; Veraenderte Register : ; Stackbedarf : ; Zeitbedarf : ; Main_Event_Loop: JNB Sp_MSG,No_Sp_Msg LCALL Do_Sp_Msg JB Sp_MSG,Main_Event_Loop No_Sp_Msg: JNB MSG,No_Msg LCALL Do_Msg JB MSG,Main_Event_Loop No_Msg: JNB RUNNINGBIT,No_Runnig LCALL Do_Runnig No_Runnig: JB Sp_MSG,Main_Event_Loop JB MSG,Main_Event_Loop RET Do_Msg: CLR MSG PUSH_ALL LCALL READ_MESSAGE LCALL Dispatch_Msg POP_ALL RET Do_Sp_Msg: CLR Sp_MSG PUSH ACC MOV A,Sp_MSG_Buffer SM_START: JNB START_BIT,SM_NOTAUS ; Special- Message Fkt. LCALL GLOBAL_START ; aufrufen POP ACC RET SM_NOTAUS: JNB STOP_BIT,SM_RESET LCALL GLOBAL_NOTAUS POP ACC RET SM_RESET: JNB RESET_BIT,SM_PAUSE LCALL GLOBAL_RESET POP ACC RET SM_PAUSE: JNB PAUSE_BIT,SM_AUX1 LCALL GLOBAL_PAUSE POP ACC RET SM_AUX1: JNB AUX1_BIT,SM_AUX2 LCALL GLOBAL_AUX1 POP ACC RET SM_AUX2: JNB AUX2_BIT,SM_ENDE LCALL GLOBAL_AUX2 POP ACC RET SM_ENDE: POP ACC RET Do_Runnig: JB Drilling,Do_Drilling JB PAUSE,Do_Waiting JB Sync_Waiting,Do_Waiting JB Ready_Waiting,Do_Waiting LCALL RUN_MODUL Do_Waiting: RET Do_Drilling: JNB FrsWarning,No_FrsWarning ; Queue- Warnung von Frs PUSH_ALL post_message2 #Frs,#GibReady,#MemFrs,#GetFrsReady,#0 POP_ALL CLR FrsWarning SETB READY_WAITING No_FrsWarning: RET ;===================================================================== ; END ;---------------------------------------------------------------------