'=========================== Title =========================================================
'File:   mot1108.BAS
'Author: Klaus Zahnert
'=========================== Description ===================================================
'Steuerung eines Gleichstrommotors mit Wechselstrom im Halbwellenbetrieb, wobei die 
'Drehrichtung durch Stromfluss in Halbwellen unterschiedlicher Polaritt erzeugt wird. 
'Die Drehzahl wird durch Pulslngenmodulation gesteuert. Die digitale Eingabe benutzt 
'4 Bits fr die Drehzahl, 1 Bit fr die Drehrichtung sowie 1 Bit fr das enable-Signal 
'=========================== Settings ======================================================
Key   VAR  Byte                               ' Eingabe Geschwindigkeit m. Taste
Puls  VAR  Word                               ' Ausgabe  Motor-Geschwindigkeit
TRISA       = %00011111                       ' Port A auf Eingabe setzen
TRISB.2     = 1                               ' Taste KEY-IN auf Eingabe setzen 
INTCON      = $90                             ' Erlaubnis  RB0-Interrupt
DEFINE DEBUG_REG PortB                        ' Debug Port Voreinstellung
DEFINE DEBUG_BIT 7
DEFINE DEBUG_BAUD 9600
DEFINE DEBUG_MODE 1
DEFINE DEBUG_PACING 1000
                                                                                 '10 Befehle
'=========================== Main ==========================================================
      Low PortB.1                             ' Start mit  Motorstrom = 0
      On Interrupt goto Fire                  ' Interrupt-handler zuordnen
                                              ' Die Tasteneingabe der Geschwindigkeit
                                              ' wird ignoriert, solange die Taste KEY-IN
                                              ' nicht bettigt wird
                                              ' *******************
Loop: If PortB.2 = 1 then  Loop               ' Im Durchlaufen der Schleife ist der Motor
                                              ' eingeschaltet, die Geschw.-Tasten sind
                                              ' inaktiv
                                              ' KEY-IN wird gedrckt:
                                              ' ********************
                                              ' Eingabe Mode, der Motor hlt an,
                                              ' Die Geschwindigkeitstasten sind aktiv
      DISABLE                                 ' Interrupts gesperrt
Key_in: Key   = PortA                         ' bergabe Tasteneingabe am  PortA
      Key  = (Key ^ %00001111) & %00001111    ' Inversion d. Geschw.- bits with XOR-Maske
                                              ' Geschw. Bits mit AND-Maske abtrennen
      Puls = 66 * Key                         ' Pulse 0....10 ms fr die Drehz. Steuerung
      DEBUG "keyed ", DEC Key, "    Puls = ", DEC Puls, "  direction = ",BIN PortA.4,10,13
                                              ' Ausgabe der eingegebenen Werte an den PC
      If PortB.2 = 0 then Key_in              ' Halten des Eingabemodus solange KEY-IN gedr.
      ENABLE                                  ' Interrupts erlauben
      Goto Loop
                                                                                 '11 Befehle
'=========================== Interrupt - Handler ===========================================
Fire: DISABLE                                 ' Interrupts sperren
      If PortA.4 = 0 then                     ' Wechsel der Motor-Drehrichtung mit
         Pause 10                             ' eingefgtem Puls 10 ms, Einheit ist 1 msec
      Endif                                   ' abhngig vom  Eingang  PortA.4
      Pulsout PortB.1,Puls                    ' Ausgang Motor Steuerung
      INTCON.1 = 0                            ' Interrupt Flag rcksetzen
      RESUME                                  ' Rckkehr zum Hauptprogramm
      ENABLE                                  ' Interrupts erlauben
                                                                                  '8 Befehle
'===========================================================================================
End                                                                                '1 Befehl
