摩尔斯电码闹钟修改

(几乎)在闹钟中轻松应用AT90S2313或ATtiny2313,以将摩尔斯电码中的警报从“哔哔哔哔哔哔哔哔哔哔哔哔...”更改为“唤醒”。 该产品是根据要求设计的,并且每天都在使用

(见文末)
AVR Studio组装来源:morclk041204A
AVR STudio十六进制文件:morclk041204A.hex


总览

扬声器安装在顶部边缘,而AA电池座则粘在背面。 扁平带状电缆用于所有互连。

通过在钟体内安装一个小电路板,并将一些电线连接到时钟的电路板上,从而对廉价的闹钟进行了修改。 背面安装了第二个AA电池,该电压可将微控制器的电压提高到3伏。 当我思考最好的永久位置在哪里时,高阻抗扬声器被临时安装在顶部,就像许多决定由于临时解决而被推迟一样,它仍在等待最终处置。

电路图

该适配器是一个微控制器,具有晶体时钟,输入接口电路和扬声器的AC耦合,该扬声器由控制器的输出引脚直接驱动。 0.22 uf电容器是陶瓷单片电容器。

微控制器大部分时间处于休眠状态,仅消耗微安培,直到接收到中断。并唤醒,然后使用定时循环,在摩尔斯电码中为“唤醒”生成定时。中断会在针脚14和15上提供2 kHz方波,它们彼此异相180度(当一个针脚为高电平时,另一个针脚为低电平),这意味着扬声器看到了接近6伏的方波峰峰值(或3伏RMS,因为它是方波)。与扬声器串联的100 uf电容器可防止其汲取任何直流电。发送“唤醒”消息后,微控制器将返回睡眠状态。

芯片的内部弱上拉电阻将数字输入拉高,以最大程度地降低功耗。扬声器输出配置为输出(我希望这并不奇怪)。

时钟模块由单个1.5伏AA电池供电。为了将电压升至2.7V或更高以运行AT90S2313,我添加了第二个AA电池,该电池仅为AT90S2313供电。

警报信号取自从闹钟模块到时钟扬声器的电线之一。当信号摆动到地时,警报模块中的2N4401吸收足够的电流以将中断引脚拉低。 2N4401基极上的39k电阻将基极电流设置为(1.5V-0.7V)/ 39k = 20微安。接地时,引脚6上的弱上拉电流不足85微安,典型值为30微安,因此基本驱动器绰绰有余。请注意,该晶体管的主要功能是将警报模块的1.5 V峰峰值信号放大为一个从地摆动到微控制器的正电源的信号。 0.22 uf电容器会清除收集器上的信号,以使警报信号进入时收集器变为低电平,并在最后一次蜂鸣后保持低电平约2毫秒。

之所以使用晶体振荡器是因为我有很多AT90S2313,而它们没有内部振荡器。更好的选择将是像运行内部振荡器的ATtiny12一样。虽然可以做得更好,但只要修改固件以确保驱动扬声器的引脚14和15处于相同状态(高,低,作为输入),就可以省去100 uf电容器。没有发出声音或没有发出声音时,至少其中之一被配置为输入。

关于扬声器的注意事项:我使用了一个高阻抗传感器,该传感器是在一家过剩商店购买的。有人告诉我说它是压电的,似乎在欧姆表上测量的大于20兆欧。请小心使用具有足够高阻抗的压电换能器或其他类型的扬声器,以使使用6伏峰峰值信号驱动时流经它的电流不会超过40毫安。如果分流电容不大,则任何高于150 Ohms的直流电都可以满足此要求。

固件

上电复位后,固件会执行通常的内务处理-设置堆栈指针,初始化I / O端口以及设置计时器1,该计时器用于在发送代码时为扬声器产生声音,然后进入睡眠状态并等待闹钟中断。
  1. start:
  2. (HOUSEKEEPING CODE GOES HERE)
  3.         sleep
  4. waithere:
  5.         rjmp        start               
上面的循环是CPU花费其“前台时间”的时间,即其不服务中断的时间。 发生中断时,它将唤醒并处理该中断,然后返回“ rjmp start”指令,在该指令中它再次执行内务处理例程,以确保一切设置正确,然后再返回睡眠状态。

