Страница 1 из 1

6 канальный АЦП на ATMega8 (подборка информации)

Добавлено: Вс мар 27, 2011 19:17:59
Tom91
Необходимо создать 6 канальный АЦП на ATMega8 для измерения 6ти напряжений в диапазоне 0-20,0V, отображение на LCD. Так как ни разу не работал с АЦП основная проблема в поиске примерных программ на асме... а именно даже как правильно сделать последовательное измерение со всех 6 входов ???

Re: 6 канальный АЦП на ATMega8 (подборка информации)

Добавлено: Вс мар 27, 2011 20:17:46
CS16AMX
возьми файл из си и от туда реж куски , они же в асме при компиляции выходят

Re: 6 канальный АЦП на ATMega8 (подборка информации)

Добавлено: Вс мар 27, 2011 20:25:44
CS16AMX
OUT 0x30,R30
; 750 LcdInit();
RCALL _LcdInit
; 751 // ADC initialization
; 752 // ADC Clock frequency: 1000,000 kHz
; 753 // ADC Voltage Reference: AREF pin
; 754 ADMUX=ADC_VREF_TYPE & 0xff;
LDI R30,LOW(0)
OUT 0x7,R30
; 755 ADCSRA=0x83;
LDI R30,LOW(131)
OUT 0x6,R30
; 756
; 757 // LCD module initialization
; 758
; 759 #asm("sei")
sei
; 760 LcdMode(2);
LDI R30,LOW(2)
ST -Y,R30
RCALL _LcdMode
; 761 while (1)
_0x80:
; 762 {
; 763
; 764
; 765
; 766 ovf=0; //Обнуляем
CLR R8
; 767 TCNT1=0;
LDI R30,LOW(0)
LDI R31,HIGH(0)
OUT 0x2C+1,R31
OUT 0x2C,R30
; 768 TCCR1B=7; //Включаем счетчик с внешним генератором, пин T1
LDI R30,LOW(7)
OUT 0x2E,R30
; 769
; 770 // эти значения нужно подогнать
; 771 delay_ms(999);
LDI R30,LOW(999)
LDI R31,HIGH(999)
RCALL SUBOPT_0x4
; 772 delay_us(162);
__DELAY_USW 324
; 773
; 774
; 775 TCCR1B=0; //Выключаем счетчик
LDI R30,LOW(0)
OUT 0x2E,R30
; 776 freq.ivalue[1]=ovf;
MOVW R26,R28
ADIW R26,2
MOV R30,R8
LDI R31,0
ST X+,R30
ST X,R31
; 777 freq.ivalue[0]=TCNT1;
IN R30,0x2C
IN R31,0x2C+1
ST Y,R30
STD Y+1,R31
; 778 LcdClear();
RCALL _LcdClear
; 779 i=LCD_STRLEN;
LDI R17,LOW(12)
; 780 lcd_buf='0';
RCALL SUBOPT_0x6
RCALL SUBOPT_0x7
LDI R26,LOW(48)
STD Z+0,R26
; 781 while(i>sizeof(txt))
_0x83:
CPI R17,6
BRLO _0x85
; 782 {
; 783
; 784 if (freq.lvalue) lcd_buf=freq.lvalue%10+0x30;
__GETD1S 0
RCALL __CPD10
BREQ _0x86
RCALL SUBOPT_0x6
RCALL SUBOPT_0x7
PUSH R31
PUSH R30
RCALL SUBOPT_0xA
RCALL __MODD21U
__ADDD1N 48
POP R26
POP R27
ST X,R30
; 785 else if(i!=LCD_STRLEN) lcd_buf='';// в место нолика пробел
RJMP _0x87
_0x86:
CPI R17,12
BREQ _0x88
RCALL SUBOPT_0x6
RCALL SUBOPT_0x7
LDI R26,LOW(0)
STD Z+0,R26
; 786 freq.lvalue/=10;
_0x88:
_0x87:
RCALL SUBOPT_0xA
RCALL __DIVD21U
__PUTD1S 0
; 787 i--;
SUBI R17,1
; 788 }
RJMP _0x83
_0x85:
; 789 while(i--)
_0x89:
MOV R30,R17
SUBI R17,1
CPI R30,0
BREQ _0x8B
; 790 {
; 791 lcd_buf[i+1]=txt;// txt[]="част";
RCALL SUBOPT_0x6
MOVW R0,R30
__ADDW1MN _lcd_buf,1
MOVW R26,R30
MOVW R30,R0
SUBI R30,LOW(-_txt*2)
SBCI R31,HIGH(-_txt*2)
LPM R30,Z
ST X,R30
; 792
; 793 }
RJMP _0x89
_0x8B:
; 794 n=read_adc(0); //порты
LDI R30,LOW(0)
RCALL SUBOPT_0xB
MOVW R12,R30
; 795 k=read_adc(1);
RCALL SUBOPT_0x3
RCALL _read_adc
STS _k,R30
STS _k+1,R31
; 796 a=read_adc(2);
LDI R30,LOW(2)
RCALL SUBOPT_0xB
STS _a,R30
STS _a+1,R31
; 797 y=read_adc(3);
LDI R30,LOW(3)
RCALL SUBOPT_0xB
STS _y,R30
STS _y+1,R31
; 798 x=read_adc(4);
LDI R30,LOW(4)
RCALL SUBOPT_0xB
STS _x,R30
STS _x+1,R31
; 799 e=read_adc(5);
LDI R30,LOW(5)
RCALL SUBOPT_0xB
STS _e,R30
STS _e+1,R31
; 800 u=read_adc(7);
LDI R30,LOW(7)
RCALL SUBOPT_0xB
STS _u,R30
STS _u+1,R31
; 801 LcdString(1,1);
RCALL SUBOPT_0x3
RCALL SUBOPT_0x3
RCALL SUBOPT_0xC
; 802
; 803 {sprintf (lcd_buf, "v=%u : %u", k,n); }
LDS R30,_k
LDS R31,_k+1
RCALL SUBOPT_0xD
MOVW R30,R12
RCALL SUBOPT_0xD
RCALL SUBOPT_0xE
; 804 LcdString(1,3);
LDI R30,LOW(3)
ST -Y,R30
RCALL SUBOPT_0xC
; 805 {sprintf (lcd_buf, "v=%u : %u", a,y); }
LDS R30,_a
LDS R31,_a+1
RCALL SUBOPT_0xD
LDS R30,_y
LDS R31,_y+1
RCALL SUBOPT_0xD
RCALL SUBOPT_0xE
; 806 LcdString(1,4);
LDI R30,LOW(4)
ST -Y,R30
RCALL SUBOPT_0xC
; 807 {sprintf (lcd_buf, "v=%u : %u",x,e ); } // область
LDS R30,_x
LDS R31,_x+1
RCALL SUBOPT_0xD
LDS R30,_e
LDS R31,_e+1
RCALL SUBOPT_0xD
RCALL SUBOPT_0xE
; 808 LcdString(1,5);
LDI R30,LOW(5)
ST -Y,R30
RCALL _LcdString
; 809 {sprintf (lcd_buf, " v=%u",u ); } // область
LDI R30,LOW(_lcd_buf)
LDI R31,HIGH(_lcd_buf)
RCALL SUBOPT_0x9
__POINTW1FN _0,10
RCALL SUBOPT_0x9
LDS R30,_u
LDS R31,_u+1
RCALL SUBOPT_0xD
LDI R24,4
RCALL _sprintf
ADIW R28,8
; 810 LcdString(1,6);
RCALL SUBOPT_0x3
LDI R30,LOW(6)
ST -Y,R30
RCALL _LcdString
; 811 LcdUpdate();
RCALL _LcdUpdate
; 812
; 813 }
RJMP _0x80
; 814 }
_0x8C:
RJMP _0x8C
; 815

