vario.asm


1
;********************************************************************************
2
;* Bestimmung des Prozessortyps für den Assembler und das Programmiergerät       *
3
;********************************************************************************
4
;********************************************************************************
5
;*      Pinbelegung I/O PORTS                          *
6
;*      ----------------------------------                    *
7
;*      PORTA:  0 < SSI -  Pin1  --> EINGANG                   *
8
;*              1 < SRI -  Pin2 --> EINGANG                    *
9
;*              2 < MSI -  Pin3 --> EINGANG                    *
10
;*              3 < MRI -  Pin4 --> EINGANG                    *
11
;*              4 -                                *
12
;*              5 -                               *
13
;*              6 -                               *
14
;*              7 -                               *
15
;*                                         *    
16
;*      PORTB:  0 -                                *
17
;*              1 -                                *
18
;*              2 -                                *
19
;*              3 -                                *
20
;*              4 > SL_EIN - PIN5 --> AUSGANG                  *  
21
;*              5 -                               *
22
;*              6 < FU_EA - PIN 7 --> EINGANG                   *
23
;*              7 -                               *  
24
;*                                        *
25
;********************************************************************************
26
;********************************************************************************
27
;* Bestimmung des Prozessortyps für den Assembler und das Programmiergerät       *
28
;******************************************************************************** 
29
        list p=16F785
30
 
31
;*******************************************************************************
32
;* Includedatei für den 16F785 einbinden (vordef. Reg. und Konst.)             *
33
;*******************************************************************************
34
        #include <P16f785.INC> 
35
; Diese Datei enthält Vordefinitionen für wichtige Register und Konstanten.
36
; (Z.B. gibt es die Konstante PORTB mit der sich ohne Angabe der
37
; absoluten Adresse H'0006' der Port B des Prozessors ansprechen lässt)
38
;*******************************************************************************
39
;*******************************************************************************
40
;*                         Register / Variablen  festlegen                     *
41
;*******************************************************************************
42
43
;************************************************************** 
44
        ERRORLEVEL      -302            ; SUPPRESS BANK SELECTION MESSAGES 
45
  
46
;************************************************************** 
47
; CONFIGURATION FESTLEGEN: 
48
;************************************************************** 
49
; Power on Timer, kein Watchdog, HS-Oscillator, kein Brown out, kein LV-programming 
50
        __CONFIG        _PWRTE_ON & _WDT_OFF & _HS_OSC ;& _BODEN_ON & _LVP_OFF 
51
;__CONFIG  _PWRTE_ON & _WDT_OFF & _HS_OSC & _BODEN_OFF & _LVP_OFF
52
;*******************************************************************************
53
;*                         Konstanten festlegen                                * 
54
;*******************************************************************************
55
56
; Hier sollten alle im Verlauf des Programms verwendeten Konstanten deklariert werden.
57
; Die Deklaration sieht z.B. folgendermaßen aus:
58
59
;*******************************************************************************
60
;*  Definition von einzelnen Bits in einem Register / in einer Variable        *
61
;*******************************************************************************
62
; hier kann mit Hilfe der #DEFINE Direktive einzelnen Bits in einem Register ein
63
; Name zugewiesen werden.
64
; Eine Definition sieht z.B. folgendermaßen aus:
65
;
66
;*******************************************************************************
67
;*       Name       *       Port       * Bedeutung / Funktion                  *
68
;*******************************************************************************
69
#DEFINE  SSI         PORTA,0        ;Taster für Eingang SSI
70
#DEFINE  SRI               PORTA,1        ;Taster für Eingang SRI
71
#DEFINE  MSI               PORTA,2        ;Taster für Eingang MSI
72
#DEFINE  MRI               PORTA,3        ;Taster für Eingang MRI 
73
;*******************************************************************************
74
#DEFINE  SL_EIN            PORTB,4        ;Ausgang SL_EIN  
75
#DEFINE  FU_EA             PORTB,6        ;Taster für Eingang FU_EA
76
77
#DEFINE  bank1    STATUS, RP0 ;Spezielle Register Bank
78
;*******************************************************************************
79
;**************************************************************
80
; VARIABLEN DEFINIEREN
81
;************************************************************** 
82
83
;*******************************************************************************
84
;*                                  Programmstart                              *
85
;*******************************************************************************
86
  ORG  0x00      ; Das Programm wird ab Speicherstelle 0 in den Speicher geschrieben
