打印
[AVR单片机]

用定时器1中断输出方波的汇编框架(适用初学AVR者)

[复制链接]
7185|34
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
宇宙飞船|  楼主 | 2010-7-25 23:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
;MCU is mega16 ,xtal for 8M  
.include  "m16def.inc"
.include  "Reg_Mem_def.inc"
.include  "Constant_def.inc"
;**************************************************************************************************************
;----------------------------------------------
     .ORG 0x00
         
          RJMP  Reset
;*********************MEGA16***********************
      .ORG $002 ;External Interrupt0 Vector Address
        RETI
      .ORG $004 ;External Interrupt1 Vector Address
        RETI
      .ORG $006 ;Output Compare2 Interrupt Vector Address
        RETI
      .ORG $008 ;Overflow2 Interrupt Vector Address
        RETI
      .ORG $00A ;Input Capture1 Interrupt Vector Address
        RETI
      .ORG $00C ;Output Compare1A Interrupt Vector Address
        RETI
      .ORG $00E ;Output Compare1B Interrupt Vector Address
        RETI
      .ORG $010 ;Overflow1 Interrupt Vector Address
        RJMP  Timer_1
      .ORG $012 ;Overflow0 Interrupt Vector Address
        RETI
      .ORG $014 ;SPI Interrupt Vector Address
        RETI
      .ORG $016 ;UART Receive Complete Interrupt Vector Address
        RETI
      .ORG $018 ;UART Data Register Empty Interrupt Vector Address
        RETI
      .ORG $01A ;UART Transmit Complete Interrupt Vector Address
        RETI
      .ORG $01C ;ADC Interrupt Vector Address
        RETI
      .ORG $01E ;EEPROM Interrupt Vector Address
        RETI
      .ORG $020 ;Analog Comparator Interrupt Vector Address
        RETI
      .ORG $022   ;Irq. vector address for Two-Wire Interface
        RETI
      .ORG $024   ;External Interrupt2 Vector Address
        RETI
      .ORG $026   ;Output Compare0 Interrupt Vector Address
        RETI
      .ORG $028   ;Store Program Memory Ready Interrupt Vector Address
        RETI
Timer_1:  
        push   temp
        in     temp,sreg
        push   temp        
     LDI    temp,high(65536-1250);10ms write:
     OUT    TCNT1H,temp          ; first write to H and then L while write to TCNT1.
     LDI    temp,low(65536-1250) ; first read  L and then H while read from TCNT1.
     OUT    TCNT1L,temp   
;------------cpl the pc7 ----------------
        ldi    temp_2,(1<<;PC7)
        in     temp,PORTC
        eor    temp,temp_2
        out    PORTC,temp  
;---------------------------------------------
        pop    temp
  out    sreg, temp
  pop    temp
        RETI                     


;**********************************************************************
Reset:
        LDI  temp,Low(RAMEND)
     OUT  SPL,temp       ;Set stack pointer to last internal RAM location
     LDI  temp,High(RAMEND)
     OUT  SPH,temp
;-------------------------------------------------------
        LDI   temp,0
        OUT   DDRD,temp
     OUT   DDRC,temp
     OUT   DDRB,temp  
        OUT   DDRA,temp  
        OUT   PORTA,temp
        OUT   PORTB,temp
     OUT   PORTC,temp
     OUT   PORTD,temp
;------------------------------
        LDI   temp,(1<<;PC7)  ;enable bit7 of portc to output.
        OUT   DDRC,temp
;-----------------------------
     cli                ;off all interrupt
        RCALL Initialize_Timer1
        RCALL Enable_Timer1_interrupt
        sei
loop_1:
        rjmp   loop_1


;-------------------------------------------      
Initialize_Timer1:
       LDI  temp,CLK_DIV64      ;Timer1 base time for 0.125*64=8us
       OUT  TCCR1B,temp            
       RET

Enable_Timer1_interrupt:
;---------set timer1 to interrupt.----------------------
      
       LDI   temp,0xFF       ;clear the interrupt mark of timer.
       OUT   TIFR,temp
       LDI   temp,0B00000100 ;enable timer1 interrupt
       OUT   TIMSK,temp
;------------------------------------------------
    LDI   temp,high(65536-1250);10ms,write:
    OUT   TCNT1H,temp     ; first write to H and then L while write to TCNT1.
    LDI   temp,low(65536-1250);read:
    OUT   TCNT1L,temp     ;first read  L and then H while read from TCNT1.
       RET

timer_io_m16.rar

5 KB

相关帖子

沙发
hotpower| | 2010-7-26 03:04 | 只看该作者
路过看看有点眼晕~~~
让俺感觉回到了原始社会,至少像是到了秦朝~~~

使用特权

评论回复
板凳
hqgboy| | 2010-7-26 09:23 | 只看该作者
等到了清朝,再过来看看程序。

使用特权