#ifndef __SLEEP_DEFINED__
#define __SLEEP_DEFINED__
.EQU __se_bit=0x80
.EQU __sm_mask=0x70
.EQU __sm_powerdown=0x20
.EQU __sm_powersave=0x30
.EQU __sm_standby=0x60
.EQU __sm_ext_standby=0x70
.EQU __sm_adc_noise_red=0x10
.SET power_ctrl_reg=mcucr
#endif
_getchar:
sbis usr,rxc
rjmp _getchar
in r30,udr
RET
_putchar:
sbis usr,udre
rjmp _putchar
ld r30,y
out udr,r30
ADIW R28,1
RET
надеюсь найдёш тут что ищеш

Re: 6 канальный АЦП на ATMega8 (подборка информации)

Добавлено: Вс мар 27, 2011 23:05:31
Tom91
CS16AMX, конечно спасибо за ответ, но Ваш код для меня не читаем... :( Интересуют исходники только на асме и поболее комментариев... :)

Re: 6 канальный АЦП на ATMega8 (подборка информации)

Добавлено: Вс мар 27, 2011 23:10:19
CS16AMX
к сожалении в асме дуб , вот и резанул код из компиллера, знаю что некотрые могут из него работать

Re: 6 канальный АЦП на ATMega8 (подборка информации)

Добавлено: Вс мар 27, 2011 23:17:07
Tom91
CS16AMX писал(а):к сожалении в асме дуб , вот и резанул код из компиллера, знаю что некотрые могут из него работать
Самое главное никогда не выкладывай то, в чём сам не разобрался - запутаешь всех остальных... :wink:

Re: 6 канальный АЦП на ATMega8 (подборка информации)

Добавлено: Вс мар 27, 2011 23:23:00
CS16AMX
хуже когда лежит ненужное ,а ктото ето ищет)
типа не себе ,не людям....

Re: 6 канальный АЦП на ATMega8 (подборка информации)