87
  GOTO  INIT    ; Springe zur Grundinitialisierung der Ports A und B
88
;*******************************************************************************
89
;*                                  Initialisierung                            *
90
;*******************************************************************************
91
  ;  PORTA / PORTB initialisieren.
92
  ; -------------------------------
93
INIT  BSF  bank1    ; wechsle zu Registerbank 1 (spezielle Register)bsf  STATUS,RP=  ; Bank 1 wählen.
94
    BCF  STATUS,6  
95
    CLRF  TRISB    ; PORTB als Ausgang.
96
    CLRF  TRISA    ; PORTA als Ausgang.
97
    BSF  TRISA,0    ; PORTA0 als Eingang (Taster SSI).
98
    BSF  TRISA,1    ; PORTA1 als Eingang (Taster SRI).
99
    BSF  TRISA,2    ; PORTA1 als Eingang (Taster MSI).
100
    BSF  TRISA,3    ; PORTA1 als Eingang (Taster MRI).
101
    BSF  TRISB,4    ; PORTA1 als Eingang (Taster MRI).
102
    BCF  TRISB,6    ; PORTA1 als Eingang (Taster MRI).
103
    BCF  STATUS,5  ; Bank 0 wählen.
104
    BCF  bank1    ; wechsle zu Registerbank 0 (normaler Speicherbereich)
105
106
    CLRF  PORTA    ; Port A löschen
107
    CLRF  PORTB    ; Port B löschen
108
; Die Register TRISA und TRISB legen fest, welche Bits in den jeweiligen Ports Ein- bzw.
109
; Ausgänge sind. Eine '1' an der entsprechenden Stelle setzt das Bit des Ports als Ein-
110
; gang eine '0' setzt das Bit als Ausgang.
111
;*******************************************************************************
112
    CLRF   INTCON                  ; Interrupt disable 
113
        CLRF    T1CON
114
;----------------------------------------------------------------------------------------------------------------------------
115
;TIMER 0 - COUNTER SLAVE
116
;TMRO                  ;Zählerstand COUNTER SLAVE
117
;---------------------------------------------------------------------------------------------------------------------------- 
118
 ;BSF OPTION_REG,5            ;Timer 0 wird auf Impulse von PIN RA4 Verschalten
119
 ;BCF OPTION_REG,4            ;Timer 0 wird auf Impulse Low->High Flanke gesetzt
120
 BSF INTCON,T0CS            ;Timer 0 wird auf Impulse von PIN RA4 Verschalten
121
 BCF INTCON,T0SE            ;Timer 0 wird auf Impulse Low->High Flanke gesetzt
122
;----------------------------------------------------------------------------------------------------------------------------
123
;TIMER 1 - COUNTER MASTER
124
;TMR1L                  ;Zählerstand Zähler 1 Low Teil
125
;TMR1H                  ;Zählerstand Zähler 1 High TeilER
126
;---------------------------------------------------------------------------------------------------------------------------- 
127
 BSF     T1CON, TMR1ON                 ;TIMER 1 für Impulse einschalten
128
 BSF     T1CON ,TMR1CS                 ;Timer 1 Takt von PIN RC0 lesen
129
130
;----------------------------------------------------------------------------------------------------------------------------
131
; Hauptprogrammschleife
132
;---------------------------------------------------------------------------------------------------------------------------- download
133
MAIN 
134
  ;CAll READ_SRI
135
  CALL SET_SC
136
  CALL SET_MC
137
  CALL READ_SRI  
138
  CALL READ_MRI
139
  CALL COMP_MS
140
  GOTO MAIN
141
;----------------------------------------------------------------------------------------------------------------------------
142
; SRI =1
143
;----------------------------------------------------------------------------------------------------------------------------
144
   READ_SRI  BTFSC   PORTA,1         ;wenn SRI=0 dann gehe zum übernächsen Befehl
145
        CALL RS_COUNTER_SLAVE        ;wenn SRI=1 dann setze den Counter Slave zurück  
146
        RETURN
147
148
;----------------------------------------------------------------------------------------------------------------------------
149
; MRI =1
150
;----------------------------------------------------------------------------------------------------------------------------    
151
  READ_MRI  BTFSC   PORTA,3                ;Frage den Zustand des MRI ab