评论回复
地板
电子菜鸟435| | 2010-7-26 09:46 | 只看该作者

使用特权

评论回复
5
宇宙飞船|  楼主 | 2010-7-26 11:26 | 只看该作者
俺将陆续整理出以下两个子程序,
1。算法中必需掌握的flash查表技术。
2。二进制转十进制的子程序以及其算法,这是所有类型单片机作数字显示都必需用到的技术,有了这项技术,就不必再依赖C编译器。从而可以设计出一个电子钟来。

使用特权

评论回复
6
xuyiyi| | 2010-7-26 11:31 | 只看该作者
呵呵!
飞船大师e文真好,全部用e文解释,俺初中生看不懂,何时飞船大师有空,请用咱们老祖宗的文字写一遍解释。

使用特权

评论回复
7
宇宙飞船|  楼主 | 2010-7-26 11:38 | 只看该作者
因赶时间整理,来不及用中文注解,等俺有空了,再用中文重新注译一次。

使用特权

评论回复
8
xuyiyi| | 2010-7-26 12:30 | 只看该作者
谢谢飞船大师。

使用特权

评论回复
9
康康同学| | 2010-7-26 16:15 | 只看该作者
楼主从汇编开始讲解,看着让人生畏。另外,贴出的程序有些字符显示成表情了。

使用特权

评论回复
10
粉丝| | 2010-7-28 13:50 | 只看该作者
5楼真把那两个子程序放出来,那用C的肯定两腿发软,更不用说用C++的。。。。

使用特权

评论回复
11
宇宙飞船|  楼主 | 2010-7-28 14:44 | 只看该作者
AVR的竟争对手实在是大多了,那些竟争对手的销售都是上纲上线的,飞船这几天正忙着出招反击那些阴谋家,把整理资料的一些精力浪费在版面整顿上了。

使用特权

评论回复
12
hotpower| | 2010-7-29 07:47 | 只看该作者
AVR从汇编开始本身就是败笔~~~

使用特权

评论回复
13
xuyiyi| | 2010-7-29 12:30 | 只看该作者
:'(

俺学AVR就是从汇编开始的,那时只有90S1200,  一片90S1200要20多块大洋,  那时AVR还没有C语言,不用汇编那只能直接打机器码了。:dizzy:

俺早期用Z80, MCS48时打过机器码,挺累的,挺辛苦的,千辛万苦的输入一小段程序调通后感到异常的兴奋,那种感觉真的很奇妙,象吸了白粉似的。;P

使用特权

评论回复
14
宇宙飞船|  楼主 | 2010-7-30 12:24 | 只看该作者
真是多灾多难,昨天深夜想倒点汇编资料出来,一开工作的主机,竟发出啪啪声,接着闻到一股元件烧焦的味道。今天一早,拆开长城ATX2800电源一看,竟是PCB阻焊剂出现不稳定,造成PCB漏电,线间打火,击穿第一重的开关管,好在这电源有双重保护,估计硬盘应该不会出事。
这段期间连续出现两件巧合的事件,一件是在DIY坛子,本想直击报道DIY的全过程,但那进口的示波器竟突然**,检查发现同样是PCB漏电造成打火。有时,飞船也在想,是不是机缘未到,老天给出的指示。
还是大家用C的意念力实在是太强,以至于会造成有此巧合的结果。

使用特权

评论回复
15
hotpower| | 2010-7-31 01:13 | 只看该作者
汇编最大的确定就是变量难于驾驭~~~
51的汇编还好些,其他的都晕~~~

使用特权

评论回复
16
hotpower| | 2010-7-31 09:11 | 只看该作者
5楼课题应该是c/c++的长项而非汇编之优势。
现在是注重编程效率而非程序效率的年代。
汇编已是昔日黄花,满地芳香早已飘散…
大容量、高速度以及编译技术的提高和发展,c/c++必将全面取代汇编。
试问在pc初期有几个没用过汇编?当今有几个在pc端还用汇编???

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
xuyiyi + 1
17
xuyiyi| | 2010-7-31 10:12 | 只看该作者
HOT大叔正解!
年代不同啦!
时代也不同啦!

使用特权

评论回复
18
hotpower| | 2010-8-1 02:33 | 只看该作者
不管AVR是否没落,但技术层面上要有追求。

俺散布C++可谓“谬论和退化”,但汇编就能达到境界了吗???

假若AVR真的消亡,AVR专用的汇编能转行再入“境界”???能否???

这个AVR事件已经给人们带来最好的思索~~~

使用特权

评论回复
19
aweyfan| | 2010-8-1 20:53 | 只看该作者
把avr的定时器当51用,可以说是很烂的做法了

随便再跑点别的程序,输出的方波频率可能就不稳了

使用特权

评论回复
20
xwj| | 2010-8-1 21:01 | 只看该作者
赞同楼上,偶顶~~~

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:技术是玩出来的!

75

主题

1664

帖子

4

粉丝