RE: Thysmanner Hütte - Ein Hochofenwerk in N

#51 von Thor A , 31.05.2021 19:50

Hallo Stummis (und vor allem Hubert),

wie schon "angedroht" geht es erstmal mit Technik weiter...
Die bestellten Platinen (Servoansteuerung und PWM-Fahrreglermodul für den Bunkerbereich) sind angekommen und natürlich musste ich sie gleich zusammenbauen und testen.
Da Du, Hubert, nach einer Dokumentation gefragt hast, werde ich dich erstmal mit allem was ich habe zuschmeißen:
















Und den Code diesmal in Assembler, da ich genug Zeit hatte und mir mal wieder nach etwas Abwechselung war.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
 
;   Servoansteuerung PIC12F629
;
; File: main.asm
; Project: Servoansteuerung_12F_V2
; Author: Thorben A. Herting
; Date: 02.05.2021
;
; Device: PIC12F629
; Frequenzy: 4MHz
; Timer 0: 1/128 MHz = 7,812kHz (1 Zyklus = 0,128ms; 155 Zyklen = 19,84ms)
; Timer 1: 125kHz (1 Zyklus = 0,008ms; 65 Zyklen = 0,52ms; 315 Zyklen = 2,5ms)
; Servo-PWM: Rechts: 0,52ms; Links: 2,5ms
; Servo An: Bei jedem Schaltvorgang wird der Servo für 380ms mit Strom versorgt
;
; GP0: Stellen (IN)
; GP1: Positionsumschaltung (IN)
; GP2: n.c.
; GP3: n.c.
; GP4: Servo-PWM (OUT)
; GP5: Stromversorgung Servo (OUT)
;
; Einfache Servosteuerung mit PIC12F629
;
; Der Servo fährt eine Positionsänderung von ca. 8° bei einem sich ändernden Signal
; am Eingang GP1. Ein Low-Signal an diesem Pin bedeutet hierbei, dass der Servo sich
; nach Links ausrichtet und ein High-Signal eine Ausrichtung nach Rechts.
; Nach jedem Umschaltvorgang bleibt die Stromversorgung des Servos für ca. 400ms
; aktiv und wird danach abgeschaltet, um ein unnötiges Zittern und somit Verschleiß des Servos
; zu verhindern.
; Durch ein Gleichzeitiges Anliegen eines LOW-Signals an Stell- und UM-Eingang wird der
; PIC in den Setup-Modus gesetzt, in welchem der rechte und linke Anschlag gewählt werden kann.
;
; LOW-LOW: Setup linker Anschlag
; LOW-LOW: Setup rechter Anschlag
; LOW-LOW: Setup beendet, normaler Modus
;
; Die neu eingestellten Positionen werden im EEPROM gespeichert und beim Programmstart abgerufen.
;
; Created on 2. Mai 2021, 16:32
;

; Includedatei für den 12F679 einbinden
list p=12F629
#include <P12F629.INC>
ERRORLEVEL -302 ; keine Meldungen über Bank-Änderungen
__config _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _BODEN_OFF & _CP_OFF & _CPD_OFF
 
;************************************************************************
;
; Variablen
;
;************************************************************************
step equ 0x20
altPos equ 0x21
zaehler equ 0x22
step_re equ 0x23
step_li equ 0x24
merker equ 0x25

#define S_GND GPIO,5
#define S_PWM GPIO,4
#define UM GPIO,1
#define Stell GPIO,0
#define sperr_um merker,0 ; hi: UM noch gesperrt; lo: UM freigegeben
#define sperr_stell merker,1 ; hi: Stell noch gesperrt; lo: Stell freigegeben
#define Einst_li_re merker,2 ; hi: einstellen links; lo: einstellen rechts
#define Einst_verlassen merker,3 ; hi: bei nächstem Doppeldruck Einstellungen verlassen; lo: wird nciht beachtet
 
;************************************************************************
;
; Start
;
;************************************************************************
org 0x0000
goto setup
org 0x0004

;************************************************************************
;
; Interrupt
;
;************************************************************************
ISR
bcf INTCON,GIE
; Register retten
movwf 0x30 ; Wreg retten in 0x30
swapf STATUS,w
bcf STATUS,RP0 ; Bank 0 (wg Swap)
movwf 0x31 ; STATUS retten in 0x31
movf PCLATH,w
movwf 0x32 ; PC retten in 0x32
; Abfrage des Auslösers
btfss INTCON,T0IF ; Timer 0 IF gesetzt?
goto T1_int ; nein!
incf zaehler,1 ; ja!
movlw d'100'
movwf TMR0 ; Wreg (100) in TMR0 für 155 Zählzyklen
bsf S_PWM ; S-PWM an
movlw 0xE0
movwf INTCON ; Timer 0 IF rücksetzen
movlw d'255'
movwf TMR1H ; TMR1H füllen
comf step,w ; 255 - step
movwf TMR1L ; 255 - step in TMR1L für PWM-Generator
movlw 0x31 ;
movwf T1CON ; Timer 1 einschalten
T1_int
btfss PIR1,TMR1IF ; Interrupt von Timer 1?
goto ISR_Ende ; nein! Register
clrf PIR1 ; IF Timer 1 löschen
movlw 0x30 ;
movwf T1CON ; Timer 1 abschalten
bcf S_PWM ; S-PWM aus
ISR_Ende
; retten rückgängig
movf 0x32,w
movwf PCLATH
swapf 0x31,w
movwf STATUS
swapf 0x30,f
swapf 0x30,w
bsf INTCON,GIE ; Interrupts aktivieren
retfie
 
