gavrasm Gerd's AVR assembler version 2.1 (C)2006 by DG4FAC ---------------------------------------------------------- Source file: audiotiny-micthru.asm Hex file: audiotiny-micthru.hex Eeprom file: audiotiny-micthru.eep Compiled: 02.12.2007, 22:01:22 Pass: 2 1: ; 2: ; mic thru to speaker on audiomega 3: ; 4: 5: ;.include "t44def.inc" 6: .device ATtiny44 7: 8: ; 9: ; definitions 10: ; 11: .equ tx = PA1 ; transmit pin 12: .equ tx_pin = PINA 13: .equ tx_port = PORTA 14: .equ tx_ddr = DDRA 15: 16: .equ nloop = 200 ; number of samples between framing 17: ; 18: ; registers 19: ; 20: .def bit_count = R16; bit counter 21: .def temp = R17; temporary storage 22: .def temp1 = R18; temporary storage 23: .def txbyte = R19; data byte 24: .def loop_count = R20 ; loop counter 25: .def sample = R21 ; mic sample 26: 27: ; 28: ; code segment 29: ; 30: .cseg 31: .org 0 32: 000000 C019 rjmp reset 33: ; 34: ; bit delay 35: ; serial bit delay 36: ; 37: ;.equ b = 13 ; 9600 baud (clock /8) 38: ;.equ b = 130 ; 9600 baud (clock /1) 39: .equ b = 8 ; 115200 baud (clock /1) 40: bit_delay: 41: 000001 E018 ldi temp, b 42: bitloop: 43: 000002 951A dec temp 44: 000003 F7F1 brne bitloop 45: 000004 9508 ret 46: ; 47: ; putchar 48: ; assumes no line driver (doesn't invert bits) 49: ; 50: .equ sb = 1; number of stop bits 51: putchar: 52: 000005 E00A ldi bit_count, 9+sb; 1+8+sb 53: 000006 9530 com txbyte; invert everything 54: 000007 9408 sec; set start bit 55: putchar0: 56: 000008 F410 brcc putchar1; if carry set 57: 000009 9AD9 sbi tx_port, tx; send a '0' 58: 00000A C002 rjmp putchar2; else 59: putchar1: 60: 00000B 98D9 cbi tx_port, tx ; send a '1' 61: 00000C 0000 nop ; even out timing 62: putchar2: 63: 00000D DFF3 rcall bit_delay; one bit delay 64: 00000E DFF2 rcall bit_delay 65: 00000F 9536 lsr txbyte; get next bit 66: 000010 950A dec bit_count; if not all bits sent 67: 000011 F7B1 brne putchar0; send next bit 68: 000012 9508 ret; 69: ; 70: ; char_delay 71: ; delay between characters 72: ; 73: char_delay: 74: 000013 EF1F ldi temp, 255 75: char_delay_loop: 76: 000014 E02A ldi temp1, 10 77: char_delay_loop1: 78: 000015 952A dec temp1 79: 000016 F7F1 brne char_delay_loop1 80: 000017 951A dec temp 81: 000018 F7D9 brne char_delay_loop 82: 000019 9508 ret 83: ; 84: ; main program 85: ; 86: reset: 87: ; 88: ; set clock divider to /1 89: ; 90: 00001A E810 ldi temp, (1 << CLKPCE) 91: 00001B E020 ldi temp1, (0 << CLKPS3) | (0 << CLKPS2) | (0 << CLKPS1) | (0 << CLKPS0) 92: 00001C BD16 out CLKPR, temp 93: 00001D BD26 out CLKPR, temp1 94: ; 95: ; set stack pointer to top of RAM 96: ; 97: 00001E E011 ldi temp, high(RAMEND) 98: 00001F BF1E out SPH, temp 99: 000020 E51F ldi temp, low(RAMEND) 100: 000021 BF1D out SPL, temp 101: ; 102: ; set up A/D 103: ; 104: 000022 9A3F sbi ADMUX, REFS1 ; use internal 1.1V reference 105: 000023 983E cbi ADMUX, REFS0 ; 106: 000024 9A3C sbi ADMUX, ADLAR ; left-adjust result 107: 000025 9A3D sbi ADMUX, MUX5 ; Differential, 20x gain on pos: ADC7, neg: ADC3 (111001) 108: 000026 9A3C sbi ADMUX, MUX4 ; 109: 000027 9A3B sbi ADMUX, MUX3 ; 110: 000028 983A cbi ADMUX, MUX2 ; 111: 000029 9839 cbi ADMUX, MUX1 ; 112: 00002A 9A38 sbi ADMUX, MUX0 ; 113: 114: 00002B 98D7 cbi DDRA, PA7 ; input on PA7 (vpos) 115: 00002C 98D3 cbi DDRA, PA3 ; input on PA3 (vneg) 116: 117: 00002D 9A37 sbi ADCSRA, ADEN ; enable A/D 118: 00002E 9835 cbi ADCSRA, ADATE ; disable auto-trigger 119: 00002F 9833 cbi ADCSRA, ADIE ; disable interrupts 120: 000030 9A32 sbi ADCSRA, ADPS2 ; set prescaler for /16 121: 000031 9831 cbi ADCSRA, ADPS1 ; " 122: 000032 9830 cbi ADCSRA, ADPS0 ; " 123: 124: ; 125: ; set up PWM 126: ; 127: 000033 9ABA sbi DDRB, PB2 ; enable OC0B output pin 128: 000034 98C2 cbi PORTB, PB2 129: 000035 E313 ldi temp, ((1 << COM0B0) | (1 << COM0B1) | (1 << WGM01) | (1 << WGM00)) 130: 000036 BF10 out TCCR0A, temp ; set OC0B on compare match and fast PWM mode, 0xFF bottom 131: 000037 E011 ldi temp, ((0 << WGM02) | (0 << CS02) | (0 << CS01) | (1 << CS00)) 132: 000038 BF13 out TCCR0B, temp ; set timer 0 prescalar to 1 133: ; 134: ; init comm pin for output 135: ; 136: 000039 9AD9 sbi tx_port, tx 137: 00003A 9AD1 sbi tx_ddr, tx 138: ; 139: ; main loop 140: ; 141: main_loop: 142: 143: ; 144: ; send framing 145: ; 146: 00003B E031 ldi txbyte, 1 147: 00003C DFC8 rcall putchar 148: 00003D DFD5 rcall char_delay 149: 00003E E032 ldi txbyte, 2 150: 00003F DFC5 rcall putchar 151: 000040 DFD2 rcall char_delay 152: 000041 E033 ldi txbyte, 3 153: 000042 DFC2 rcall putchar 154: 000043 DFCF rcall char_delay 155: 000044 E034 ldi txbyte, 4 156: 000045 DFBF rcall putchar 157: 000046 DFCC rcall char_delay 158: ; 159: ; sample loop 160: ; 161: 000047 EC48 ldi loop_count, nloop 162: sample_loop: 163: ; 164: ; read A/D 165: ; 166: 000048 9A36 sbi ADCSRA, ADSC 167: adloopup: 168: 000049 9936 sbic ADCSRA, ADSC ; loop until complete 169: 00004A CFFE rjmp adloopup 170: ; 171: ; send conversion 172: ; 173: 00004B 9150 lds sample, ADCH ; hi byte - left adjusted. satisfied with 8 bit. 00004C 0005 174: 00004D 2F35 mov txbyte, sample 175: 00004E DFB6 rcall putchar 176: 00004F E030 ldi txbyte, 0 177: 000050 DFB4 rcall putchar 178: 179: 000051 BF5C out OCR0B, sample 180: ; 181: ; loop 182: ; 183: 000052 954A dec loop_count 184: 000053 F7A1 brne sample_loop 185: 000054 CFE6 rjmp main_loop -> Warning 001: 1 symbol(s) defined, but not used! Program : 85 words. Constants : 0 words. Total program memory: 85 words. Eeprom space : 0 bytes. Data segment : 0 bytes. Compilation completed, no errors. Compilation endet 02.12.2007, 22:01:22