Добавлено: Пн мар 28, 2011 09:05:35
orinoko
Вообще то задача, даже для начинающего программиста , очень несложная. В даташитах на мегу прекрасно написано , как работать с АЦП, и это совсем несложно, а в описании на индикатор замечательно разжёвано, как с ним общаться.
А ведь следующим вопросом наверное будет, как подать 20В на вход АЦП
Вот пример инициализации АЦП на меге16 на асме

Код: Выделить всё

		; отключаем JTAG
		ldi		temp0,	0x80
		out		MCUCSR,	temp0
		; Порт F на ввод (и отключаем подтяжку)
		ldi		temp0,	0
		sts		PORTF,	temp0
		ldi		temp0,	0
		sts		DDRF,	temp0
		;Включим АЦП - делитель на 128
		ldi		temp0,	0b10000111
		out		ADCSRA,	temp0
		; ИОН  - внутренний с внешним конд. на AREF
		ldi		temp0,	0xC0	
		out		ADMUX,	temp0
		;Запустим один раз АЦП
		sbi		ADCSRA,	ADSC
init_adc_wait:
		sbis	ADCSRA,	ADIF
		rjmp	init_adc_wait
И что тут сложного? Если, конечно, почитать даташит неспеша и с пониманием. Да, может не с первого раза что-то заработать, но ведь в этом то и смысл познания. А чтоб не заниматься паянием, можно пока установить и поиграться Протеусом. Вашу задачу он сэмулирует лёгко.
Или вам нужно просто быстро сделать и забыть?

Re: 6 канальный АЦП на ATMega8 (подборка информации)

Добавлено: Вс апр 10, 2011 09:31:11
Tom91
orinoko, спасибо :)

1. Интересует как сделать последовательный опрос 6 каналов, понятно что нужно переключать входы, регистр MUX... я так понимаю при помощи опроса бита ADSC(тоесть как только он сбрасывается переключаем регистр MUX и так по кругу?),
или следует использовать ADIF ?

2. Следует использовать внешний ИОН (на 431 например) ? В чём приимущество по сравнению с внутренним ИОН в Меге8 ?

3. Как осуществить защиту по входу? ....видел ставять ОУ с стабилитронами по входу, в чём приимущество ОУ... только в повышении чувствительности?

Re: 6 канальный АЦП на ATMega8 (подборка информации)

Добавлено: Вс апр 10, 2011 10:53:08
murzila
Может быть, имело смысл написать «Разработайте 6-канальный АЦП, об оплате договоримся»? Если же действительно хотите научиться, обложитесь даташитами, «поставьте на уши» гугл, разберитесь в чужих исходниках.
У многих в детстве тоже не было осциллографов, а также и компьютеров с интернетом, но если было огромное желание, то обходились книгами и журналами... Без обид.

Re: 6 канальный АЦП на ATMega8 (подборка информации)

Добавлено: Вс апр 10, 2011 11:13:22
Fasterpast
Защиту по входу можно сделать обычным стабилитроном на 5В, но есть посложнее и поэффективнее способы.
А с 20В до 5 сбрасывать резистивным делителем.
В принципе, это на самом деле основы основ, ищите.

А преимущество внешнего ИОН перед внутреннем - в точности, разумеется. Конечно, при соблюдении всех условий его подключения...

Re: 6 канальный АЦП на ATMega8 (подборка информации)

Добавлено: Вс апр 10, 2011 16:20:32
Tom91
Fasterpast писал(а):Защиту по входу можно сделать обычным стабилитроном на 5В, но есть посложнее и поэффективнее способы.
И какие же это способы?
Fasterpast писал(а): А преимущество внешнего ИОН перед внутреннем - в точности, разумеется. Конечно, при соблюдении всех условий его подключения...
А привести примеры отражающие на сколько точно? (сравнительно с TL431)

Re: 6 канальный АЦП на ATMega8 (подборка информации)

Добавлено: Вс апр 10, 2011 17:47:41
Fasterpast
Скажите честно, вы даташит на атмегу читали? :) Или легче просто в форумах спросить?
Встроенный ИОН имеет диапазон напряжений от 2.3 до 2.9В, а у того же TL431 погрешность 3мВ паспортная...

Re: 6 канальный АЦП на ATMega8 (подборка информации)

Добавлено: Вс апр 10, 2011 20:01:46
pyzhman
Fasterpast писал(а):Скажите честно, вы даташит на атмегу читали? :) Или легче просто в форумах спросить?
Встроенный ИОН имеет диапазон напряжений от 2.3 до 2.9В, а у того же TL431 погрешность 3мВ паспортная...
Тут же возмущаемся, тут же разжевываем и в рот кладем. Что за подход? Не понимаю... По сути. В книжках Евстифеева все аккуратно написано. Да тупо перевод даташитов. Но все разложено по полкам. В частности по работе с АЦП.