152
        CALL   RS_COUNTER_MASTER        ;WENN MRI =1 dann setze den Counter Master zurück
153
        RETURN
154
;----------------------------------------------------------------------------------------------------------------------------
155
; Unterprogramm zum rücksetzen des Master-Counter
156
;----------------------------------------------------------------------------------------------------------------------------
157
  RS_COUNTER_MASTER            ;Counter Master Reset
158
      CLRF    TMR1L            ;Lowbyte löschen  16 BIT-Counter
159
      CLRF    TMR1H             ;Highbyte löschen 16 BIT-Counter
160
      ;bcf PORTA,3
161
      RETURN  
162
;----------------------------------------------------------------------------------------------------------------------------
163
; Unterprogramm zum rücksetzen des SLAVE-Counter
164
;----------------------------------------------------------------------------------------------------------------------------
165
  RS_COUNTER_SLAVE   
166
      CLRF TMR0          ;COUNTER Slave RESET
167
      ;bcf PORTA,1
168
      RETURN
169
;----------------------------------------------------------------------------------------------------------------------------
170
; Unterprogramm zum Vergleichen der Zähler
171
;----------------------------------------------------------------------------------------------------------------------------
172
  COMP_MS
173
      MOVF TMR0,0                ; Counter Slave Zählerstand ins Arbeitsregister
174
  
175
      SUBWF TMR1L,0              ; Das Ergebnis Counter Master - Counter Slave ins Arbeitsregister
176
177
      BC SLAVE_EIN              ; springe zur Ansteuerung des Motors SLAVE<MASTER(20-15=5)Carryflag=1
178
  
179
      GOTO READ_ZERO              ; vergleichen ob SLAVE=MASTER
180
    
181
      GOTO SLAVE_AUS              ; SLAVE> MASTER Carryflag=0 gehe zu Slave aus
182
;----------------------------------------------------------------------------------------------------------------------------
183
; Vergeleichen ob das Ergebnis der Subtraktion der Conter MASTER & SLAVE = 0 ist
184
;----------------------------------------------------------------------------------------------------------------------------
185
 READ_ZERO  BZ SLAVE_AUS                      ; ERGEBNIS DES Vergleiches MASTER=SLAVE 
186
      GOTO SLAVE_AUS
187
;----------------------------------------------------------------------------------------------------------------------------
188
; UMFOMER EIN/AUS ?
189
;----------------------------------------------------------------------------------------------------------------------------
190
  SLAVE_AUS  BTFSC PORTB,6            ; FU_EA=0 + Slave > MASTER
191
            GOTO AUS              ; Slave ausschalten
192
        GOTO EIN              ; definiertes auslaufen des Slaves=Ein      
193
194
  SLAVE_EIN   BTFSS PORTB,6            ; FU_EA=1 + Slave < MASTER
195
        GOTO AUS              ; Slave ausschalten
196
        GOTO EIN              ; Slave einschalten
197
    
198
199
;----------------------------------------------------------------------------------------------------------------------------
200
; MOTOR SLAVE EIN/AUS ?
201
;----------------------------------------------------------------------------------------------------------------------------
202
  AUS BCF SL_EIN                ; Slave AUS
203
    GOTO MAIN
204
205
  EIN BSF SL_EIN                ; SLAVE EIN
206
    GOTO MAIN
207
208
;----------------------------------------------------------------------------------------------------------------------------
209
;Timer 0 erhöhen wenn SSI gedrückt
210
;----------------------------------------------------------------------------------------------------------------------------
211
  SET_SC BTFSC PORTA,0
212
    INCF TMR0,1
213
  RETURN
214
;----------------------------------------------------------------------------------------------------------------------------
215
;Timer 1 erhöhen wenn SSI gedrückt
216
;----------------------------------------------------------------------------------------------------------------------------
217
  SET_MC BTFSC PORTA,2
218
    INCF TMR1L,1
219
  RETURN
220
  
221
222
END                         ;das Ende des Programms 
223
224
;Compare_MS SUBTRAKTION COUNTER_SLAVE - COUNTER MASTER
225
;
226
;  > SETZE SLAVE_MOTOR EIN=1
227
;  < SETZE SLAVE_MOTOR EIN=0
228
;  = SETZE SLAVE_MOTOR EIN=0
229
;----------------------------------------------------------------------------------------------------------------------