下面是中断服务程序,但有一些额外的注释。
  1. int0service:        ;Alarm has gone off, so wake up
  2.                                         ;The entire housekeeping routine is executed
  3.                                         ;first to make sure everything is properly set up.
  4.         clr        temp
  5.         out        GIMSK,temp                ;Interrupt are disabled.
  6.         out        MCUCR,temp       
  7.        
  8.         clr        flagreg                        ;Clear the firmware flag resister/
  9.                                         ;TIMER 1 SETUP for proper tone pitch.
  10.         ldi        temp,$09                ;Set timer 1 to reset 0000 after compare match. Prescaler = 1X.
  11.         out        TCCR1B,temp
  12.         ldi        temp,intcounthigh        ;Set compare register to establish interrupt frequency.
  13.         out        OCR1AH,temp
  14.         ldi        temp,intcountlow
  15.         out        OCR1AL,temp       
  16.         ldi        temp,$40                ;Enable interrupt on compare match.
  17.         out        TIMSK,temp
  18.        
  19.        
  20.         sbi        PORTB,0
  21.         cbi        PORTB,1
  22.        
  23.         sei                                ;Enable interrupts so that the tone can be output when code is
  24.                                         ;sent.
  25.         ldi        temp,20                        ;Set a variable for 10 words per minute code speed.
  26.         mov        dotlength,temp
  27.         rcall        TypeMessage                ;Send  "WAKE UP" message in Morse Code
  28.         rjmp        start                        ;Go back to start (set up then sleep).
请注意,寄存器和I / O端口有很多冗余初始化。它在处理器首次启动(即安装电池)时完成,然后在警报消失时在每个中断的开始发生,然后在每个中断结束时再次发生。这是为了确保操作的可靠性。过去,我的控制器在遭受高频率,高频噪声的情况下,在没有CPU干预的情况下重新配置了I / O端口。 (我不会提及制造商的名称,以免陷入尴尬。)重新初始化仅需花费几微秒的时间,消耗的功率可忽略不计,特别是与驱动扬声器持续数秒的功率相比,以及可忽略的代码空间,因为该芯片中的大多数闪存均未编程。作为回报,我有点犹豫,如果3美元的闹钟按时发送警报信号,它将被听到并唤醒睡眠者。

发送摩尔斯电码的部分在操作上相当原始,但是依靠巧妙的技巧在内存中格式化摩尔斯电码符号,并且比我自己想出的格式化方法干净得多。我在一个叫David Robinson的人的网页上找到了它,他在1997年2月发行的QST中的一篇文章中赞扬了N1KDO。在该格式中,每个字符都编码为一个字节,其中1代表dah,0代表dit。额外的1被写为一种“停止”位。字符移出,直到寄存器仅包含obooooooo1为止,此时,整个单词都移出了。例如,字母A编码为“ 0b00000110”

这是代码移出时移位寄存器的视图:

“ 0b00000110”发送任何内容之前
“ 0b00000011”发送同义字符并且该字节右移
“ 0b00000001”发送了一个dah,并且字节再次移位。 由于寄存器现在包含“ 0b00000001”,因此操作完成。

最困难的部分是将莫尔斯电码转换为二进制代码并输入。我感谢N1KDO的技术,并感谢David Robinson在其网页上介绍了该技术。

使用上述方法,例程将接受ASCII字符,查找摩尔斯电码字符的格式,然后在格式化的摩尔斯移出时调用点例程,破折号例程或退出。

发送要发送的ASCII字符串的例程直接取自Atmel应用说明AVR108:LPM指令的设置和使用。 可以在Atlems的网站http://www.atmel.com上找到它。 如果您只是在“ DOC1233.PDF”上进行Google搜索,则可以节省浏览Atmel网站的时间。

该例程如下:
  1. TypeMessage:                                ;Type greeting
  2.         push        ZL
  3.         push        ZH
  4.         ldi        ZH,high(2*Message)        ;Load high part of byte address into ZH
  5.         ldi        ZL,low(2*Message)        ;Load low part of byte address into ZL
  6.         rcall        sendromstring                ;Send it
  7.         pop        ZH
  8.         pop        ZL
  9.         ret
  10.        
  11.        
  12.        
  13. Message:
  14.         .db     "WAKE UP "
  15.         .db        $0A,$0D
  16.         .db     $00,$00
可以通过更改引号内的文本来更改消息。附加线路可以用于将字符串延伸到闪速存储器的电容器。只需记住在末尾保留“ .db $ 00,$ 00”,这样TypeMessage例程便知道何时停止。

