gavrasm Gerd's AVR assembler version 2.1 (C)2006 by DG4FAC ---------------------------------------------------------- Source file: audio-io.micthru.asm Hex file: audio-io.micthru.hex Eeprom file: audio-io.micthru.eep Compiled: 09.12.2007, 12:52:30 Pass: 2 1: ; 2: ; hello.mic.45.asm 3: ; 4: ; microphone hello-world program 5: ; 6: ; Neil Gershenfeld 7: ; CBA MIT 10/28/07 8: ; 9: ; (c) Massachusetts Institute of Technology 2007 10: ; Permission granted for experimental and personal use; 11: ; license for commercial sale available from MIT. 12: ; 13: 14: .include "tn45def.inc" -> Warning 009: Include defs not necessary, using internal values! File: audio-io.micthru.asm, Line: 14 Source line: .include "tn45def.inc" 15: ; 16: ; definitions 17: ; 18: .equ rx_pin = PB1; transmit pin 19: .equ tx_pin = PB2; 20: .equ nloop = 200 ; number of samples between framing 21: ; 22: ; registers 23: ; 24: .def bit_count = R16; bit counter 25: .def temp = R17; temporary storage 26: .def temp1 = R18; temporary storage 27: .def txbyte = R19; data byte 28: .def rxbyte = R20; 29: .def loop_count = R21 ; loop counter 30: ; 31: ; code segment 32: ; 33: .cseg 34: .org 0 35: 000000 C027 rjmp reset 36: ; 37: ; bit delay 38: ; serial bit delay 39: ; 40: ;.equ b = 13 ; 9600 baud (clock /8) 41: ;.equ b = 130 ; 9600 baud (clock /1) 42: .equ b = 8 ; 115200 baud (clock /1) 43: bit_delay: 44: 000001 E018 ldi temp, b 45: bitloop: 46: 000002 951A dec temp 47: 000003 F7F1 brne bitloop 48: 000004 9508 ret 49: ; 50: ; putchar 51: ; assumes no line driver (doesn't invert bits) 52: ; 53: .equ sb = 1; number of stop bits 54: putchar: 55: 000005 E00A ldi bit_count, 9+sb; 1+8+sb 56: 000006 9530 com txbyte; invert everything 57: 000007 9408 sec; set start bit 58: putchar0: 59: 000008 F410 brcc putchar1; if carry set 60: 000009 9AC2 sbi PORTB, tx_pin; send a '0' 61: 00000A C002 rjmp putchar2; else 62: putchar1: 63: 00000B 98C2 cbi PORTB, tx_pin ; send a '1' 64: 00000C 0000 nop ; even out timing 65: putchar2: 66: 00000D DFF3 rcall bit_delay; one bit delay 67: 00000E DFF2 rcall bit_delay 68: 00000F 9536 lsr txbyte; get next bit 69: 000010 950A dec bit_count; if not all bits sent 70: 000011 F7B1 brne putchar0; send next bit 71: 000012 9508 ret; 72: ; 73: ; getchar 74: ; assumes no line driver (doesn't invert bits) 75: ; 76: getchar: 77: 000013 E009 ldi bit_count,9 ; 8 data bit + 1 stop bit 78: getchar1: 79: 000014 9BB1 sbis PINB, rx_pin ; wait for start bit 80: 000015 CFFE rjmp getchar1 81: 000016 DFEA rcall bit_delay ; 0.5 bit delay 82: getchar2: 83: 000017 DFE9 rcall bit_delay ; 1 bit delay 84: 000018 DFE8 rcall bit_delay ; 85: 000019 9488 clc ; clear carry 86: 00001A 9BB1 sbis PINB, rx_pin ; if RX pin high skip 87: 00001B 9408 sec ; otherwise set carry 88: 00001C 950A dec bit_count 89: 00001D F011 breq getchar3 ; return if all bits read 90: 00001E 9547 ror rxbyte ; otherwise shift bit into receive byte 91: 00001F CFF7 rjmp getchar2 ; go get next bit 92: getchar3: 93: 000020 9508 ret 94: 95: ; 96: ; char_delay 97: ; delay between characters 98: ; 99: char_delay: 100: 000021 EF1F ldi temp, 255 101: char_delay_loop: 102: 000022 E02A ldi temp1, 10 103: char_delay_loop1: 104: 000023 952A dec temp1 105: 000024 F7F1 brne char_delay_loop1 106: 000025 951A dec temp 107: 000026 F7D9 brne char_delay_loop 108: 000027 9508 ret 109: ; 110: ; main program 111: ; 112: reset: 113: ; 114: ; set clock divider to /1 115: ; 116: 000028 E810 ldi temp, (1 << CLKPCE) 117: 000029 E020 ldi temp1, (0 << CLKPS3) | (0 << CLKPS2) | (0 << CLKPS1) | (0 << CLKPS0) 118: 00002A BD16 out CLKPR, temp 119: 00002B BD26 out CLKPR, temp1 120: ; 121: ; set stack pointer to top of RAM 122: ; 123: 00002C E011 ldi temp, high(RAMEND) 124: 00002D BF1E out SPH, temp 125: 00002E E51F ldi temp, low(RAMEND) 126: 00002F BF1D out SPL, temp 127: ; 128: ; init comm pin for output 129: ; 130: 000030 9AC2 sbi PORTB, tx_pin 131: 000031 9ABA sbi DDRB, tx_pin 132: ; 133: ; set up A/D 134: ; 135: 000032 9A3C sbi ADMUX, REFS2 ; use 2.56V reference 136: 000033 9A3F sbi ADMUX, REFS1 ; " 137: 000034 983E cbi ADMUX, REFS0 ; " 138: 000035 983B cbi ADMUX, MUX3 ; 20x differential input on ADC2,3 139: 000036 9A3A sbi ADMUX, MUX2 ; 140: 000037 9A39 sbi ADMUX, MUX1 ; 141: 000038 9A38 sbi ADMUX, MUX0 ; 142: 000039 9A3D sbi ADMUX, ADLAR ; left-adjust result 143: 00003A 9A37 sbi ADCSRA, ADEN ; enable A/D 144: 00003B 9835 cbi ADCSRA, ADATE ; disable auto-trigger 145: 00003C 9A32 sbi ADCSRA, ADPS2 ; set prescaler for /16 146: 00003D 9831 cbi ADCSRA, ADPS1 ; " 147: 00003E 9830 cbi ADCSRA, ADPS0 ; " 148: ; 149: ; PWM 150: ; 151: 00003F E21A ldi temp, TCCR0A 152: 000040 E323 ldi temp1, TCCR0B 153: 000041 7F27 cbr temp1, (1 << WGM02) ; set OC0A on fast PWM, 0xFF Bottom 154: 000042 6012 sbr temp, (1 << WGM01) ; " 155: 000043 6011 sbr temp, (1 << WGM00) ; " 156: 157: 000044 6810 sbr temp, (1 << COM0A1) ; set OC0A on compare match, inverting mode 158: 000045 6410 sbr temp, (1 << COM0A0) ; " 159: 000046 7D1F cbr temp, (1 << COM0B1) ; disable OC0B PWM 160: 000047 7E1F cbr temp, (1 << COM0B0) ; " 161: 162: 000048 7F2B cbr temp1, (1 << CS02) ; set timer 0 prescaler to 1 163: 000049 7F2D cbr temp1, (1 << CS01) ; " 164: 00004A 6021 sbr temp1, (1 << CS00) ; " 165: 00004B BD1A out TCCR0A, temp 166: 00004C BF23 out TCCR0B, temp1 167: 00004D 9AB8 sbi DDRB, PB0 ; enable OC0A output pin 168: ; 169: ; main loop 170: ; 171: main_loop: 172: ; 173: ; read A/D 174: ; 175: 00004E 9A36 sbi ADCSRA, ADSC ; start conversion 176: 00004F DFB5 rcall putchar 177: adloopup: 178: 000050 9936 sbic ADCSRA, ADSC ; loop until complete 179: 000051 CFFE rjmp adloopup 180: ; 181: ; send conversion 182: ; 183: 000052 B135 in txbyte, ADCH 184: 000053 BD39 out OCR0A, txbyte 185: 000054 CFF9 rjmp main_loop -> Warning 001: 4 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 09.12.2007, 12:52:30