a4 durch die richtige ersetzt
This commit is contained in:
parent
a4c6623cb9
commit
fa34bd80b8
167
src/asm/a4.asm
167
src/asm/a4.asm
|
@ -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_servotimer_out:
|
isr_opentimer: ; Timer fuer Vereinzeler (Zeit fuer Oeffnung)
|
||||||
|
|
||||||
|
; Ihr Programmcode
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue