diff --git a/src/asm/a4.asm b/src/asm/a4.asm index 0bf044b..39fc754 100644 --- a/src/asm/a4.asm +++ b/src/asm/a4.asm @@ -4,18 +4,30 @@ jmp start ; Variablen -sollwert db tmin -tcounts db 0 ; Impulszaehler fuer Servo, Vorwaertszaehler +status db 00000000b ; Statusbyte +; xxxx x +; |||| | +; |||| +--------> Vereinzeler (1, auf) / (0, zu) bzw. +; |||| Verzoegerung aktiv +; ++++------------> Anzahl Teile binaer (8-0) -anzeige times 3 db 0 ; Puffer fuer Ausgabe -strlen equ $ - anzeige ; Laenge Zeichenpuffer +tcounts db 0 ; Impulszaehler fuer Servo, Vorwaertszaehler +tcountv dw 100 * twait ; Impulszaehler fuer Verzoegerung * 10ms + ; Rueckwaertszaehler +frei db 'frei ', 0 ; Texte +belegt db 'belegt ', 0 ; 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 +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) clrscr equ 0 ; Clear Screen 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 conin equ 5 ; Console IN conout equ 6 ; Console OUT @@ -41,101 +53,48 @@ keybd equ 80h ; SBC-86 Tastatur gokey equ 11h ; Taste "GO" outkey equ 15h ; Taste "OUT" 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 ; Zeitkonstante fuer PWM-Interrupt -tpwm equ 200 ; Periodendauer des PWM-Signals (* 0.1 ms) -tmax equ 25 ; Impulsdauer fuer 0 Grad (* 0.1 ms) -tmin equ 6 ; Impulsdauer fuer 180 Grad (* 0.1 ms) -divider equ 13 ; Vorteiler Wandlerwert - ; 0..255 -> 0..19 -> + tmin -> tmin..tmax -ad_start1 equ 00110000b ; AD-Wandler starten und auf "read" -ad_start2 equ 00100111b ; AD-Wandler nur "read" und LED's an +tpwm equ 200 ; Periodendauer des PWM-Signals * 0.1 ms +tlinks equ 10 ; Impulsdauer fuer "ZU" * 0.1 ms +trechts equ 20 ; Impulsdauer fuer "AUF" * 0.1 ms +tcwait equ ????? ; 1843200 Hz / ????? = 100 Hz => 10 ms + ; Zeitkonstante fuer Wartezeitinterrupt +twait equ 1 ; Wartezeit fuer offenen Vereinzeler (s) +shcnt equ 4 ; Shiftcount Anzahl Teile +pieces equ 8 ; Anzahl Teile initial start: ; Initialisierung + call init ; Controller und Interruptsystem scharfmachen + mov ah, clrscr ; Anzeige aus int conout - call init ; Controller und Interruptsystem scharfmachen - + mov byte [status], pieces << shcnt ; Init. Statusbyte und alle LEDs mov al, 0 + out ppi_a, 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: - in al, ppi_b ; Wandlerwert -; ... -; ... -; ... + +; Ihr Programmcode... + 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 init: cli ; Interrupts aus ; PIT-Init. + mov al, 01110110b ; Kanal 1, Mode 3, 16-Bit ZK out pitc, al ; Steuerkanal mov al, tcpwm & 0ffh ; Low-Teil Zeitkonstante @@ -143,6 +102,14 @@ init: mov al, tcpwm >> 8 ; High-Teil Zeitkonstante 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. mov al, 10001011b ; PPI A/B/C Mode 0, A Output, sonst Input out ppi_ctl, al @@ -162,25 +129,53 @@ init: ; fully nested out icw_2_4, al jmp short $+2 ; I/O-Delay - mov al, 11111110b ; Kanal 0 am PIC demaskieren - ; PIT K1 + mov al, 01111100b ; Kanal 0, 1 + 7 am PIC demaskieren + ; PIT K1, K2 und Lichttaster out ocw_1, al ; Interrupttabelle init. + mov word [intab7], isr_lt ; Interrupttabelle (Lichttaster) + ; initialisieren (Offset) + mov [intab7 + 2], cs ; (Segmentadresse) + mov word [intab0], isr_servotimer ; Interrupttabelle (Timer K1) ; initialisieren (Offset) mov [intab0 + 2], cs ; (Segmentadresse) + + mov word [intab1], isr_opentimer ; Interrupttabelle (Timer K2) + ; initialisieren (Offset) + mov [intab1 + 2], cs ; (Segmentadresse) + sti ; ab jetzt Interrupts ret -isr_servotimer: ; Timer fuer Servo, besser exklusiv (CLI) - push ax -; ... -; ... -; ... - -isr_servotimer_out: +;------------------------ Serviceroutinen ----------------------------------- + +isr_opentimer: ; Timer fuer Vereinzeler (Zeit fuer Oeffnung) + +; Ihr Programmcode + +isr_opentimer_out: ; Ausgang aus dem Service mov al, eoi ; EOI an PIC out ocw_2_3, al - pop ax 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 +