;************************************************************************
;
; Setup
;
;************************************************************************
setup
; Variablen laden
movlw d'80'
movwf step ; step
clrf altPos ; altPos
clrf zaehler ; zaehler
; Register laden
clrf STATUS
bsf STATUS,RP0 ; Bank 1
;Werte aus EEPROM laden
;Wenn nicht läuft: WREN Clearen?!
movlw 0x00 ; 0 in Wreg (Als EEPROM Adresse)
movwf EEADR ; und Adresse in EEADR
bsf EECON1,RD ; lesen!
movfw EEDAT ; EEDAT in Wreg
movwf step_li ; Wreg in step_li
movlw 0x01 ; 1 in Wreg (Als EEPROM Adresse)
movwf EEADR ; und Adresse in EEADR
bsf EECON1,RD ; lesen!
movfw EEDAT ; EEDAT in Wreg
movwf step_re ; Wreg in step_re
; Setup der Register
movlw 0x01 ; 1 in Wreg
movwf PIE1 ; Timer1 Interrupt an
movlw 0x03
movwf TRISIO ; GP0/1 auf INPUT
movlw 0x06
movwf OPTION_REG ; Vorteiler Timer0 auf 1/128 (110)
movlw 0x03
movwf WPU ; Pull-Up-Widerstände an GP0/1 an
movlw 0xE0
movwf INTCON ; Interrupts an, Global, Timer 0
bcf STATUS,RP0 ; Bank 0
clrf PIR1 ; Peripherie Interrupts löschen
movlw d'100'
movwf TMR0 ; Timer 0 auf 100 (155 Zählzyklen)
movlw 0x30
movwf T1CON ; Timer 1 mit INTOSC/4 Speisen, Teiler auf 1/8
movlw 0x07
movwf CMCON ; Komperator abschalten
clrf GPIO ; GPIO löschen


