#include "tn13def.inc" .device ATtiny13 ;******************************************************************** ;* Temperature to Morse Code HF "Transmitter" ;* ;* © 2009 K7TMG ;* Divide routine from Atmel application notes. ;* Version : 1.0 ;* Date : 2009-02-01 ;* Author : Sholto Fisher, K7TMG ;* Target : ATtiny13 @ 4.8MHz + CKDIV8 Set ;******************************************************************** .cseg .org 0x0000 rjmp reset ; reset rjmp ext_int0 ; IRQ0 rjmp pc_int0 ; PCINT0 rjmp tim0_ovf ; Timer0 overflow rjmp ee_rdy ; EEPROM ready rjmp ana_comp ; Analog Comp rjmp tim0_compA ; Timer0 Comp A rjmp tim0_compB ; Timer0 Comp B rjmp watchdog ; Watchdog INT rjmp ad_conv ; ADC conv reset: ldi r16,low(RAMEND) out SPL,r16 init_Ex1: ldi r16,(1<
216? if so must be minus value brlo posTemp ; if not, then jump to positive temps only neg R16 ; take two's complement rcall Morse_Minus ; send Morse "Minus" symbol rcall letter_gap ; wait a little posTemp: ldi R17,100 ; divide by 100 rcall div8u clr r21 cpi R16,0 ; is first value 0? breq Tens ; if so, skip it ldi r21,1 ; set 100s flag to 1 rcall Morse ; send 100's figure rcall letter_gap Tens: mov R16,R15 ; put the div remainder in R16 ldi R17,10 ; and divide by 10 rcall div8u and r21,r16 ; is it a zero and the 100s a zero? brne Ones ; then skip to ones rcall Morse rcall letter_gap Ones: mov R16,R15 ; get remainder rcall Morse rcall letter_gap ret Morse: cpi R16,0 ; test for which numeral breq Morse_0 ; and branch to Morse output cpi R16,1 breq Morse_1 cpi R16,2 breq Morse_2 cpi R16,3 breq Morse_3 cpi R16,4 breq Morse_4 cpi R16,5 breq Morse_5 cpi R16,6 breq Morse_6 cpi R16,7 breq Morse_7 cpi R16,8 breq Morse_8 cpi R16,9 breq Morse_9 ret Morse_0: rcall dah rcall dah rcall dah rcall dah rcall dah ret Morse_1: rcall dit rcall dah rcall dah rcall dah rcall dah ret Morse_2: rcall dit rcall dit rcall dah rcall dah rcall dah ret Morse_3: rcall dit rcall dit rcall dit rcall dah rcall dah ret Morse_4: rcall dit rcall dit rcall dit rcall dit rcall dah ret Morse_5: rcall dit rcall dit rcall dit rcall dit rcall dit ret Morse_6: rcall dah rcall dit rcall dit rcall dit rcall dit ret Morse_7: rcall dah rcall dah rcall dit rcall dit rcall dit ret Morse_8: rcall dah rcall dah rcall dah rcall dit rcall dit ret Morse_9: rcall dah rcall dah rcall dah rcall dah rcall dit ret Morse_F: rcall dit rcall dit rcall dah rcall dit ret Morse_C: rcall dah rcall dit rcall dah rcall dit ret Morse_Minus: rcall dah rcall dit rcall dit rcall dit rcall dit rcall dah ret ee_rdy: reti ana_comp: reti tim0_compA: reti tim0_compB: reti watchdog: reti ad_conv: reti ; short mark, dot or 'dit' (·) ; one unit long ; longer mark, dash or 'dah' ; three units long ; intra-character gap (between the dots and dashes within a character) ; one unit long ; short gap (between letters) ; three units long ; medium gap (between words) ; seven units long dit: sbi PORTB,3 rcall dit_delay cbi PORTB,3 rcall dit_delay ret dah: sbi PORTB,3 rcall dah_delay cbi PORTB,3 rcall dit_delay ret letter_gap: rcall dit_delay rcall dit_delay ret word_gap: push r17 ldi r17,5 word_delay: rcall dit_delay dec r17 brne word_delay pop r17 ret dah_delay: rcall dit_delay rcall dit_delay rcall dit_delay ret dit_delay: push r17 push r18 ldi R17, $A5 ; dit speed around 14 wpm WGLOOP0: ldi R18, $70 WGLOOP1: dec R18 brne WGLOOP1 dec R17 brne WGLOOP0 pop r18 pop r17 ret ;*************************************************************************** ;* ;* "div8u" - 8/8 Bit Unsigned Division ;* ;* This subroutine divides the two register variables "dd8u" (dividend) and ;* "dv8u" (divisor). The result is placed in "dres8u" and the remainder in ;* "drem8u". ;* ;* Number of words :14 ;* Number of cycles :97 ;* Low registers used :1 (drem8u) ;* High registers used :3 (dres8u/dd8u,dv8u,dcnt8u) ;* ;*************************************************************************** ;***** Subroutine Register Variables .def drem8u =r15 ;remainder .def dres8u =r16 ;result .def dd8u =r16 ;dividend .def dv8u =r17 ;divisor .def dcnt8u =r18 ;loop counter ;***** Code div8u: sub r15,r15 ;clear remainder and carry ldi r18,9 ;init loop counter d8u_1: rol r16 ;shift left dividend dec r18 ;decrement counter brne d8u_2 ;if done ret ;return d8u_2: rol r15 ;shift dividend into remainder sub r15,r17 ;remainder = remainder - divisor brcc d8u_3 ;if result negative add r15,r17 ;restore remainder clc ;clear carry to be shifted into result rjmp d8u_1 ;else d8u_3: sec ;set carry to be shifted into result rjmp d8u_1 Celsius: .db -40,-40 .db -39,-39 .db -38,-38 .db -37,-37 .db -36,-36 .db -35,-35 .db -34,-34 .db -33,-33 .db -32,-32 .db -31,-31 .db -30,-30 .db -29,-29 .db -28,-28 .db -27,-27 .db -26,-26 .db -25,-25 .db -24,-24 .db -23,-23 .db -22,-22 .db -21,-21 .db -20,-20 .db -19,-19 .db -19,-18 .db -18,-17 .db -17,-16 .db -16,-15 .db -15,-14 .db -14,-13 .db -13,-12 .db -12,-11 .db -11,-10 .db -10,-9 .db -9,-8 .db -8,-7 .db -7,-6 .db -6,-5 .db -5,-4 .db -4,-3 .db -3,-2 .db -2,-1 .db -1,0 .db 0,1 .db 1,2 .db 2,3 .db 3,3 .db 4,4 .db 5,5 .db 6,6 .db 7,7 .db 8,8 .db 9,9 .db 10,10 .db 11,11 .db 12,12 .db 13,13 .db 14,14 .db 15,15 .db 16,16 .db 17,17 .db 18,18 .db 19,19 .db 20,20 .db 21,21 .db 22,22 .db 23,23 .db 24,24 .db 25,25 .db 25,26 .db 26,27 .db 27,28 .db 28,29 .db 29,30 .db 30,31 .db 31,32 .db 32,33 .db 33,34 .db 34,35 .db 35,36 .db 36,37 .db 37,38 .db 38,39 .db 39,40 .db 40,41 .db 41,42 .db 42,43 .db 43,44 .db 44,45 .db 45,46 .db 46,46 .db 47,47 .db 48,48 .db 49,49 .db 50,50 .db 51,51 .db 52,52 .db 53,0 Fahrenheit: .db -40,-39 .db -38,-37 .db -37,-36 .db -35,-34 .db -33,-32 .db -31,-30 .db -29,-29 .db -28,-27 .db -26,-25 .db -24,-23 .db -22,-22 .db -21,-20 .db -19,-18 .db -17,-16 .db -15,-15 .db -14,-13 .db -12,-11 .db -10,-9 .db -8,-7 .db -7,-6 .db -5,-4 .db -3,-2 .db -1,0 .db 0,1 .db 2,3 .db 4,5 .db 6,7 .db 7,8 .db 9,10 .db 11,12 .db 13,14 .db 15,15 .db 16,17 .db 18,19 .db 20,21 .db 22,22 .db 23,24 .db 25,26 .db 27,28 .db 29,29 .db 30,31 .db 32,33 .db 34,35 .db 36,37 .db 37,38 .db 39,40 .db 41,42 .db 43,44 .db 44,45 .db 46,47 .db 48,49 .db 50,51 .db 51,52 .db 53,54 .db 55,56 .db 57,58 .db 59,59 .db 60,61 .db 62,63 .db 64,65 .db 66,66 .db 67,68 .db 69,70 .db 71,72 .db 73,73 .db 74,75 .db 76,77 .db 78,79 .db 80,81 .db 81,82 .db 83,84 .db 85,86 .db 87,88 .db 88,89 .db 90,91 .db 92,93 .db 94,95 .db 95,96 .db 97,98 .db 99,100 .db 101,102 .db 103,103 .db 104,105 .db 106,107 .db 108,109 .db 110,110 .db 111,112 .db 113,114 .db 115,116 .db 117,117 .db 118,119 .db 120,121 .db 122,123 .db 124,124 .db 125,126 .db 127,0