综合总结.docx
《综合总结.docx》由会员分享,可在线阅读,更多相关《综合总结.docx(12页珍藏版)》请在冰豆网上搜索。
综合总结
RC充放电规律总结:
结论:
在RC充电电路从开始充电算起:
1.经过一个时间常数T,电容电压被充电到0.63E(E是充电电压);
2.经过三个时间常数T(即3T),电容电压被充电到0.95E;
3.经过五个时间常数T(即5T),电容电压被充电到0.99E;
注:
不管时间常数T的大小如何,也不论电源电压E的大小,其充电规律是不会改变;
在RC放电电路从开始充电算起:
1.经过一个时间常数T,电容电压被放掉0.63E(E是充电电压),剩余电压为0.37E;
2.经过三个时间常数T(即3T),电容电压被放掉0.95E(E是充电电压),剩余电压为0.05E;
3.经过五个时间常数T(即5T),电容电压被放掉0.99E(E是充电电压),剩余电压为0.01E;
注:
不管时间常数T的大小如何,也不论电源电压E的大小,其充电规律是不会改变;
另外对常用T=RC在电路中的求解方法:
由于RC电路充放电时间常数T均与电源E无关,故可甩掉电源E
1.若电源E支路没有其它元件时,删除此电源支路;
2.若电源E支路串有电阻或电容元件时,短路电源E;
最后用电阻,电容,串并混联计算,可以求出时间常数T
结构体Struct:
body1:
.struct
index:
.db10h
neme:
.db'Dive'
value:
.dd0ffch
body1:
.endst
Mystr1:
body1[20,'char',ffff];
.code
ldaMystr1@index
在电路中判断反馈的方法:
1.反馈极性的判别方法:
A.断开反馈通路,给定原输入信号一个极性;
B.根据该极性,逐步推断基本放大器中有关信号相应的极性;
C.确定反馈信号VF的极性;
D.根据输入信号VI与VF的极性,确定净输入信号VID与VI,VF的数值关系;若|VID|<|VI|则为负反馈,若|VID|>|VI|则为正反馈;
2.电压反馈与电流反馈的判别方法:
A.先区分基本放大器A和反馈网络F;
B.判别F的输入端和A的输出端的连接方式;并联的称为电压反馈;串联的称为电流反馈.
3.并联反馈与串联反馈的判别方法:
A.先区分基本放大器A和反馈网络F;
B.判别F的输出端和A的输入端的连接方式;并联的称为并联反馈,串联的称串联反馈;
BIT和AND用法:
一.BIT和AND用法的区别:
1.AND可以来判断某bit,使用mask的方法处理,会改变累加器的值,会影响标致位N,Z,会影响操作前的N,Z的标致;
2.BIT可以来判断某bit,也可以来判断N和V标致,用来判断bit位时,需要累加器,其操作和AND一样,但不会破坏寄存器值,它还可以来判断N,V,Z,但只有Z会影响到操作前的Z标致;
LDA#08H;selectbit3forcheckingwithmask
LOOP:
BIT$12;checkedmemory
BEQMEET;branchonb3=0
BVCMEET;branchonb6=0
BMILOOP;loopifb7=1
MEET:
;continueherewhenb3orb6orb7=0
...
二.在程序中需要暂存a值时,又不需要用其它寄存器暂存时,可以用pha和pla来处理;
ldaaccumulator+1
adcphase+1
pha;saveintegerpartforaddresscalcs
;//removetheintegerpartfromthephaseaccumulator
and#01Fh
staaccumulator+1
pla;restoreintegerpartforcalc
I/O设置问题:
1.当I/O是输出时,设置的属性是ODP(只能输出高,输出低时是Float状态),且给I/O的初始化的Data是0,则对I/O作读的动作时,I/O的状态是Float及外部是什么电平,读到的就是什么电平!
2.1.当I/O是输出时,设置的属性是ODN(只能输出低,输出高时是Float状态),且给I/O的初始化的Data是1,则对I/O作读的动作时,I/O的状态是Float及外部是什么电平,读到的就是什么电平!
在Gpc或Gpc1中需要作按键sutain功能时条件:
1.需要要相应的音色包洛(envlope)中有红色的循环,否则不能有sutain效果;:
GPC中:
D_T_TestToneLoop:
EQU$-T_ToneInstParaTable
DB10,40H
DB10,90H,D_T_TestToneLoop
DB255,00H
DB0
GPC1中:
%FirstWTInstParaPtD_WT_ORGAN,
%NextWTInstParaPt25,F0H;label,duration(EvUnitTimems),TargetValue
%NextWTInstParaPt240,60H;duration(EvUnitTimems),TargetValue
Organ_Loop:
%NextWTInstParaPtReturn240,60H,Organ_Loop
%NextWTInstParaPt80,00H;duration(EvUnitTimems),TargetValue
%EndWTInstParaPt
2.播放前要使toneholdenable(GPC或GPC1中可以设置调用相应的函数)
3.按键Release后需要使toneholddisable(tone播放就会停止);
;******************************************************************************************
;在GPC中实例:
;*******************************************************************************************
KeyStroke:
jsrF_HoldtoneCh1;enabletonesutain
lda#7;Playtone,A:
instrumentindex,X:
frequencyindex(0~71)
ldx#45
jsrF_PlayToneCh1
KeyRelease:
jsrF_ReleaseToneCh1;disabletonesutain
rts
F_HoldtoneCh1:
SEI
%TestToneCh1
BCCL_Exit?
sei
LDAR_StatusCh1
AND#D_ToneHold
STAR_StatusCh1
CLI
L_Exit?
:
RTS
F_ReleaseToneCh1:
SEI
%TestToneCh1
BCCL_Exit?
LDAR_StatusCh1
AND#.NOT.D_ToneHold
STAR_StatusCh1
L_Exit?
:
CLI
RTS
;*********************************************************************************************
;在GPC1中:
;*********************************************************************************************
KeyStroke:
%WT1HoldEnable;enabletonesutain
lda#1
ldx#35
jsrF_PlayWaveTableWT1;Playtone,A:
instrumentindex,X:
frequencyindex(0~71)
rts
KeyRelease:
%WT1HoldDisable;disabletonesutain
rts
%WT1HoldEnable.MACRO
LDAR_WTStatus1
ORA#D_WTWT1Hold
STAR_WTStatus1
.ENDM
%WT1HoldDisable.MACRO
LDA#00H
STAR_EnvCounterWT1
LDAR_WTStatus
AND#.NOT.D_WTWT1LoopPt
STAR_WTStatus
LDAR_WTStatus1
AND#.NOT.D_WTWT1Hold
STAR_WTStatus1
.ENDM
SPC48:
SPU+SW_SPEECH:
经查,导致在SPC4中同时播放2CHMIDI和1CHSoftwareSpeech异常的原因是:
SWspeech是在TimerA的INTservice中抓PCMdata的,而MIDIdecoder是在中断外抓数据,这两个抓数据的DPTR会同时处理到P_Bank寄存器,目前的demo程式在抓MIDI数据时没有考虑到SWspeech方式会在中断内修改P_Bank值,导致在readMIDIdatafromROM时,会出现Bank值被误修改的状况,从而引起你碰到的这些现象,tracebuffer如下:
7EA623B6-BDC323LDAT_ProcessDataEventL,X23C7-A4
7EAA23B9-8540STAD_ComparatorIntEnable0040-A4
7EAD23BB-BDCB23LDAT_ProcessDataEventH,X23CF-23
7EB123BE-8541STA410041-23
7EB423C0-6C4000JMP(D_ComparatorIntEnable)040-A4
7EB90041-23
7EBA23A4-203FJSRF_GetMIDIData23A6-27;中断外从ROM中读取MIDI数据
7EC0273F-A557LDA570057-09;MIDIDPTR中获取Bank值
7EC32741-8D20STAP_BANK0320-09;设置Bank地址为“09”
7EC72744-A2LDX#R_TargetCh1Integer2744-A2
7EC9IRQ->2AD101FB-2701FA-4401F9-20
7ECE2AD1-488APHA01F8-09
7ED12AD2-8A48TXA
7ED32AD3-4898PHA01F7-04
7ED62AD4-9848TYA
7ED82AD5-48ADPHA01F6-30
7EDB2AD6-AD09LDAP_IOC_BUF0309-80
7EDF2AD9-09ORA#D_ZCJump2ADA-01
7EE12ADB-8D09STAP_IOC_BUF0309-81
7EE52ADE-A9LDA#D_ExtAND16Hz2ADF-00
7EE72AE0-2451BITR_SysStatus0051-20
7EEA2AE2-106270BPLR_InstCh12AE4-70
7EEE2B46-2086JSRF_IntServiceChA2B48-0B
7EF40B86-AD09LDAR_SpeechFlagChA0209-21
7EF80B89-29AND#R_Ch4FrameLen0B8A-37
7EFA0B8B-49EOR#D_ZCJump0B8C-01
7EFC0B8D-F071BEQR_DrumIndex
7EFE0B8F-49EOR#D_RampUpFinish0B90-20
7F000B91-F01249BEQR_Ch2FsL
7F030BA5-4C07JMPL_PlayPcmTypeChA0BA7-0D
7F060D07-AD06LDAR_DacChA0206-47
7F0A0D0A-8D41STAP_DAC_A20341-47
7F0E0D0D-A650LDXR_ChASpeechAddrB0050-07;TimerA中断内读取PCMdata,从SpeechDPTR中获取Bank值
7F110D0F-8E20STXP_BANK0320-07;设置Bank地址为“07”,MIDI的Bank地址被修改
7F150D12-A2LDX#D_ExtAND16Hz0D13-00
7F170D14-A14ELDA(R_ChASpeechAddrL,X)A47D-44
7F1D0D16-C9CMP#810D17-81
7F1F0D18-F00ABEQR_Ch1VolCtl
7F210D1A-C9CMP#D_MixLCtl0D1B-FF
7F230D1C-D0034CBNED_TimerByFcpu
7F260D21-8D06STAR_DacChA0206-44
7F2A0D24-E64EINCR_ChASpeechAddrL004E-7E
7F2F0D26-D00EE6BNER_Ch1DPTNB
7F320D36-60ADRTS2B48-0B
7F382B49-AD09LDAP_IOC_BUF0309-81
7F3C2B4C-29AND#FE2B4D-FE
7F3E2B4E-8D09STAP_IOC_BUF0309-80
7F422B51-68A8PLA01F6-30
7F462B52-A868TAY
7F482B53-68AAPLA01F7-04
7F4C2B54-AA68TAX
7F4E2B55-688DPLA01F8-09
7F522B56-8D54STAP_INT_TimerA_Clr0354-09
7F562B59-4048RTI01FB-27
7F5C2744-A2LDX#R_TargetCh1Integer2744-A2
7F5EIRQ->2B5A01FB-2701FA-4401F9-20
7F632B5A-488APHA01F8-09
7F662B5B-8A48TXA
7F682B5C-4898PHA01F7-04
7F6B2B5D-9848TYA
7F6D2B5E-48A5PHA01F6-30
7F702B5F-A559LDAR_MIDIStatus0059-C0
7F732B61-29AND#D_ExtIntEnable2B62-80
7F752B63-F02DBEQR_Ch3DPTNH
7F772B65-E65CINCR_DTCounter005C-01
7F7C2B67-A55CLDAR_DTCounter005C-01
7F7F2B69-C55DCMPR_TempoIndex005D-14
7F822B6B-D025A9BNER_Ch3DPTRH
7F852B92-C652DECR_1024IntCnt0052-03
7F8A2B94-D025A9BNER_Ch3DPTRH
7F8D2BBB-AD09LDAP_IOC_BUF0309-80
7F912BBE-49EOR#D_ExtIntEnable2BBF-80
7F932BC0-8D09STAP_IOC_BUF0309-00
7F972BC3-68A8PLA01F6-30
7F9B2BC4-A868TAY
7F9D2BC5-68AAPLA01F7-04
7FA12BC6-AA68TAX
7FA32BC7-688DPLA01F8-09
7FA72BC8-8D57STAP_INT_1024_Clr0357-09
7FAB2BCB-4048RTI01FB-27
7FB12744-A2LDX#D_ExtAND16Hz2745-00
7FB32746-A155LDA(R_MIDIDPTR,X)A3D1-C2;退出TimerA中断Speechservice后,从ROM中读取MIDI数据
7FB92748-8558STAR_MIDIData0058-C2;因Bank地址被修改,读取MIDIdata为07A3D1(bank7)的值,非09A3D1(bank9)
7FBC274A-E655INCR_MIDIDPTR0055-D2
7FC1274C-D012E6BNER_Ch2FsL
7FC42760-60A2RTS23A6-27
7FCA23A7-A458LDYR_MIDIData0058-C2
7FCD23A9-203FJSRF_GetMIDIData23AB-27
7FD3273F-A557LDA570057-09
7FD62741-8D20STAP_BANK0320-09
7FDA2744-A2LDX#D_ExtAND16Hz2745-00
7FDC2746-A155LDA(R_MIDIDPTR,X)A3D2-00
7FE22748-8558STAR_MIDIData0058-00
7FE5274A-E655INCR_MIDIDPTR0055-D3
7FEA274C-D012E6BNER_Ch2FsL
7FED2760-60A2RTS23AB-27
7FF323AC-78A5SEI
7FF523AD-A558LDAR_MIDIData0058-00
7FF823AF-855ASTAR_DeltaTime005A-00
7FFB23B1-845BSTY5B005B-C2
7FFE23B3-5860CLI
解决方法是:
在中断外读取MIDIdata时做中断保护,防止因P_Bank被修改导致的数据读取错误,如下:
F_GetMIDIData:
sei;Jasonadd05-10-19屏蔽中断,防止MIDI数据读取时bank值被误置
LDAR_MIDIDPTR+2;Bank
STAP_BANK
LDX#0
LDA(R_MIDIDPTR,X);Fetchdatafrommemory
STAR_MIDIData
cli;Jasonadd05-10-19数据正确读取后打开中断
INCR_MIDIDPTR
BNEL_NotOverFlow?
;ifLowByteaddroverflow,INCHighByteaddr
INCR_MIDIDPTR+1;HighByteaddress
LDAR_MIDIDPTR+1
CMP#C0H;reachC000H(BFFFH)
BCCL_NotOverFlow?
;IfR_MIDIDPTR+1LDA#0;returnto8000H
STAR_MIDIDPTR
LDA#80H;ifHighByte=C0H,gotonextbankfrom8000Hforeverybank!
STAR_MIDIDPTR+1
INCR_MIDIDPTR+2
L_NotOverFlow?
:
RTS
GPC816channel问题:
当用midichannel16来播放midi时,在现有的demo中存在下面的问题:
可能会丢掉音色;
注要原因是demo中定义:
%RAM_ALLOCR_InstCh1,15
%RAM_ALLOCR_DrumIndex,1
测16channel的音色号和鼓的index用,测可能会出问题;
当16channel用来表示Event时则没有这种问题:
GPC电流问题:
1、客户问到用spcPiggback测试客户demo程序,发现sleep是有大电流问题400uA以上(用ROSC);
2、我达接电路测试,电流是10UA以下(用crystal);
3、用OTP测试,电流在4Ua以下;
4、客户程序种没有Float的状态;
5、真正原因是spcpiggback应用中:
用ROSC是其10K电阻需要断开,来节约能源;当10K电阻没有断开时,则会有大电流低消耗;
6、在Crystal时,则不需要断开10K电阻;
Spds301sleep和wakeup问题:
1.GPDS30X使用的是Sunplus自訂的SerialInterface,由於這套protocol可以連續寫或讀,因此SIOprotocol中,數據傳送中不需要等到Stopbit才開始處理數據,就像你使用SIO在做連續讀取/寫入SerialSRAM(SPRS512)時,也不需要等到Stopbit才開始傳送數據一樣.當MCU送完command後,後面跟著的30bytes送完之後,GDS30X就會開始執行command,不需要等到Stopbit.DS301收到sleepcommand後,在數十us的時間內就會進入sleepmode,時間的確短了一些.DS302已經延長了收到sleepcommand後進入sleep的時間,因此DS302應該不會有此問題.
2.送Sleep命令后,SPDS301sleep后,由于有改变SDA/SCk或32768没有关,则会唤醒GPDS301,此问
题可以通过修改软件解决;
3、在送sleepcommand后不要送Stop就可以解决一般的唤醒问题;
4、在spds301唤醒过程相当于Reset过程,所有需要校频率和其它设置;
5、进行校频时,可以采用两种方法:
A、自动校频(需要32768),只能校频使PWM输出到8KHz;
B、手动校频,可以向GPDS30X的Timer中送频率数,这种方法可以时PWM输出到任意值,建议最大不超12KHz;
手动校频时可以采用:
LDA#2H;timer初值高
STAR_PWM_Timer_High
LDA#67H;timer初值低
STAR_PWM_Tim