;************************************************************************
;
; Hauptprogramm
;
;************************************************************************
main
movfw step ; step in Wreg
clrz ; Zero-Flag löschen
xorwf altPos,w ; Wreg XOR altPos
btfsc STATUS,Z ; Gleich?
goto zaehler_ausw ; ja! Zähler auswerten
btfss S_GND ; nein! Servo-Masse an?
clrf zaehler ; nein! Zähler zurücksetzen
bsf S_GND ; ja! Servo-Masse einschalten
zaehler_ausw
movfw zaehler ; Zählerstand in Wreg
clrc ; Carry-Flag löschen
sublw d'19' ; 19 von Wreg abziehen
btfsc STATUS,C ; Carry-Flag gesetzt?
goto UM_Abfrage ; ja! Abfragen des UM-Eingangs
bcf S_GND ; nein! Servo-Masse abschalten
movfw step ; step in Wreg
movwf altPos ; Wreg in altPos
UM_Abfrage
btfss UM ; UM == 1?
goto UM_LOW ; nein! wechseln zu UM_LOW
movfw step_li ; ja! 100 in Wreg
movwf step ; Wreg in step
goto main ; und von vorne
UM_LOW
btfss Stell ; Stell == 1?
goto Einstellen_setup ; nein! UM = 0 und Stell = 0 (Einstellen der Pos)
movfw step_re ; 80 in Wreg
movwf step ; Wreg in step
goto main ; und von vorne
Einstellen_setup
clrf merker ; alle Merker löschen!
bsf S_GND ; Servo-Masse einschalten
Einstellen
btfsc Stell ; Stell wieder auf HIGH?
bcf sperr_stell ; ja! Sperre aufheben
btfsc UM ; UM wieder auf HIGH?
bcf sperr_um ; ja! Sperre aufheben
btfsc Stell ; Stell == 1?
goto Einst_UM ; ja! Abfrage UM
btfss UM ; UM == 1?
goto Einst_wechsel ; nein! Richtung wechseln
btfss sperr_stell ; stellen gesperrt?
incf step,1 ; nein! step inkrementieren
; step > 254, step = 254
mov
bsf sperr_stell ; ja! Stell vorerst sperren, bis wieder auf HIGH
btfss Einst_li_re ; Einstellung für links oder rechts?
goto Einst_Speich_re ; für rechts!
movfw step ; für links! step in Wreg
movwf step_li ; Wreg in step_li
goto Einstellen ; und zurück
Einst_Speich_re
movfw step ; step in Wreg
movwf step_re ; Wreg in step_re
goto Einstellen ; und zurück
Einst_UM
btfsc UM ; UM == 1?
goto Einstellen ; ja! und zurück
btfss sperr_um ; Um gesperrt?
decf step,1 ; nein! step dekrementieren
; step < 80, step = 80
bsf sperr_um ; ja! UM vorerst sperren, bis wieder auf HIGH
btfss Einst_li_re ; Einstellung für links oder rechts?
goto Einst_Speich_re ; für rechts!
movfw step ; für links! step in Wreg
movwf step_li ; Wreg in step_li
goto Einstellen ; und zurück
Einst_wechsel
btfsc Einst_verlassen ; Einstellengen Verlassen wegen zweiem Eintritt?
goto Einst_speich ; Einstellungen im EEPROM speichern!
btfss Einst_li_re ; Einstellung für links oder rechts?
goto Einst_li ; Einstellung für links!
bcf Einst_li_re ; Einstellung für rechts!
bsf Einst_verlassen ; ein Wechsel ist erfolgt, beim nächsten Mal in normalen Modus wechseln!
goto Einstellen ; und zurück
Einst_li
bsf Einst_li_re
goto Einstellen ; und zurück
Einst_speich
; hier wird dann im EEPROM gespeichert
bsf STATUS,RP0 ; Bank 1 wg EEPROM
bsf EECON1,WREN ; Write Enable einschalten
movlw 0x00 ; 0 in Wreg laden als spätere Speicheradresse im EEPROM
movwf EEADR ; ... und Adresse in EEADR
movfw step_li ; Schrittwert für links in's Wreg laden
movwf EEDAT ; Wreg in EEDAT
bcf INTCON,GIE ; Interrupts deaktivieren
movlw 0x55 ; ben. (s. Datenblatt s. 49)
movwf EECON2 ; ben. (s. Datenblatt s. 49)
movlw 0xAA ; ben. (s. Datenblatt s. 49)
movwf EECON2 ; ben. (s. Datenblatt s. 49)
bsf EECON1,WR ; Und ab!
EE_nt_ready
btfsc EECON1,WR ; Schreiben fertig?
goto EE_nt_ready ; nein! zurück!
movlw 0x01 ; 1 in Wreg laden als spätere Speicheradresse im EEPROM
movwf EEADR ; ... und Adresse in EEADR
movfw step_re ; Schrittwert für rechts in's Wreg laden
movwf EEDAT ; Wreg in EEDAT
movlw 0x55 ; ben. (s. Datenblatt s. 49)
movwf EECON2 ; ben. (s. Datenblatt s. 49)
movlw 0xAA ; ben. (s. Datenblatt s. 49)
movwf EECON2 ; ben. (s. Datenblatt s. 49)
bsf EECON1,WR ; Und ab!
bsf INTCON,GIE ; Interrupts einschalten
bcf STATUS,RP0 ; Bank 0
goto main ; Einstellungen verassen!

end
 



Wie man dem Code schon entnehmen kann, habe ich erstmal nur die Speicherung im EEPROM und die Möglichkeit der Einstellung der Anschläge hinzugefügt. Die Einstellung der Geschwindigkeit (und vielleicht auch zusätzlicher Punkte, etc.) ist noch nicht dabei.

Zu guter Letzt noch ein Paar Bilder der aufgebauten Steuerung samt Einstell-Platine:










Und die Fahrregler Platine:









Leider war es das auch schon wieder, da Programmierung, Löten und Testen der Steuerung schon sehr viel Zeit in Anspruch genommen haben.

Gruß
Thorben


Grüße von der Thysmanner Hütte

Meine Anlage: Thysmanner Hütte
Modelleisenbahnclub Castrop-Rauxel 1987 e. V.


Thor A  
Thor A
Regionalbahn (RB)
Beiträge: 25
Registriert am: 14.08.2018
Homepage: Link
Ort: Ruhrgebiet
Gleise Peco/ Trix
Spurweite N
Steuerung Eigenbau
Stromart DC, Analog


RE: Thysmanner Hütte - Ein Hochofenwerk in N

#52 von KaBeEs246 , 22.02.2022 22:28

Hallo Thorben,

fast ein Jahr vergangen. Wahrscheinlich bist du schon mit deinem Hüttenwerk fertig.

Gruß von Ruhr und Nette
Hans


Meine Anlage Nettetal(-Breyell): https://stummiforum.de/viewtopic.php?f=15&t=155988
Unser Verein: Modelleisenbahnclub Castrop-Rauxel 1987 e. V.


 
KaBeEs246
InterCityExpress (ICE)
Beiträge: 2.234
Registriert am: 22.03.2017
Ort: Ruhrgebiet
Spurweite H0
Stromart Digital


   

Fahrleitung in der Wendel (Tunneloberleitung)
Hilfe zu Signalen

Xobor Einfach ein eigenes Forum erstellen
Datenschutz