a4 durch die richtige ersetzt

This commit is contained in:
Johannes Theiner 2018-11-28 12:12:02 +01:00
parent a4c6623cb9
commit fa34bd80b8
1 changed files with 83 additions and 88 deletions

View File

@ -4,18 +4,30 @@
jmp start jmp start
; Variablen ; Variablen
sollwert db tmin status db 00000000b ; Statusbyte
tcounts db 0 ; Impulszaehler fuer Servo, Vorwaertszaehler ; xxxx x
; |||| |
; |||| +--------> Vereinzeler (1, auf) / (0, zu) bzw.
; |||| Verzoegerung aktiv
; ++++------------> Anzahl Teile binaer (8-0)
anzeige times 3 db 0 ; Puffer fuer Ausgabe tcounts db 0 ; Impulszaehler fuer Servo, Vorwaertszaehler
strlen equ $ - anzeige ; Laenge Zeichenpuffer tcountv dw 100 * twait ; Impulszaehler fuer Verzoegerung * 10ms
; Rueckwaertszaehler
frei db 'frei ', 0 ; Texte
belegt db 'belegt ', 0
; Konstanten ; Konstanten
??? equ 0 ; Platzhalter fuer Ihre Zeitkonstante1
????? equ 0 ; Platzhalter fuer Ihre Zeitkonstante2
VE_aktiv equ 1 << 0 ; Vereinzeler bzw. Verzoegerung aktiv
intab0 equ 20h ; Adresse Interrupttabelle PIT, Kanal 1 intab0 equ 20h ; Adresse Interrupttabelle PIT, Kanal 1
intab1 equ intab0 + 1 * 4 ; Adresse Interrupttabelle PIT, Kanal 2
intab7 equ intab0 + 7 * 4 ; Adresse Interrupttabelle Lichttaster
eoi equ 20h ; End Of Interrupt (EOI) eoi equ 20h ; End Of Interrupt (EOI)
clrscr equ 0 ; Clear Screen clrscr equ 0 ; Clear Screen
getkey equ 1 ; Funktion auf Tastatureingabe warten getkey equ 1 ; Funktion auf Tastatureingabe warten
ascii equ 1 ; Funktion ASCII-Zeichenausgabe ascii equ 2 ; Funktion ASCII-Zeichenausgabe
hexbyte equ 4 ; HEX-Byte Ausgabe hexbyte equ 4 ; HEX-Byte Ausgabe
conin equ 5 ; Console IN conin equ 5 ; Console IN
conout equ 6 ; Console OUT conout equ 6 ; Console OUT
@ -41,101 +53,48 @@ keybd equ 80h ; SBC-86 Tastatur
gokey equ 11h ; Taste "GO" gokey equ 11h ; Taste "GO"
outkey equ 15h ; Taste "OUT" outkey equ 15h ; Taste "OUT"
sseg7 equ 9eh ; Segmentanzeige 7 sseg7 equ 9eh ; Segmentanzeige 7
tcpwm equ 184 ; 1843200 Hz / 184 = ca. 10000 Hz = 0.1 ms tcpwm equ ??? ; 1843200 Hz / ??? = ca. 10000 Hz = 0.1 ms
; Taktzyklus ; Taktzyklus
; Zeitkonstante fuer PWM-Interrupt ; Zeitkonstante fuer PWM-Interrupt
tpwm equ 200 ; Periodendauer des PWM-Signals (* 0.1 ms) tpwm equ 200 ; Periodendauer des PWM-Signals * 0.1 ms
tmax equ 25 ; Impulsdauer fuer 0 Grad (* 0.1 ms) tlinks equ 10 ; Impulsdauer fuer "ZU" * 0.1 ms
tmin equ 6 ; Impulsdauer fuer 180 Grad (* 0.1 ms) trechts equ 20 ; Impulsdauer fuer "AUF" * 0.1 ms
divider equ 13 ; Vorteiler Wandlerwert tcwait equ ????? ; 1843200 Hz / ????? = 100 Hz => 10 ms
; 0..255 -> 0..19 -> + tmin -> tmin..tmax ; Zeitkonstante fuer Wartezeitinterrupt
ad_start1 equ 00110000b ; AD-Wandler starten und auf "read" twait equ 1 ; Wartezeit fuer offenen Vereinzeler (s)
ad_start2 equ 00100111b ; AD-Wandler nur "read" und LED's an shcnt equ 4 ; Shiftcount Anzahl Teile
pieces equ 8 ; Anzahl Teile initial
start: start:
; Initialisierung ; Initialisierung
call init ; Controller und Interruptsystem scharfmachen
mov ah, clrscr ; Anzeige aus mov ah, clrscr ; Anzeige aus
int conout int conout
call init ; Controller und Interruptsystem scharfmachen mov byte [status], pieces << shcnt ; Init. Statusbyte und alle LEDs
mov al, 0 mov al, 0
out ppi_a, al
out leds, al out leds, al
mov al, ad_start1 ; ADU init.
out ppi_a, al
mov al, ad_start2
out ppi_a, al
; Hintergrundprogramm: Lesen des Wandlerwertes, Verarbeitung und Displayausgabe ; Hintergrundprogramm (ist immer aktiv, wenn im Service nichts zu tun ist)
; Hier sollten Ausgaben auf das Display getätigt werden, Zählung der Teile, etc.
again: again:
in al, ppi_b ; Wandlerwert
; ... ; Ihr Programmcode...
; ...
; ...
jmp again jmp again
; Ausgabe einer ASCII-Zeichenkette
strout:
; ...
; ...
; ...
ret
; 8-Bit Division AL / BL
; Return: Quotient in AL, Rest in AH
; Zerstoert AX, BH
; Algorithmus siehe:
; https://www-user.tu-chemnitz.de/~heha/Mikrocontroller/Division.htm
; Wuerde auch mit dem DIV-Befehl der CPU funktionieren, wieso dann das hier?
divide: xor ah, ah ; High-Teil Dividend
mov bh, 8 ; Anzahl Bits Quotient
_div: shl ax, 1 ; Dividend * 2
cmp ah, bl ; teilbar?
jb _smaller ; nein
sub ah, bl ; ja, abziehen
inc al ; Dividend, Bit 0 = 1
_smaller:
dec bh ; fertig?
jnz _div ; nein, naechste Stelle
ret
; Hornerschema rueckwaerts (Teilen des Wertes durch die Zielbasis bis nix mehr
; da ist; die Reste der Division sind die Ziffern, von "hinten" (LOW) beginnend)
; Hexwert (in AL) nach dezimal (ASCII-String) wandeln und in "anzeige" speichern
; Zerstoert AX, BX, CX, DI
val2astr:
mov di, anzeige + strlen - 1 ; Zielpuffer rueckwaerts beschreiben
mov bl, 10 ; Dezimalwandlung (Zielbasis)
xor cx, cx
v1: call divide ; AL / BL, Rest in AH
add ah, '0' ; --> ASCII
mov [di], ah ; Zeichen in Puffer
dec di ; vorherige Pufferstelle
inc cl ; Zaehler++
or al, al ; fertig? (Dividend zerdividiert?)
jnz v1 ; noe, nochmal
mov al, cl ; Anzahl
mov cl, strlen ; max. Stringlaenge
sub cl, al ; Anzahl Reststellen
; out leds, al ; Kontrollausgabe
jcxz v3 ; fertig?
v2: mov byte [di], ' ' ; Rest loeschen
dec di
loop v2 ; fertig?
v3: ret
; Initialisierung Controller und Interruptsystem ; Initialisierung Controller und Interruptsystem
init: init:
cli ; Interrupts aus cli ; Interrupts aus
; PIT-Init. ; PIT-Init.
mov al, 01110110b ; Kanal 1, Mode 3, 16-Bit ZK mov al, 01110110b ; Kanal 1, Mode 3, 16-Bit ZK
out pitc, al ; Steuerkanal out pitc, al ; Steuerkanal
mov al, tcpwm & 0ffh ; Low-Teil Zeitkonstante mov al, tcpwm & 0ffh ; Low-Teil Zeitkonstante
@ -143,6 +102,14 @@ init:
mov al, tcpwm >> 8 ; High-Teil Zeitkonstante mov al, tcpwm >> 8 ; High-Teil Zeitkonstante
out pit1, al out pit1, al
mov al, 10110110b ; Kanal 2, Mode 3, 16-Bit ZK
out pitc, al ; Steuerkanal
mov al, tcwait & 0ffh ; Low-Teil Zeitkonstante
out pit2, al
mov al, tcwait >> 8 ; High-Teil Zeitkonstante
out pit2, al
; PPI-Init. ; PPI-Init.
mov al, 10001011b ; PPI A/B/C Mode 0, A Output, sonst Input mov al, 10001011b ; PPI A/B/C Mode 0, A Output, sonst Input
out ppi_ctl, al out ppi_ctl, al
@ -162,25 +129,53 @@ init:
; fully nested ; fully nested
out icw_2_4, al out icw_2_4, al
jmp short $+2 ; I/O-Delay jmp short $+2 ; I/O-Delay
mov al, 11111110b ; Kanal 0 am PIC demaskieren mov al, 01111100b ; Kanal 0, 1 + 7 am PIC demaskieren
; PIT K1 ; PIT K1, K2 und Lichttaster
out ocw_1, al out ocw_1, al
; Interrupttabelle init. ; Interrupttabelle init.
mov word [intab7], isr_lt ; Interrupttabelle (Lichttaster)
; initialisieren (Offset)
mov [intab7 + 2], cs ; (Segmentadresse)
mov word [intab0], isr_servotimer ; Interrupttabelle (Timer K1) mov word [intab0], isr_servotimer ; Interrupttabelle (Timer K1)
; initialisieren (Offset) ; initialisieren (Offset)
mov [intab0 + 2], cs ; (Segmentadresse) mov [intab0 + 2], cs ; (Segmentadresse)
mov word [intab1], isr_opentimer ; Interrupttabelle (Timer K2)
; initialisieren (Offset)
mov [intab1 + 2], cs ; (Segmentadresse)
sti ; ab jetzt Interrupts sti ; ab jetzt Interrupts
ret ret
isr_servotimer: ; Timer fuer Servo, besser exklusiv (CLI) ;------------------------ Serviceroutinen -----------------------------------
push ax
; ... isr_opentimer: ; Timer fuer Vereinzeler (Zeit fuer Oeffnung)
; ...
; ... ; Ihr Programmcode
isr_servotimer_out: isr_opentimer_out: ; Ausgang aus dem Service
mov al, eoi ; EOI an PIC mov al, eoi ; EOI an PIC
out ocw_2_3, al out ocw_2_3, al
pop ax
iret iret
isr_lt: ; Lichttaster
; Ihr Programmcode
isr_lt_out: ; Ausgang aus dem Service
mov [status], al
mov al, eoi ; EOI an PIC
out ocw_2_3, al
iret
isr_servotimer: ; Timer fuer Servo (Vereinzeler)
; Ihr Programmcode
isr_servotimer_out: ; Ausgang aus dem Service
mov al, eoi ; EOI an PIC
out ocw_2_3, al
iret