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 | ;----------------------------------------------------------------------------------------------------------------------
|