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