例程sendromstring:实际上将字符发送出去,以更改为摩尔斯电码并发出提示音。空格被解释为一个字间周期。

施工

所有组件都安装在一小块预先打孔的电路板上,并且用一条带状电缆进行电气连接。

组件采用点对点布线,主要是通过将引线弯向其预定的连接点并进行焊接。放置这些组件是为了使我能够以最小的麻烦连接它们-这意味着尽可能少的绝缘跳线。

在带状电缆的应力点(如穿过闹钟盒中的孔的位置)和弯曲点处使用热缩管,并要格外小心,以防止弯曲的应力离开焊锡芯线的绞合线部分进入他们。


AVR Studio组装来源:morclk041204A
  1. ;Copy and paste into your assemble.
  2. ;Copyright 2004 Richard Cappels, projects@cappels.org
  3. ;Program Name: Send Morse
  4. ;Version morclk041204A Corrected reversed code for the letter "D".
  5. ;Mores code message for alarm clock
  6. ;Pin 20 + 5V.
  7. ;Pin 15 High Z speaker return. Anti-phase of signal on pin 14
  8. ;Pin 14 High Z speaker output. Tone with message.
  9. ;Pin 13 Normally high, goes low during message.
  10. ;Pin 12 Normally low, goes high during message.
  11. ;Pin 10 Ground.
  12. ;Pin 6 - Message starts on negative edge on this pin.
  13. ;Pins 4 and 5 - crystal oscialltor per datasheet.
  14. ;Pin 1 may be grounded to terminate message.
  15. ;Key subroutines:
  16. ; dottime - set of delay loops to set basic dot time. Interacts with interupt routine.
  17. ;The dot time is set by adjusting the value loaded into temp at the start of the routine.
  18. ;Loading 100 into temp gives 1 wpm. Loading 1 into temp gives 100 wmp. Loadign 20 gets 5 wpm.
  19.    
  20. ;sendromstring -send a string from Flash ROM. See TypeGreeting for example of use.
  21. ;sendSerialMorse - sends ASCII Data via serial port and as Morse Code.
  22. ;    ldi    temp,'A'
  23. ;    rcall    sendSerialMorse
  24. ;sendnumberMorseASCII -Sends binary nummber in temp as a 3 digit number via serial port and as Morse Code.   
  25. ;    ldi    temp,123        ;Send the nummber, 123
  26. ;    rcall    sendnumberMorseASCII
  27.       
  28. ;interword - Delays one inter-word delay period   
  29. ;    rcall    interword
  30.    
  31.    
  32. .include "2313def.inc"        ;Include file in same directory as project.
  33. ;03e7
  34.         ;Interrupt timer parameters
  35. .equ    intcountlow    =$E7    ;Low byte of number of clocks between interrupts.
  36. .equ    intcounthigh    =$03    ;High byte of number of clocks between interrupts.
  37.         ;UART baud rate calculation
  38. .equ    clock = 4000000    ;clock frequency
  39. .equ    baudrate = 9600        ;choose a baudrate
  40. .equ    baudconstant = (clock/(16*baudrate))-1
  41. .def    delaycount    = r2    ;Counter for delay generation
  42. .def    dotlength    = r3    ;Number of 1/100 seconds for dot time.
  43. .def    temp        = r16    ;General purpose scratch register.
  44. .def    temp2        = r17    ;General purpose scratch register.
  45. .def    h        = r22    ;Binary to decimal conversion.
  46. .def    t        = r23   ;Binary to decmial conversion.
  47. .def    u        = r24    ;Binary to decimal conversion.
  48. .def    flagreg        = r25    ;Flags.
  49. ;definiton of flagreg bit assignments
  50. ;0    Status of code out bit last sent (memory used to toggle)
  51. ;1    True enables toggling of code output
  52. ;2
  53. ;3
  54. ;4
  55. ;5
  56. ;6
  57. ;7
  58. .equ    codeport     = PORTB
  59. .equ    codeout        = DDRB
  60. .equ    codebit     = 2
  61. .equ    pulsebit    = 3
  62. ;definition of I/O
  63. ;B0    + comparitor input (Reserved)
  64. ;B1    - comparitor input (Reserved)
  65. ;B2    Tone (code) output   
  66. ;B3    Anti-phase of signal on B2.   
  67. ;B4    (not assigned - configure as INPUT with weak pullup)   
  68. ;B5    (not assigned - configure as INPUT with weak pullup)   
  69. ;B6    (not assigned - configure as INPUT with weak pullup)   
  70. ;B7    (not assigned - configure as INPUT with weak pullup)   
  71. ;D0    Reserved FOR UART RECEIVE
  72. ;D1    Reserved FOR UART TRANSMIT -input has weak pullup.
  73. ;D2    (not assigned - configure as INPUT with weak pullup)
  74. ;D3    (not assigned - configure as INPUT with weak pullup)
  75. ;D4    (not assigned - configure as INPUT with weak pullup)
  76. ;D5    (not assigned - configure as INPUT with weak pullup)
  77. ;D6    (not assigned - configure as INPUT with weak pullup)
  78. ;D7    (not assigned - configure as INPUT with weak pullup)
  79. .cseg   
  80. .ORG $0000            ;Initializaton code
  81.     rjmp    start
  82. .ORG $0001
  83.     rjmp    int0service
  84. .ORG $0004
  85.     rjmp    timerservice    ;Timer/counter compare interrupt handler
  86. start:
  87.   
  88.     ldi    r16,RAMEND        ;Initialize Stack Pointer.
  89.     out    spl,r16
  90.                     ;Set PORTD.
  91.     ldi    temp,0b00000000      
  92.     out    DDRD,temp
  93.     ldi    temp,0b10111111
  94.     out    PORTD,temp
  95.    
  96.                     ;Set PORTB.
  97.     ldi    temp,0b00001111      
  98.     out    DDRB,temp
  99.     ldi    temp,0b11110010
  100.     out    PORTB,temp      
  101.    
  102.     ldi    temp,$40
  103.     out    GIMSK,temp
  104.     sei   
  105.     ldi    temp,$38
  106.     out    MCUCR,temp
  107.    
  108.    
  109.     sleep
  110. waithere:
  111.     rjmp    start        ;Added so it would repeat if interrupt repeated.
  112.    
  113.    
  114. int0service:    ;Alarm has gone off, so wake up
  115.    
  116.     clr    temp
  117.     out    GIMSK,temp
  118.     out    MCUCR,temp   
  119.    
  120.     clr    flagreg            ;Clear flagreg (flag register).
  121.                     ;TIMER 1 SETUP.
  122.     ldi    temp,$09        ;Set timer 1 to reset 0000 after compare match. Prescaler = 1X.
  123.     out    TCCR1B,temp
  124.     ldi    temp,intcounthigh    ;Set compare register to establish interrupt frequency.
  125.     out    OCR1AH,temp
  126.     ldi    temp,intcountlow
  127.     out    OCR1AL,temp   
  128.     ldi    temp,$40        ;Enable interrupt on compare match.
  129.     out    TIMSK,temp
  130.    
  131.    
  132.     sbi    PORTB,0
  133.     cbi    PORTB,1
  134.    
  135.     sei                ;Enable interrupts.
  136.     ldi    temp,20            ;Set for 10 words per minute
  137.     mov    dotlength,temp
  138.     rcall    TypeMessage        ;Send  message three times
  139.     rjmp    start            ;added so it would repeat message each time interrupted.
  140.    
  141.     rcall    TypeMessage        ;Send  message three times
  142.     rcall    TypeMessage        ;Send  message three times
  143.     rcall    TypeMessage        ;Send  message three times
  144.     rcall    TypeMessage        ;Send  message three times
  145.     rcall    TypeMessage        ;Send  message three times
  146.     rcall    TypeMessage        ;Send  message three times
  147.     rcall    TypeMessage        ;Send  message three times
  148.     rcall    TypeMessage        ;Send  message three times
  149.     rcall    TypeMessage        ;Send  message three times
  150.     rcall    TypeMessage        ;Send  message three times
  151.     rcall    TypeMessage        ;Send  message three times
  152.     rcall    TypeMessage        ;Send  message three times
  153.     rcall    TypeMessage        ;Send  message three times
  154.     rcall    TypeMessage        ;Send  message three times
  155.     rcall    TypeMessage        ;Send  message three times
  156.     rcall    TypeMessage        ;Send  message three times
  157.     rcall    TypeMessage        ;Send  message three times
  158.     rcall    TypeMessage        ;Send  message three times
  159.     rcall    TypeMessage        ;Send  message three times
  160.     rjmp    start            ;Go back to sleep
  161.    
  162.    
  163. TypeMessage:                ;Type greeting
  164.     push    ZL
  165.     push    ZH
  166.     ldi    ZH,high(2*Message)    ;Load high part of byte address into ZH
  167.     ldi    ZL,low(2*Message)    ;Load low part of byte address into ZL
  168.     rcall    sendromstring        ;Send it
  169.     pop    ZH
  170.     pop    ZL
  171.     ret
  172.    
  173.    
  174.    
  175. Message:
  176.     .db     "WAKE UP " "
  177.     .db    $0A,$0D
  178.     .db     $00,$00
  179. sendromstring:            ;call with location of string in Z.
  180.     push    ZL        ;Save Z on stack.
  181.     push    ZH
  182. srs1:
  183.          lpm            ;Load byte from program memory into r0.
  184.         tst    r0        ;Check if we've reached the end of the message.
  185.         breq    finishsendstering;If so, return.
  186.          mov    temp,r0
  187.     rcall    sendSerialMorse ;Send via serial link and as Morse Code.
  188.          adiw    ZL,1        ;Increment Z registers
  189.          rjmp    srs1
  190. finishsendstering:
  191.     pop    ZH        ;Pop Z from stack.
  192.     pop    ZL
  193.      rcall    interword
  194.          ret
  195. sendcodedcode:    ;Send Coded Morse Code
  196.         ;Shift out morse code from coded character.
  197.         ;Enter with code for character in temp.
  198.    
  199. ;Description of data format from David Robinson's web page:
  200. ;"At this point I was reminded of the N1KDO NHRC-2 repeater controller published
  201. ;in February 97 QST that had Morse ID. Investigation of the assembler listing (1)
  202. ;revealed a simple conversion scheme, where all morse characters are encoded in a
  203. ;single Byte, bitwise, LSB to MSB.; ì0î = dit, ì1î = dah. The Byte is shifted out
  204. ;to the right, until only a ì1î remains. As an example 3 is encoded as binary 00111000,
  205. ;which translates to 38 in hexadecimal. "
  206. morecode:
  207.     cpi    temp,0b00000001
  208.     breq    codedcodesent
  209.     clc
  210.     ror    temp
  211.     brcs    senddash        ;Send a dash if lsb was a one
  212.     rcall    dot            ;Send a dot if lsb was not a one
  213.     rjmp    morecode
  214. senddash:
  215.     rcall    dash
  216.     rjmp    morecode
  217. codedcodesent:                ;Finished sending the coded code.
  218.     ret
  219. SendMorseAscii:    ;Look up coded Morse code and send, followed by rcall to interchar.
  220.         ;Enter with ASCII character in temp. Upper-case, don't process
  221.         ;control characters.
  222.    
  223.     push    ZL
  224.     push    ZH
  225.       
  226.     cpi    temp,$20        ;If space character, do interword delay.
  227.     brne    SMA1
  228.     rcall    interword
  229.     rjmp    lookupdone
  230. SMA1:
  231.     cpi    temp,$5B
  232.     brmi    upperacse   
  233.     andi    temp,$5F        ;Make upper-case
  234. upperacse:
  235.     cpi    temp,$2A   
  236.     brmi    lookupdone
  237.    
  238.                 ;Set up pointer into codechart.
  239.     ldi    ZH,high(2*codechart)    ;Load high part of byte address into ZH.
  240.     ldi    ZL,low(2*codechart)    ;Load low part of byte address into ZL.
  241.     subi    temp,$2A        ;Removed offset from ASCII value in temp.
  242.     add    ZL,temp            ;Add the value to the index.
  243.     clr    temp
  244.     adc    ZH,temp
  245.     lpm            ;Fetch the value from the table.
  246.     mov    temp,r0
  247.     rcall    sendcodedcode        ;Send as Morse Code
  248.     rcall    interchar        ;Dealy one interchar time
  249. lookupdone:
  250.     pop    ZH
  251.     pop    ZL
  252.     ret                ;Return
  253. dot:        ;Send dot, wait one dot time.
  254.     sbr    flagreg,0b00000010    ;Set flag to send tone.
  255.     rcall    dottime
  256.     cbr    flagreg,0b00000010    ;Clear flag to send tone.
  257.     rcall    dottime
  258.     ret
  259.    
  260. dash:        ;Send dash, wait one dot time.
  261.     sbr    flagreg,0b00000010    ;Set flag to send tone.
  262.     rcall    dottime
  263.     rcall    dottime
  264.     rcall    dottime
  265.     cbr    flagreg,0b00000010    ;Clear flag to send tone.
  266.     rcall    dottime
  267.     ret
  268. interchar:    ;Wait interchear period with output off -3 dot times
  269.     rcall    dottime
  270.     rcall    dottime
  271.     rcall    dottime
  272.     ret
  273.    
  274. interword:    ;Wait interword period with output off-6 dot times
  275.     rcall    dottime
  276.     rcall    dottime
  277.     rcall    dottime
  278.     rcall    dottime
  279.     rcall    dottime
  280.     rcall    dottime
  281.     rcall    dottime
  282.     ret
  283. dottime:            ;Delay one dot time.
  284. ;reload values for 100 wmp with 4 MHz Crystal:
  285. ;temp = 1
  286. ;temp2 = 20
  287. ;dealycount = 0 (cleared)
  288. ;With these interrupt reload values:
  289. ;.equ    intcountlow    =$E7
  290. ;.equ    intcounthigh    =$03
  291. ;Using dotlength = 20 (decmimal), dot time is 83.37 milliseconds.
  292. ;Using dotlength = 200 (decimal), dot time is 833.64 milliseconds
  293.     push    temp
  294.     push    temp2
  295.    
  296.     mov    temp,dotlength      ;<= vary this from 1 to 100 to get 100 to 1 wpm. 20 = 5 wpm; 100 = 1
  297. moretime3:   
  298.     clr    delaycount
  299. moretime2:
  300.     ldi    temp2,20
  301. moretime1:
  302.     dec    temp2
  303.     brne    moretime1
  304.     dec    delaycount
  305.     brne    moretime2
  306.     dec    temp
  307.     brne    moretime3
  308.    
  309.     pop    temp2
  310.     pop    temp
  311.     ret
  312.             ;go back
  313. sendSerialMorse:    ;Send ASCII Character via serial port and via Morse Code.
  314.             ;Enter with char in temp.
  315.            
  316.     push    temp
  317.      pop    temp
  318.      rcall    SendMorseAscii
  319.      ret           
  320. codechart:    ;Coded Morse Code look up table. Use ASCII value -$30, so zero = 0, "A" = $11, etc.
  321. ;Note: Some ASCII characters are silent, and are coded as 0b00000001
  322. ;Also note: BT (pause) is coded for ASCII "<" and SK (end of contanct) is coded for ASCII "*",
  323. ;and End of Message is coded for ASCII "+".
  324. ;    * (SK)        + (End of Message)
  325. .db    0b01101000,    0b00101010
  326. ;    ,(comma)    -          .          /
  327. .db    0b01110011,0b1011110,0b01111010,0b00101001
  328. ;    0          1          2          3
  329. .db    0b00111111,0b00111110,0b00111100,0b00111000
  330. ;    4          5          6          7
  331. .db    0b00110000,0b00100000,0b00100001,0b00100011
  332.    
  333. ;    8          9          :          ;
  334. .db    0b00100111,0b00101111,0b01000111,0b01010101
  335.      
  336.    
  337. ;    <  (BT)        =          >          ?
  338. .db    0b000110001,0b00000001,0b00000001,0b01001100
  339.          
  340. ;    @          A          B          C
  341. .db    0b00000001,0b00000110,0b00010001,0b00010101
  342. ;    D          E          F          G
  343. .db    0b00001001,0b00000010,0b00010100,0b00001011
  344.   ;    H          I          J          K
  345. .db    0b00010000,0b00000100,0b00011110,0b00001101
  346.   ;    L          M          N          0
  347. .db    0b00010010,0b00000111,0b00000101,0b00001111
  348.    ;    P          Q          R          S
  349. .db    0b00010110,0b00011011,0b00001010,0b0001000
  350.   
  351.     ;    T          U          V          W
  352. .db    0b00000011,0b00001100,0b00011000,0b00001110
  353.   
  354.     ;    X          Y          Z          [
  355. .db    0b00011001,0b00011101,0b00010011,0b00000001
  356.   
  357.    
  358.          
  359.    
  360. timerservice:    ;Service Timer 1
  361.     push    temp   
  362.     in    temp,sreg
  363.     push    temp
  364.    
  365.    
  366.    
  367.     sbrs    flagreg,1
  368.     rjmp    notoggle
  369.    
  370.         ;Toggle tone output
  371.     sbi    codeout,codebit        ;Enable code output pin.
  372.     mov    temp,flagreg        ;Toggle it, using flagreg 0 as memory of last one.
  373.     andi    temp,0b00000001
  374.     inc    temp
  375.     andi    temp,0b00000001
  376.     brne    codehigh
  377.     cbi    codeport,codebit
  378.     sbi    codeport,pulsebit
  379.     andi    flagreg,0b11111110
  380.     rjmp    toggledone
  381. codehigh:
  382.     sbi    codeport,codebit
  383.     cbi    codeport,pulsebit
  384.     ori    flagreg,0b00000001
  385. toggledone:
  386.     pop    temp
  387.     out    sreg,temp
  388.     pop    temp
  389.     reti            ;Return from interrupt.
  390.    
  391. notoggle:    ;Don't toggle port, but delay to equalize interrupt time toggling and not toggling.
  392.     cbi    codeout,codebit        ;Disable code out pin.
  393.     nop
  394.     nop
  395.     nop
  396.     nop
  397.     nop
  398.     nop
  399.     rjmp    toggledone
  400. .exit
  401. Liability Disclaimer and intellectual property notice
  402. (Summary: No warranties, use these pages at your own risk. You may use the information provided here for personal and educational purposes but you may not republish or use this information for any commercial purpose without explicit permission.) I neither express nor imply any warranty for the quality, fitness for any particular purpose or use,or freedom from patents or other restrictions on the rights of use of any software, firmware, hardware, design, service,information, or advice provided, mentioned,or made reference to in these pages. By utilizing or relying on software, firmware, hardware, design, service,information, or advice provided, mentioned, or made reference to in these pages, the user takes responsibility to assume all risk and associated with said activity and hold Richard Cappels harmless in the event of any loss or expense associated with said activity. The contents of this web site, unless otherwise noted, is copyrighted by Richard Cappels. Use of information presented on this site for personal, nonprofit educational and noncommercial use is encouraged, but unless explicitly stated with respect to particular material, the material itself may not be republished or used directly for commercial purposes. For the purposes of this notice, copying binary data resulting from program files, including assembly source code and object (hex) files into semiconductor memories for personal, nonprofit educational or other noncommercial use is not considered republishing. Entities desiring to use any material published in this pages for commercial purposes should contact the respective copyright holder(s).
AVR STudio十六进制文件:morclk041204A.hex
  1. :020000020000FC
  2. :0400000004C014C064
  3. :10000800B8C00FED0DBF00E001BB0FEB02BB0FE066
  4. :1000180007BB02EF08BB00E40BBF789408E305BFF9
  5. :100028008895EFCF00270BBF05BF992709E00EBDC4
  6. :1000380003E00BBD07EE0ABD00E409BFC09AC198F2
  7. :10004800789404E1302E15D0DCCF13D012D011D023
  8. :1000580010D00FD00ED00DD00CD00BD00AD009D0B4
  9. :1000680008D007D006D005D004D003D002D001D0E4
  10. :10007800C8CFEF93FF93F0E0EAE809D0FF91EF9142
  11. :10008800089557414B45205550200A0D0000EF9325
  12. :10009800FF93C895002021F0002D4ED03196F9CF5E
  13. :1000A800FF91EF9133D00895013039F08894079586
  14. :1000B80010F01CD0F9CF1FD0F7CF0895EF93FF931E
  15. :1000C800003211F423D00FC00B350AF00F750A3235
  16. :1000D80052F0F1E0E8E40A52E00F0027F01FC8955B
  17. :1000E800002DE2DF0FD0FF91EF910895926016D0B6
  18. :1000F8009D7F14D00895926011D010D00FD09D7FAD
  19. :100108000DD008950BD00AD009D0089507D006D095
  20. :1001180005D004D003D002D001D008950F931F93C7
  21. :10012800032D222414E11A95F1F72A94D9F70A9598
  22. :10013800C1F71F910F9108950F930F91BFDF089595
  23. :10014800682A735E7A293F3E3C3830202123272FC6
  24. :1001580047553101014C010611150902140B100411
  25. :100168001E0D1207050F161B0A08030C180E191D81
  26. :1001780013010F930FB70F9391FF11C0BA9A092F6C
  27. :1001880001700395017021F4C298C39A9E7F03C041
  28. :10019800C29AC39891600F910FBF0F911895BA98A2
  29. :0E01A800000000000000000000000000F4CF86
  30. :00000001FF