Advertisement
Guest User

Untitled

a guest
Dec 11th, 2018
104
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.02 KB | None | 0 0
  1.  
  2. org 100h
  3. cpu 8086
  4. jmp start
  5.  
  6. ;--------------------------------
  7. ; Variablen
  8. status db 00000000b ; Statusbyte
  9. ; xxxx x
  10. ; |||| |
  11. ; |||| +--------> Vereinzeler (1, auf) / (0, zu) bzw.
  12. ; |||| Verzoegerung aktiv
  13. ; ++++------------> Anzahl Teile binaer (8-0)
  14.  
  15. tcounts db 0 ;Impulszaehler fuer Servo, Vorwaertszaehler
  16. tcountv dw 100 * twait ; Impulszaehler fuer Verzoegerung * 10ms
  17. ; Rueckwaertszaehler
  18. frei db 'frei ', 0 ; Texte
  19. belegt db 'belegt ', 0
  20. clrscrn db ' ', 0
  21. ;--------------------------------
  22. ; Konstanten
  23. servo_timer equ 0 ; Zeitkonstante für Servo
  24. vereinzeler_timer equ 0 ; Zeitkonstante für Vereinzeler
  25. VE_aktiv equ 1 << 0 ; Vereinzeler bzw. Verzoegerung aktiv
  26. intab0 equ 20h ; Adresse Interrupttabelle PIT, Kanal 1
  27. intab1 equ intab0 + 1 * 4 ; Adresse Interrupttabelle PIT, Kanal 2
  28. intab7 equ intab0 + 7 * 4 ; Adresse Interrupttabelle Lichttaster
  29. eoi equ 20h ; End Of Interrupt (EOI)
  30. clrscr equ 0 ; Clear Screen
  31. getkey equ 1 ; Funktion auf Tastatureingabe warten
  32. ascii equ 2 ; Funktion ASCII-Zeichenausgabe
  33. hexbyte equ 4 ; HEX-Byte Ausgabe
  34. conin equ 5 ; Console IN
  35. conout equ 6 ; Console OUT
  36. pitc equ 0a6h ; Steuerkanal PIT
  37. pit1 equ 0a2h ; Counter 1 PIT
  38. pit2 equ 0a4h ; Counter 2 PIT
  39. ppi_ctl equ 0b6h ; Steuerkanal PPI (Parallelinterface)
  40. ppi_a equ 0b0h ; Kanal A PPI
  41. ppi_pa0 equ 1 ; LED 0
  42. ppi_pa1 equ 2 ; LED 1
  43. ppi_pa2 equ 4 ; LED 2
  44. ppi_pa3 equ 8 ; Lautsprecher
  45. ppi_pa6 equ 1 << 6 ; Servomotor
  46. ppi_b equ 0b2h ; Kanal B PPI
  47. ppi_c equ 0b4h ; Kanal C PPI
  48. ocw_2_3 equ 0c0h ; PIC (Interruptcontroller), OCW2,3
  49. ocw_1 equ 0c2h ; PIC (Interruptcontroller), OCW1
  50. icw_1 equ 0c0h ; PIC (Interruptcontroller), ICW1
  51. icw_2_4 equ 0c2h ; PIC (Interruptcontroller), ICW2,4
  52. leds equ 0 ; LED Port
  53. schalter equ 0 ; Schalterport
  54. keybd equ 80h ; SBC-86 Tastatur
  55. gokey equ 11h ; Taste "GO"
  56. outkey equ 15h ; Taste "OUT"
  57. sseg7 equ 9eh ; Segmentanzeige 7
  58. tcpwm equ 184 ; 1843200 Hz / 184 = ca. 10000 Hz = 0.1 ms
  59. ;--------------------------------
  60. ; Taktzyklus
  61. ; Zeitkonstante fuer PWM-Interrupt
  62. tpwm equ 200 ; Periodendauer des PWM-Signals * 0.1 ms
  63. tlinks equ 10 ; Impulsdauer fuer "ZU" * 0.1 ms
  64. trechts equ 20 ; Impulsdauer fuer "AUF" * 0.1 ms
  65. tcwait equ 18432 ; 1843200 Hz / 18432 = 100 Hz => 10 ms
  66. ; Zeitkonstante fuer Wartezeitinterrupt
  67. twait equ 1 ; Wartezeit fuer offenen Vereinzeler (s)
  68. shcnt equ 4 ; Shiftcount Anzahl Teile
  69. pieces equ 8 ; Anzahl Teile initial
  70.  
  71. ;-------------------------------------------------------------------------------
  72. ;-------------------------------------------------------------- Initialisierung
  73. start:
  74. call init ; Controller und Interruptsystem scharfmachen
  75.  
  76. mov ah, clrscr ; Anzeige aus
  77. int conout ; Ausschaltung der 7-Segmentanzeige
  78.  
  79. mov byte [status], pieces << shcnt ; Init. Statusbyte und alle LEDs
  80. mov al, 0
  81. out ppi_a, al ; Ausgabe von 0 auf 7-Segmentanzeige
  82. mov al, 10000000b ; Setzung des letzten Bits für die 8...
  83. out leds, al ; Ausgabe von 0 auf den LEDs
  84.  
  85. ;-------------------------------------------------------------!!! Hauptprogramm
  86. ; Ausgaben auf das Display und Zaehlung der Teile
  87.  
  88. again:
  89. mov ah, 2 ; Ausgabe eines Ascii-String (nullterminiert)
  90. mov bx, clrscrn ; Leeren String in bx kopieren
  91. mov dl, 7 ; Displaystelle dl: Anzeige ab 7. Stelle
  92. int 6 ; Ausführung von clear_screen
  93.  
  94. mov al, [status] ; Kopieren des Inhalts von Status nach al
  95. test al, 11110000b ; Vergleich des Inhalts von al mit 0
  96. jz voll ; Sprung zu Funktion "voll"
  97.  
  98. ;-------------------------
  99. ; Funktionsprung, wenn Statusbyte != 0
  100. halbvoll:
  101. mov ah, 4h ; Ausgabe eines Hexbytes
  102. mov bx, [status] ; Statusbyte Inhalt in bx Register kopieren
  103. mov dl, 1h ; Ausgabe des Hex-Bytes auf 7-Segmentdisplay 1
  104. int 6
  105. mov ah, 2 ; Ausgabe eines Ascii Strings
  106. mov bx, frei ; Kopieren von frei-Variable in bx
  107. mov dl, 7 ; Ausgabe von frei auf 7. Segment der Anzeige
  108. int 6 ; Aufruf von Display-Interrupt
  109. mov al, [status] ; Kopierung des Inhalts von Status in al
  110. test al, 11110000b ; Vergleich, ob Statusbyte = 0
  111. jz voll
  112. jmp halbvoll
  113.  
  114. ;-------------------------
  115. ; Funktionsprung, wenn Statusbyte = 0
  116. voll:
  117. mov ah, 4h ; Ausgabe eines Hexbytes
  118. mov bx, [status] ; Statusbyte Inhalt in bx Register kopieren
  119. mov dl, 1h ; Ausgabe des Hex-Bytes auf 7-Segmentdisplay 1
  120. int 6
  121.  
  122. mov ah, 2
  123. mov bx, clrscrn
  124. mov dl, 7 ; Stelle, ab wann belegt ausgegeben wird
  125. int 6
  126.  
  127. mov ah, 2
  128. mov bx, belegt
  129. mov dl, 7
  130. int 6
  131.  
  132. jmp again
  133.  
  134. ;------------------------------------------------------------------- Interrupts
  135. ; Initialisierung Controller und Interruptsystem
  136. init:
  137. cli ; Interrupts aus
  138.  
  139. ;-------------------------------------------------------------------------- PIT
  140. ; PIT-Init. (Zeitgeber-Baustein)
  141. mov al, 01110110b ; Kanal 1, Mode 3, 16-Bit ZK
  142. out pitc, al ; Steuerkanal
  143. mov al, tcpwm & 0ffh ; Low-Teil Zeitkonstante
  144. out pit1, al
  145. mov al, tcpwm >> 8 ; High-Teil Zeitkonstante
  146. out pit1, al
  147.  
  148. mov al, 10110110b ; Kanal 2, Mode 3, 16-Bit ZK
  149. out pitc, al ; Steuerkanal
  150. mov al, tcwait & 0ffh ; Low-Teil Zeitkonstante
  151. out pit2, al
  152. mov al, tcwait >> 8 ; High-Teil Zeitkonstante
  153. out pit2, al
  154.  
  155. ;-------------------------------------------------------------------------- PPI
  156. ; PPI-Init. (paralleler Interface-Baustein)
  157. mov al, 10001011b ; PPI A/B/C Mode 0, A Output, sonst Input
  158. out ppi_ctl, al
  159. jmp short $+2 ; I/O-Delay
  160. mov al, 0 ; LED's aus (high aktiv)
  161. out ppi_a, al
  162.  
  163. ;-------------------------------------------------------------------------- PIC
  164. ; PIC-Init. (Interruptcontroller -> Zuordnung von 8 Interrupts an CPU)
  165. mov al, 00010011b ; ICW1, ICW4 benoetigt, Bit 2 egal,
  166. ; Flankentriggerung
  167. out icw_1, al ; Freischaltung der Eingänge für Interrupts
  168. jmp short $+2 ; I/O-Delay (Pause)
  169. mov al, 00001000b ; ICW2, auf INT 8 gemapped
  170. out icw_2_4, al
  171. jmp short $+2 ; I/O-Delay
  172. mov al, 00010001b ; ICW4, MCS-86, EOI, non-buffered,
  173. ; fully nested
  174. out icw_2_4, al
  175. jmp short $+2 ; I/O-Delay
  176. mov al, 01111100b ; Kanal 0, 1 + 7 am PIC demaskieren (Sofortausführung)
  177. ; PIT K1, K2 und Lichttaster
  178. out ocw_1, al
  179.  
  180. ;------------------------------------------------------------------------- INIT
  181. ; Interrupttabelle init.
  182. mov word [intab7], isr_lt ; Interrupttabelle (Lichttaster)
  183. ; initialisieren (Offset)
  184. mov [intab7 + 2], cs ; (Segmentadresse)
  185.  
  186. mov word [intab0], isr_servotimer ; Interrupttabelle (Timer K1)
  187. ; initialisieren (Offset)
  188. mov [intab0 + 2], cs ; (Segmentadresse)
  189.  
  190. mov word [intab1], isr_opentimer ; Interrupttabelle (Timer K2)
  191. ; initialisieren (Offset)
  192. mov [intab1 + 2], cs ; (Segmentadresse)
  193.  
  194. sti ; ab jetzt Interrupts
  195. ret
  196.  
  197. ;-----------------------------------------------------------!!! Serviceroutinen
  198. isr_opentimer: ; Timer fuer Vereinzeler (Zeit fuer Oeffnung)
  199. push ax ; Speicherung von ax auf dem Stack
  200. mov al, [status]
  201. test al, 1 ; Vereinzeler-Bit gesetzt?
  202. jz isr_opentimer_out
  203.  
  204. mov al, [tcounts] ; oder tcountv??
  205. dec al
  206. mov [tcountv], al
  207. cmp al, 0 ; Ist Verzögerung = 0? Ja, -> out
  208. jne isr_opentimer_out
  209.  
  210. mov al, [status]
  211. and al, 11110000b ; Vereinzeler-Bit reset
  212. mov byte [status], al
  213.  
  214. mov al, twait * 100 ;
  215. mov [tcountv], al
  216.  
  217. ;--------------------------------------------------------------- ISR Open Timer
  218. isr_opentimer_out: ; Ausgang aus dem Service
  219. mov al, eoi ; EOI an PIC
  220. out ocw_2_3, al
  221. pop ax
  222. iret
  223.  
  224. ;---------------------------------------------------------------!!! Lichttaster
  225. isr_lt: ; Lichttaster
  226. push ax
  227. mov al, byte [status] ; Einlesung Statusbyte
  228. times 4 shr al, 1 ;2^7 bis 2^4 nibble nach rechts schieben zu 2^3 bis 2^0
  229. dec al
  230.  
  231. test al, 11110000b
  232. jz noch_nicht_null
  233.  
  234. ; wenn Statusbyte = 0
  235. mov al, 00001000b
  236. times 4 shl al, 1 ;2^3 bis 2^0 nibble nach links schieben zu 2^7 bis 2^4
  237. out leds, al
  238. jmp isr_lt_out
  239.  
  240. ;---------------------
  241. noch_nicht_null: ; Merker ist nicht gesetzt
  242. times 4 shl al, 1 ;2^3 bis 2^0 nibble nach links schieben zu 2^7 bis 2^4
  243. or al, 1 ; Vereinzeler-Bit setzen
  244. out leds, al ; Ausgabe des Merkers
  245.  
  246. ;-------------------------------------------------------------- ISR Lichttaster
  247. isr_lt_out: ; Ausgang aus dem Service / Verarbeitung der Request
  248. mov [status], al
  249. mov al, eoi ; EOI an PIC
  250. out ocw_2_3, al
  251. pop ax
  252. iret
  253.  
  254. ;------------------------------------------------------------!!! ISR Servotimer
  255. isr_servotimer: ; Timer fuer Servo (Vereinzeler)
  256. push ax
  257. mov al, [status], ; Vereinzeler-Bit gesetzt?
  258. test al, 1
  259. jz active2 ; 1. Bit nicht gesetzt? Bei nein jump zu active2
  260.  
  261. mov ah, [tcounts]
  262. inc ah
  263. cmp ah, trechts ; 2ms
  264. jnz active
  265.  
  266. mov al, 0 ; Servo aus
  267. out ppi_a, al
  268.  
  269. ;--------------------
  270. active:
  271. cmp ah, [tpwm] ; tcount = 200?
  272. jnz isr_servotimer_out ; wenn nein, dann jump
  273. mov al, ppi_pa6 ; Kopierung Servo-Port ins ah-Register
  274. out ppi_a, al ; Ausgabe von Kanal A
  275. mov ah, 0 ; Zaehler auf 0 setzen
  276. jmp isr_servotimer_out
  277.  
  278. ;--------------------
  279. active2:
  280. mov ah, [tcounts]
  281. inc ah
  282. cmp ah, tlinks ; 1ms
  283. jnz active
  284.  
  285. mov al, 0
  286. out ppi_a, al
  287. jmp active
  288.  
  289. ;------------------------------------------------------------------------------
  290. isr_servotimer_out: ; Ausgang aus dem Service
  291. mov byte [tcounts], bl ; hinzugefügt
  292. mov al, eoi ; EOI an PIC
  293. out ocw_2_3, al
  294. pop ax
  295. iret
  296.  
  297.  
  298. ; Problem: 7-segment ist schneller als servo -> überprüfung im opentimer
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement