|
| 采购元器件好去处--维库电子市场网推荐 |
| 技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | EMC技术 | ARM技术 | EDA技术 | PCB技术 | 嵌入式系统 驱动编程 | 集成电路 | 器件替换 | 模拟技术 | 新手园地 | 单 片 机 | DSP技术 | MCU技术 | IC 设计 | IC 产业 | CAN-bus/DeviceNe |
AVR多段多点定时及时钟控制应用 |
| 作者:lhfl9518 栏目:单片机 |
| AVR多段多点定时及时钟控制应用 1 概 述 由于AVR的工作频率高而执行周期又极短对应用微电脑CPU来进行定时计数时大都会采用与其工作周期同步的计数因而使得其定时计数周期为工作周期也是最高极限以8051系列为例工作周期是12个振荡周期就12MHZ而言其定时计数周期最短为1S用AVR则在10MHZ工作频率时其计时计数最短为100ns即10MHZ测量频率显然有10倍之高若用PIC16C5X系列则定时计数器没有中断控制这样比较麻烦且不精确而PIC其它系列却把所有中断向量挤在同一个地址中断后还要分别按照其标志加以辨别然后再对应跳到中断地址这种方法极不明智本来中断就需要实时的对应执行如此一来便丧失了实时控制机会也拖延控制时间 AVR除了对应定时计数具有ICP实时硬件捕捉器(CAPTURE)外内部还具有OC1A/1B硬件设置比较实时输出控制同时也有高分辨率的PWM而定时计数器更有多级的分频器因此用timer1作16位的预设计数日时分秒计时及显示控制比较简捷方便若使TC1的分频器的TCCR1B=04即设置分频为256则在8MHZ的工作频率时进入TC1的计时单位为125ns*25632s而16位的计数默认值可直接进行加载65536(250*125)的默认值令TC1计数250*125个TCK132S即达32S*250*1251S的溢出计时作时钟计时而不必用中断次数作1秒计时的检查判别也就是说若工作频率8MHZ时ck=125nS则预分频256时为32S而tcnt1为65535(250*125)作计数溢出则溢出中断计时为250*125*32uS=1S若中断则为1S计时但对应1秒计时中断需4ck且执行程序需5ck才会将新值加载tcnt1内共9ck因此需再延时247ck总共延时2479256ck的一个tc1=32S同时输入周期时间来精确的校正 当计时达1秒时在中断执行向量程序中需对应将秒(scnt)分(mcnt)时(hcnt)等作进位检查计时秒分则分别输出到六位七段LED数码管上分别对应扫描显示因此主程序一直将SCNTMCNTHCNT等秒分时或设置定时值或对应此NN组的输出控制数据内容等对应输出扫描到六位七段LED数码管中显示当TIMER1定时器溢出产生中断时立即将TCNT1的预载值重新进行加载以便CT1继续计时下去之后再作60秒的检查若秒(SCNT)加1后达到60秒时必需清零并令分计时进位加1同样分(MSCNT)加一后也需作60分的检查若是则清零再令时(HCNT)计时加1并检查是否为24小时是则清零完整的程序如下列所示 |
| 2楼: | >>参与讨论 |
| 作者: lhfl9518 于 2006-10-11 19:46:08 发布:
2 接口电路 AVR的工作时钟若使用8MHZ石英晶体振荡如图17-1所示内部经分频器设置预分频256后得32s输入AVR的TC1端作计时脉冲以AVR的PB0PB7输出直接驱动六位七段LED的阳极显示而以PD7PD2输出直接驱动扫描六位数的七段LED阴极控制 AVR 多段多点定时控制 PB0PB3通过电阻与PB4PB7通过电阻组成4 * 4个键盘扫描读入如果使用AVR的20接脚的小IC如AT90S2313则因其没有PD7接脚阴极扫描需改用PD6PD1作控制定时控制可由PD0端输出这样就足够了但若改用LCD 2021显示字幕时则它的控制接脚除了DB0DB7仍由PB0-PB7控制外其ER/SR/W只有3个控制接脚而且当E=0控制时LCD的数据及R/SR/W接脚会处于高输入阻抗的OFF态因此AVR的对应控制接脚就可用来作键盘扫描及其它控制应用如果使用AT90S8515时则有PC0PC7PA0PA7PD1PD0作驱动SSR或继电器的定时控制输出如图17-1电路接线所示 图17-1 AT90S8515多段多点定时及时钟控制电路 根据上列分析分别实验如下 |
|
| 3楼: | >>参与讨论 |
| 作者: lhfl9518 于 2006-10-11 19:48:28 发布:
一功能说明 如果以一秒计时以六位七段LED数码管显示则可显示时分秒但对应多段多 AVR 多段多点定时控制 点的定时控制组数数据及定时时间等的设置和显示则将组数nn及输出控制数据设置为NN–DDD等方式显示而定时的时HH分MM的设置就用HH MM––作对应显示因此显示型态有三种而对应数码的输入则用对应各显示屏的小数点来表示起始为时钟的时(H)Hour和分(M)Minute秒(S)Second的设置输入显示方式若按09数字输入时则为时钟的时(H)Hour输入设置即用H.H.MM SS显示方式所以要调整时间时须按TM(0AH)键会显示H.H.MM SS的时分秒等时间若按(SHIFT)10H键则将作移位到分或秒输入设置此时对应由09设定左移入时的时间但若超过24就自动清零若对应键入分则输入09设定左移入分的时间若超过60就自动清零小数点会随着(SHIFT)键而移到第三位表示作秒输入设定而显示为HH MM S.S.注意在时间显示时分秒时均以第2位小数点以1秒闪烁显示若对应键入秒则左移入秒的时间超过60就自动清零显示为HH MM S.S.另外按下多段多点(ST)定时闹铃的时间设置键时会显示H.H. MM ––同样的以小数点的一秒闪烁加以辨识通知同类时钟的调整一样用(SHIFT)来作时分的闹铃时间设置对应各组点的指定为当按组数(SN)0DH键时将对应显示N.N.–DDD因此可由09数字输入0099组的定时控制设置时间及其对应数据若按SD(Set Data)0CH键时将显示NN–D.D.D.此时可由09移入十进制000255的控制数据若超过255将自动清零当时钟计时时间到达所设置的定时时间时会使控制数据HH(DDD) 输出到PORTC组数递增(INC)0EH键则使组数NN加一最大为99若按组数递减(DEC)0FH键则会使组数NN减一最小为00另外有11H的所有定时控制数据清除键停止时钟计时的(HOLD)12H保持键等以便作秒的校对整个键盘功能设置如下 SDI 8 4 SFT/ 0 STN 9 5 CLR/1 INC TIM 6 HLD/2 DEC STM 7 3 SHIFT 图17-2 AVR 多段多点定时及时钟控制的键盘功能设置 所有的时分秒最大值分别是246060都可以进行比较并判断辨别用作进位的依据秒分时作十六进制递增后将其存于SCNTMCNTHCNT但为了显示在七段LED字形上及输入设置调整需用十进制进行因此需将其转成十进制放在SCNTDMCNTDHCNTD内再转成七段LED显示码于SRAM寄存器内扫描显示所设置的定时时间和数据设置输入都以十进制方式作输入及输出显示但要存入对应各组的SRAM内时会将其转成十六进制存储并可逐一将各组的定时与时钟值MSCNTHCNT比较作多段多点的定时控制如果相等会将其所设定的控制数据输出到PORTC而PORTC可接到R-2R的D/A转换端作对应模拟电压输出或直接接到光隔离的SSR来驱动控制若用模拟电位输出控制时则将成为对应各定点时间作模拟电位输出的时序指令如温度或压力等控制 |
|
| 4楼: | >>参与讨论 |
| 作者: lhfl9518 于 2006-10-11 19:50:00 发布:
AVR 多段多点定时控制 二流程图 根据上述功能按照两个程序规划整个控制程序其中为多段多点定时控制及时钟的输入设置和调整而另一个是定时器TC1计时一秒的控制及分时的进位计时同时作数字模式的转换及预定时比较作对应控制这两大程序的流程图如下所示 三程序及其对应说明 ;avr7sck.asm .include "8515def.inc" 广州市天河双龙电子有限公司 http://www.sl.com.cn AVR 多段多点定时控制 .cseg .org 0x00 rjmp RESET ;AVR复位寻址 .def TEMPdh =r2 .def TEMPdl =r3 .def CNT =r10 .def SCNN =r11 .def KEYN =r12 .def SCNK =r13 .def SCNDP =r14 .def KSNI =r15 .def TEMP =r16 .def TEMP1 =r17 .def TEMP2 =r18 .def TEMP3 =r19 .def TEMPn =r18 .def scnt =r22 .def mcnt =r21 .def hcnt =r20 .def scntd =r25 .def mcntd =r24 .def hcntd =r23 .cseg .org 0x06 ;timer1 溢出中断向量 intt1: rjmp chk1s ;跳到检测是否1秒计时到 .cseg .org 0x010 ;主程序起始地址 RESET: ldi TEMP,low(RAMEND) ;RAMEND为8515def.inc内建定义值为025FH out SPL,TEMP ;起始堆栈指针低位将R16=TEMP=02H放入SPL=3DH ;若硬件堆栈或者AVR装置内容SRAM小于256字符(byte)时下列二行程序就可省略, ldi TEMP,high(RAMEND) ;以TEMP=R16<5FH为资料加载缓冲寄存器 out SPL+1,TEMP ;堆栈指针高位将R16=TEMP=5FH放入SPL+1=3EH wdr ;在使用看门狗定时器前需复位看门狗定时器内容 ;避免在接下来程序前就因WDT已快计时溢出而复位 |
|
| 5楼: | >>参与讨论 |
| 作者: lhfl9518 于 2006-10-11 19:51:19 发布:
AVR 多段多点定时控制 ldi TEMP.html">TEMP,$0F;(1<<WDE) ;WDTCR地址$21不可位设定TEMP缓冲 ;令WDE=D3=1 out WDTCR,TEMP.html">TEMP ;将已设定WDE=1=D3位值的TEMP输出到WDTCR内 clr scnt ;令秒寄存器SCNT=00 clr mcnt ;令分寄存器MCNT=00 clr hcnt ;令时寄存器HCNT=00 clr scntd ;令十进制秒寄存器SCNT=00 clr mcntd ;令十进制分寄存器CNT=00 clr hcntd ;令十进制时寄存器HCNT=00 ldi TEMP.html">TEMP,$00 ;令TEMP寄存器放入00 out tccr1a,TEMP.html">TEMP ;将TEMP=00内容输出到TCCR0内禁止比较器 ;及pwm动作 out tccr1b,TEMP.html">TEMP ;将TEMP=00内容输出到TCCR0内 ;停止TC0计时及捕获 ldi TEMP.html">TEMP,high(65536-250*125) ;TEMP为高8位(65536-250*125) ;放入TCNT1H out tcnt1l,TEMP.html">TEMP ;TCNT1由(65536-250*125) ;计数到65536溢出共计时250*125 ldi TEMP.html">TEMP,low(65536-250*125) ;TEMP为低8位(65536-250*125) ;放入TCNT1L out tcnt1h,TEMP.html">TEMP ;TCNT1由(65536-250*125) ;计数到65536溢出共计时250*125 LEDA:LDI TEMP1,$06 ;令TEMP1=06共6个显示数据 LDI XH,$00 ;令X间接寻址指针在0004的 ;SRAM作显示数据寻址 LDI XL,$04 ;R9-R4显示字行寄存器 LDI TEMP,$3F ;令TEMP=3F值 REDSP:ST X+,TEMP ;将TEMP=00存放于SRAM的X地址内 ;并令X加1 DEC TEMP1 ;将TEMP减1 BRNE REDSP ;若TEMP减1后不为0则跳回REDSP ;再令TEMP置于SRAM内 sei ;中断总开关sreg=d7=i=1 ldi r16,0b10000000 ;令toie1=1触发中断 out timsk,r16 ;将R16的D7=1令TOIE1=1触发中断 LDI YH,$00 ;令间接指针YH=0 LDI XL,04 ;令XL为18寻址于R4间接指针 ldi r16,04 ;令R16=04 out tccr1b,r16 ;将R16=04设定TC1分频256 ;开始计时其单位时间为32uS |
|
| 6楼: | >>参与讨论 |
| 作者: lhfl9518 于 2006-10-11 19:52:23 发布:
AVR 多段多点定时控制 LDI TEMP,$FF ;令TEMP=$FF以便令DDRADDRCDDRD设定为输出态 OUT DDRA,TEMP OUT DDRC,TEMP OUT DDRD,TEMP CLR TEMP2 CLR TEMP1 CLR KSNI DSPKB:RCALL SCAN ;SCAN将R04-R09内容显示于七断字幕并等待按键 MOV TEMP,KEYN ;将所按的键码置于TEMP寄存器内 cpi TEMP,$0a ;TEMP=键码寄存器与0AH值比较 BRCS nkey1 ;若小于0AH则借位标志CF=1为0-9之数字键 BREQ timstk ;若为0AH是时间设定键时分显示HH MM SS cpi TEMP,$0b ;将键码TEMP内容与0BH比较是否为定时设定键 BREQ settk ;若为0BH是定时设定键时分而显示HH MM st cpi TEMP,$0c ;将键码TEMP内容与0CH比较是否为定时数据设定键 BREQ setdk ;若为0CH则是定时数据设定键显示NN -D2 D1D0 cpi TEMP,$0d ;将键码TEMP内容与0DH比较 ;判断是否为定时组数NN设定键 BREQ setnk ;若为0DH则是定时组数设定键显示NN -D2 D1D0 cpi TEMP,$0e ;将键码TEMP内容与0EH比较判断是否为定时组数递加键 BREQ inck ;若为0EH则是定时组数加1键显示NN -D2 D1D0 cpi TEMP,$0f ;将键码TEMP内容与0FH比较判断是否为定时组数递减键 BREQ deck ;若为0FH则是定时组数递减键显示NN -D2 D1D0 cpi TEMP,$10 ;将键码TEMP内容与10H比较判断是否为设定移位键 BREQ shftk ;若为10H则是设定移位SHFT键以小数点表示 cpi TEMP,$11 ;将键码TEMP内容与11H比较判断是否为清除数据键 BREQ clrk ;若为11H则是将所有定时及其设定数据予以清除 cpi TEMP,$12 ;将键码TEMP内容与12H比较判断是否为计时暂停键 BREQ holdk ;若为12H则是将停止计时并显示HH MM SS计时值 RJMP DSPKB ;跳回DSPKB再次显示及读取键盘并作传出移位显示 NKEY1:RJMP NKEY ;跳到较远的nkey程序 ;时间的设定调整及定时设定的移位选择键 shftk: mov TEMP,ksni ;设定位移数ksni装入TEMP寄存器内 inc ksni ;将设定位移数KSCNI加1 cpi TEMP,$02 ;检测TEMP的位移设定数是否为02过大值 brcs nosft ;若TEMP小于03则c=1故正常值则跳到nosft clr ksni ;若TEMP大于等于3则令ksni清零 nosft: RCALL SETP ;令设定要输入数码地址数七段LED的小数点对应显示 RJMP DSPKB ;跳回DSPKB再次显示及读取键盘并作输出移位显示 |
|
| 7楼: | >>参与讨论 |
| 作者: lhfl9518 于 2006-10-11 19:55:17 发布:
AVR 多段多点定时控制 CLR KSNI |
|
| 8楼: | >>参与讨论 |
| 作者: lhfl9518 于 2006-10-11 19:59:10 发布:
AVR 多段多点定时控制 RCALL DPNDM ;调用DPNDM显示NN -D DD字幕 RJMP DSPKB ;跳到DSPKB作数据输入设定模式R69-R6E的显示 ;将定时控制的组数递加1 inck: INC TEMP2 ;将组数TEMP2内容加1 CPI TEMP2,99 ;与99最大组数值比较 BRCS DPND1 ;若小于99则CF=1故为正常值跳到DPND1 CLR TEMP2 ;若超过99则CF=0故令组数TEMP2清零 DPND1:RCALL DPNDM ;调用DPNDM显示NN -D DD字幕 RJMP DSPKB ;跳到DSPKB作数据输入设定模式R69-R6E的显示 ;将定时控制的组数递减1 deck: CPI TEMP2,$00 ;将组数TEMP2内容与最小值00比较 BREQ DPND9 ;若等于00值则不再递减 DEC TEMP2 ;若不为00则正常递减1 RCALL DPNDM ;调用DPNDM显示NN -D DD字幕 DSPK1:RJMP DSPKB ;跳到DSPKB作数据输入设定模式R69-R6E的显示 dpnd9:ldi temp2,99 RCALL DPNDM ;调用DPNDM显示NN -D DD字幕 RJMP DSPKB ;跳到DSPKB作数据输入设定模式R69-R6E的显示 tmni1: rjmp tmni ;跳到较远的TMNI程序 ;鉴别为何种数字输入而对应将键入值KEYN进行左移入 NKEY:CPI TEMP1,$00 ;将数字输入模式寄存器TEMP1与00比较 BREQ TMNI1 ;若模式为00则跳到TMNI作时间调整输入 CPI TEMP1,$01 ;将数字输入模式寄存器TEMP1与01比较 BREQ STMNI ;若模式为01则跳到STMNI作定时时间的设定输入 CPI TEMP1,$02 ;将数字输入模式寄存器TEMP1与02比较 BREQ SETNI ;若模式为02则跳到SETNI作定时的组数设定输入 CPI TEMP1,$03 ;将数字输入模式寄存器TEMP1与03比较 BRNE DSPK1 ;若不等于则跳到DSPKI ;作数据输入设定模式R69-R6E的显示 ;对应各组定时控制的输出控制数据设定各定时点的设定存入数据依序为时分及数据 DATNI:RCALL CALTAD ;按照所设定的TEMP2 ;定时组点来计算出要存于SRAM的 Y指针值 PUSH YL ;将YLYH压入堆栈所指SRAM内保存 PUSH YH LDD TEMP,Y+2 ;将此组定时控制的第三字符即为控制数据加载TEMP内 RCALL HTOD2 ;将此十六进制TEMP控制数据 ;转成十进制存于TEMPDHTEMPDL内 LDI YL,$03 ;令将Y指着TEMPDL=R3的SRAM地址$0003 |
|
| 9楼: | >>参与讨论 |
| 作者: 寻觅 于 2006-10-11 20:03:05 发布:
不错,还 真挺详细的 |
|
| 10楼: | >>参与讨论 |
| 作者: lihai813 于 2006-10-11 20:19:18 发布:
看得很辛苦! |
|
| 11楼: | >>参与讨论 |
| 作者: wuly 于 2006-10-11 22:17:47 发布:
其实AVR可以开专栏的 |
|
| 12楼: | >>参与讨论 |
| 作者: lhfl9518 于 2006-10-12 8:37:39 发布:
本想传附件的,太大了 |
|
| 13楼: | >>参与讨论 |
| 作者: lhfl9518 于 2006-10-12 14:03:05 发布:
版主说的也是 |
|
| 14楼: | >>参与讨论 |
| 作者: lhfl9518 于 2006-10-13 21:51:40 发布:
原本还有一些没传完呢,太多了 |
|
| 15楼: | >>参与讨论 |
| 作者: AVR_AFA 于 2006-10-13 22:28:37 发布:
哈哈,写的很辛苦看的也很辛苦。 |
|
| 16楼: | >>参与讨论 |
| 作者: 寻觅 于 2006-10-13 22:32:52 发布:
真多阿 |
|
|
|
| 免费注册为维库电子开发网会员,参与电子工程师社区讨论,点此进入 |
Copyright © 1998-2006 www.dzsc.com 浙ICP证030469号 |