⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 la.asm

📁 基于AT90S1200芯片 (16MHz),源代码为汇编语言。 用户界面软件 LOLA.EXE 用途逻辑分析仪。PGEN.EXE用作脉冲发生器。均使用 delphi 编程。 提供了16位版本(L
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;CPU改为2313的源程序,硬件改动见程序中管脚定义 




; Logic-Analyzer and PulseGenerator
; Version 0.16  CPU改为2313
; Version 0.15  Neu: PulseGenerator-Modes. Erwartet 7 Bytes!
; Version 0.09  Verkuerzte Routine fuer cntclk und ram_wr
; Version 0.07  Neue Modes fuer Test-Routinen
; Version 0.06  Anpassung an AT90S1200
; Version 0.05  funktionsfaehig fuer AT90S2313
;
; 串口控制字符/LogicAnalyzer:                                / PulseGen:
; 1. TriggerByte (触发字节)                                / TiL
; 2. Masken-Byte (为1的位don't care)                       / TiH
; 3. Timer-Intervall                                       / TpL
; 4. Timer-Prescaler                                       / TpH
; 5. Pre-Trigger in 256-Byte Schritten;                    / TnL
; 6. unbenutzt                                             / TnH
; 7. Modus-Byte (int-/ext-Clock, int-/ext-Trigger)         / Mode
;
; 假设 Triggerword:          0 1 1 0 X X X 1
; TriggerByte:               0 1 1 0 1 1 1 1
; Masken-Byte:               0 0 0 0 1 1 1 0
;
; Sampling-Byte:             0 1 1 0 0 1 1 1
; mit Masken-OR:             0 1 1 0 1 1 1 1 = TriggerByte --> TRIGGER!
;

.nolist
.include ".\2313def.inc"
.list

.def TpCntH  = R27 ;PulseGen: Tp-Counter-High
.def TpCntL  = R26 ;PulseGen: Tp-Counter-Low
.def TiCntH  = R25 ;PulseGen: Ti-Counter-High
.def TiCntL  = R24 ;PulseGen: Ti-Counter-Low
.def temp    = R23 ;temporary storage register
.def bitcnt  = R22 ;bit counter
.def TXbyte  = R21 ;Data to be transmitted
.def RXbyte  = R20 ;Received data
.def bufcntH = R19 ;Ringspeicher-Zaehler High
.def TnCntH  = R19 ;PulseGen: Burst-Count-High
.def bufcntL = R18 ;Ringspeicher-Zaehler Low
.def TnCntL  = R18 ;PulseGen: Burst-Count-Low
.def mode    = R17 ;Modus
.def wreg    = R16 ;Working-Register
.def trig    = R15 ;Trigger-Register
.def TiL     = R15 ;低电平持续时间(PulseGen)
.def mask    = R14 ;Masken-Register
.def TiH     = R14 ;高电平持续时间(PulseGen)
.def timereg = R13 ;fuer Timervergleich
.def TnH     = R13 ;(PulseGen)
.def prescal = R12 ;Timer PreScaler
.def TpH     = R12 ;(PulseGen)
.def delta   = R11 ;Timer-Intervall
.def TpL     = R11 ;(PulseGen)
.def pretrig = R10 ;Pre-Trigger
.def TnL     = R10 ;(PulseGen)
.def aux1    = R9  ;Hilfsregister
.def aux0    = R8  ;Hilfsregister
.def store1  = R7  ;PORTD, cntclk=H und ram_wr=L
.def store2  = R6  ;PORTD, cntclk=L und ram_wr=H (Ruhezustand)

;---------------------------------------------------------------------------
;Hardware Definition
;
;Baudrate 38400:
.equ  baud  = 25       ;16MHz Quart (90S3212)  fosc/(16*BAUD) - 1
;
;Port-Pinbelegung:
.equ ram_wr = PD5      ;RAM /WR Write-Enable  (Low-aktiv)
.equ ram_oe = PD4      ;RAM /OE Output-Enable (Low-aktiv)
.equ sample = PD6      ;Clock (positiv) und Output-Enable (Low) des 74HC574
.equ PGout  = PD2      ;PulseGenerator Output
.equ cntclk = PD3      ;Clock (positiv) des Ripple-Counters 74HC4040
.equ RxD    = PD0      ;RxD 
.equ TxD    = PD1      ;TxD
.equ extpin = PB0      ;Externer Trigger-/Clock-Eingang an Port-B
;
;---------------------------------------------------------------------------

.org 0x0000
         rjmp start           ;Sprung nach Reset
         reti                 ;INT0
         reti                 ;INT1
         reti                 ;TMR1 CAPT1
         reti                 ;TMR1 COMP1
         reti                 ;TMR1 OVF
         reti                 ;TMR0 OVF
         rjmp RAMfull         ;UART RXI 程序中断捕获
         reti                 ;UART UDRE
         reti                 ;UART TXI
         reti                 ;ANA COMP

start:
;-------------------------------------------------------------------
;Stackpointer initialization
;-------------------------------------------------------------------
         ldi wreg,low(RAMEND)
         out SPL,wreg    
;-------------------------------------------------------------------
;Ports initialization
;-------------------------------------------------------------------
         ldi wreg,0b01111011  ;PORT-D Richtungs-Register
         out DDRD,wreg        ;
         ldi wreg,0b11110010  ;PORT-D Ausgabezustand
                              ;cntclk = low
                              ;TxD    = high
                              ;RxD    = input, External Pull-Up
                              ;PGout  = low
                              ;sample = high
                              ;ram_oe = inactive (high)
                              ;ram_wr = inactive (high)
         out PORTD,wreg       ;PORT-D
         mov store2,wreg      ;store2 无SRAM操作时IO状态 
         ldi wreg,0b11011010  ;cntclk=high, ram_wr=low
         mov store1,wreg      ;store1 写SRAM时IO状态 
         ldi wreg,0b00000000  ;PORT-B Register
         out DDRB,wreg        ;全部为输入
         out PORTB,wreg       ;无Pull-Up

;-------------------------------------------------------------------
;UART initialization
;-------------------------------------------------------------------
         ldi wreg,0b00011000  ;8bit mode, enable RXEN & TXEN
         out UCR,wreg
         ldi wreg,baud
         out UBRR,wreg

;-------------------------------------------------------------------
;ADIW auxial register aux0 und aux1
;-------------------------------------------------------------------
         ldi wreg,0x00        ;Hilfsregister-0 mit 0 laden
         mov aux0,wreg        ;"
         ldi wreg,0x01        ;Hilfsregister-1 mit 1 laden
         mov aux1,wreg        ;"

;-------------------------------------------------------------------
;等待串口初始化字符串
;-------------------------------------------------------------------
         rcall getchar
         in  trig,UDR         ; = TiL

         rcall getchar
         in  mask,UDR         ; = TiH

         rcall getchar
         in  delta,UDR        ; = TpL

         rcall getchar
         in  prescal,UDR      ; = TpH

         rcall getchar
         in  pretrig,UDR      ; = TnL

         rcall getchar
         in  TnH,UDR          ; bei LogicAnalyzer ignoriert

         rcall getchar
         in  mode,UDR

;-------------------------------------------------------------------
;EXTINT & UART 中断设置
;-------------------------------------------------------------------
         ldi wreg,0x00        ;
         out GIMSK,wreg       ;
         ldi wreg,0x00        ;
         out MCUCR,wreg       ;
         sbi UCR,RXCIE        ;允许串口接收中断
         sei                  ;允许全局中断

;-------------------------------------------------------------------
;PulseGenerator-Modes filtern
;-------------------------------------------------------------------
PGMode10:
         cpi mode,10          ;Range-1, Continous
         brne PGMode11
         rjmp PG_Start0
PGMode11:
         cpi mode,11          ;Range-1, Burst
         brne PGMode12
         rjmp PG_Start1
PGMode12:
         cpi mode,12          ;Range-2, Continous
         brne PGMode13
         rjmp PG_Start2
PGMode13:
         cpi mode,13          ;Range-2, Burst
         brne ClearRAM
         rjmp PG_Start3

;-------------------------------------------------------------------
;RAM-Speicher loeschen
;-------------------------------------------------------------------
ClearRAM:
         ldi bufcntL,LOW (0x0000-2048)  ;Alle 2048 Speicherplaetze
         ldi bufcntH,HIGH(0x0000-2048)  ;loeschen

         ldi wreg,0xFF        ;PORTB auf ausgabe
         out DDRB,wreg        ;"
         ldi wreg,0x00        ;Bitmuster anlegen
         out PORTB,wreg       ;"
RAMclr:
         out PORTD,store1     ;RAM schreiben und
         out PORTD,store2     ;Counter increment.
         nop                  ;
         add bufcntL,aux1     ;incr. BufferCounter
         adc bufcntH,aux0     ;"
         brcc RAMclr

         ldi wreg,0x00        ;PORTB auf eingabe
         out DDRB,wreg        ;"
         ldi wreg,0b11111111  ;PORT-B
         out PORTB,wreg       ;Pull-Ups aktivieren
         cbi PORTD,sample     ;register auf BUS legen


;-------------------------------------------------------------------
;预触发位置初始化
;z.B.: 0%   PreTrigger-Wert=8, $00-$08=$F8 (high-Byte)
;Sample-Nr.0 ist Triggersample, es muessen noch 2047 Samples folgen.
;Samplezahl=$0000-2047=$F801
;z.B.: 25%  PreTrigger-Wert=6, $00-$06=$FA (high-Byte)
;Sample-Nr. 512 ist Triggersample, es muessen noch 1535 Samples folgen.
;Samplezahl=$0000-1535=$FA01
;-------------------------------------------------------------------
         ldi wreg,0x00
         sub wreg,pretrig
         ldi bufcntL,0x01
         mov bufcntH,wreg


;-------------------------------------------------------------------
;Mode auswerten und passende Routine aufrufen (Logic-Analyzer)
;-------------------------------------------------------------------
Mode0:
         cpi mode,0         ;internal Clock, internal Trigger
         brne Mode1
         rjmp M0_Start
Mode1:
         cpi mode,1         ;external rising Clock, int. Trigger
         brne Mode2
         rjmp M1_Start
Mode2:
         cpi mode,2         ;external falling Clock, int. Trigger
         brne Mode3
         rjmp M2_Start
Mode3:
         cpi mode,3         ;internal Clock, external Trigger=pos
         brne Mode4
         rjmp M3_Start
Mode4:
         cpi mode,4         ;internal Clock, external Trigger=neg
         brne Mode5
         rjmp M4_Start
Mode5:
         cpi mode,5         ;State
         brne Test1
         rjmp M5_Start
Test1:
         cpi mode,7         ;Binary-Counter
         brne Test2
         rjmp T1_Start
Test2:
         cpi mode,8         ;AA-55-Pattern
         brne Test3
         rjmp T2_Start
Test3:
         cpi mode,9         ;Walking-Zero (Periode=9Takte)
         brne M0_Start
         rjmp T3_Start


M0_Start:
;-------------------------------------------------------------------
;MODE=0 internal Clock, internal Trigger
;-------------------------------------------------------------------
;Timer-0 initialisieren
         mov timereg,delta    ;取样间隔
         out TCCR0,prescal    ;Timer-0 装入分频值并启动
         in temp,TCNT0
M0_synchronisieren:
         in wreg,TCNT0        ;da Prescaler-Stand unbekannt, auf Timer-
         cp wreg,temp         ;sprung synchronisieren
         breq M0_synchronisieren
         ldi wreg,0x00        ;Clear timer-0
         out TCNT0,wreg

M0_WaitForTrigger:
M0_TimingLoop1:
         in wreg,TCNT0        
         cp timereg,wreg      ;等待,知道到达取样间隔
         brne M0_TimingLoop1  

         add timereg,delta    ;下一计数器目标值
         sbi PORTD,sample     
         cbi PORTD,sample     ; ___/'''\___ 锁存外部数据
         nop
         in wreg,PINB         ;sample auf triggerung pruefen
         or wreg,mask         ;
         out PORTD,store1      ;    写入SRAM
         out PORTD,store2

         cpse wreg,trig       ;sample = triggerbyte ?
         rjmp M0_WaitForTrigger ;nein..

M0_GetSamples:                ; 被触发
M0_TimingLoop2:
         in wreg,TCNT0
         cp timereg,wreg
         brne M0_TimingLoop2
         
         add timereg,delta
         sbi PORTD,sample     ;sample nehmen und
         cbi PORTD,sample     ;register auf BUS legen
         nop
         out PORTD,store1
         out PORTD,store2

         add bufcntL,aux1     ;incr. BufferCounter
         adc bufcntH,aux0     ;"
         brcc M0_GetSamples
         rjmp RAMFull


M3_Start:
;-------------------------------------------------------------------
;MODE=3 internal Clock, externe positive Triggerflanke
;-------------------------------------------------------------------
         out TCCR0,prescal    ;Timer-0 mit passendem PreScaler verbinden
M3_WaitForTrigger:
M3_TriggerLoop1:
         sbi PORTD,sample
         cbi PORTD,sample
         nop
         sbic PINB,extpin     ;warte auf triggerpin=L
         rjmp M3_TriggerLoop1
M3_TriggerLoop2:
         sbi PORTD,sample
         cbi PORTD,sample
         nop
         sbis PINB,extpin     ;warte auf triggerpin=H
         rjmp M3_TriggerLoop2
         in timereg,TCNT0     ;timer einlesen
         add timereg,delta    ;naechsten samplezeitpunkt berechnen
         out PORTD,store1
         out PORTD,store2

         rjmp M0_GetSamples   ;


M4_Start:
;-------------------------------------------------------------------
;MODE=4 internal Clock, externe negative Triggerflanke
;-------------------------------------------------------------------
         out TCCR0,prescal    ;Timer-0 mit passendem PreScaler verbinden
M4_WaitForTrigger:
M4_TriggerLoop1:
         sbi PORTD,sample
         cbi PORTD,sample
         nop
         sbis PINB,extpin     ;warte auf triggerpin=H
         rjmp M4_TriggerLoop1
M4_TriggerLoop2:
         sbi PORTD,sample
         cbi PORTD,sample
         nop
         sbic PINB,extpin     ;warte auf triggerpin=L
         rjmp M4_TriggerLoop2
         in timereg,TCNT0     ;timer einlesen
         add timereg,delta    ;naechsten samplezeitpunkt berechnen
         out PORTD,store1
         out PORTD,store2

         rjmp M0_GetSamples   ;


M1_Start:
;-------------------------------------------------------------------
;MODE=1 external Clock, rising Edge
;-------------------------------------------------------------------
M1_WaitForTrigger:
M1_ClockLoop1:
         sbi PORTD,sample
         cbi PORTD,sample
         nop
         sbic PINB,extpin     ;warte auf clockpin=L
         rjmp M1_ClockLoop1
M1_ClockLoop2:
         sbi PORTD,sample
         cbi PORTD,sample
         nop
         sbis PINB,extpin     ;warte auf clockpin=H
         rjmp M1_ClockLoop2
         in wreg,PINB         ;sample auf triggerung pruefen
         or wreg,mask         ;
         out PORTD,store1
         out PORTD,store2

         cpse wreg,trig       ;war sample=triggerbyte?
         rjmp M1_WaitForTrigger ;nein..
M1_GetSamples:
M1_ClockLoop3:
         sbi PORTD,sample
         cbi PORTD,sample
         nop
         sbic PINB,extpin     ;warte auf clockpin=L
         rjmp M1_ClockLoop3
M1_ClockLoop4:
         sbi PORTD,sample
         cbi PORTD,sample
         nop
         sbis PINB,extpin     ;warte auf clockpin=H
         rjmp M1_ClockLoop4
         out PORTD,store1

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -