| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Микроконтроллеры (MCU) и микропроцессоры (MPU) > ADC_ATtiny13,ручной пуск |
| Автор: pettimm 19.11.2013, 15:09 |
| Привет всем! Настроил АЦП Изменяю напряжение на ноге ATtiny13 Если не прыгнуть на паузу pausa1s (RCALL pausa1s) после метки "PEREVIRJAEMO_NAPRUGU:" то реагирует на изменение напряжения только после выключения и включения питания как бы одноразово, а когда выполняет прыжок на паузу (RCALL pausa1s), то тогда нормально,крутим переменник и видим что при изменении напряжения светодиод включается и выключается. В чем причина? частота задающего генератора 4,8Мгц/8=600 Кгц Код на асме: ;NASTROJKA ADC\ АЦП ;ldi temp,0b11101010 ; 150 Khz : частота ck= 0.6 KHz/4=150 khz ;out ADCSRA,temp ;;" бит 7 ADEN - (выставляем в 1) - единица включает ADC ноль-отключает ADC ;" бит 6 ADSC- (выставляем в 1) - запустить измерения ;" бит 5 ADATE- (выставляем в 0) - единица включает автоматический старт измерения. ;" бит 4 ADIF- (выставляем в 0) - при включенном прерывании ADC - бит будет выставлятся в единицу ;после завершения конвертации, и возвращатся в 0 после обработки прерывания. При выключеном ;прерывании этот бит нужно сбрасывать "вручную" ;" бит 3 ADIE- (выставляем в 1) - Разрешать прерывание от ADC ;" биты 0-2 ADPS2,ADPS1,ADPS0- управляет временем измерения,Коефициент деления тактовой частоты в идеальных условиях симуляции на результат; не влияет. ;Выбрать нужно такой коефициент деления чтоб частота преобразования была 50-200 Кгц ;000 -2 ;001 -2 ;010 -4 ;011 -8 ;100 -16 ;101 -32 ;110 -64 ;111 -128 ldi temp,0b01100001 out ADMUX,temp ;BIT_6 :: istocnik opornogo naprjagenija 0- Up 1- 1,1v vnutrennij istochnik ;BIT_5:::Но порядок следования битов на левое ориентирование можно сменить ;установив бит ADLAR в регистре ADMUX. Это удобно, если требуется получить 8-битовый результат. ;В таком случае требуется прочитать только регистр ADCH ; BIT_0= 1 ; BIT_1=0 - vubran vhod ADC1 ldi temp,0b00000100 out DIDR0,temp ; Отключение функции цифрового ;входа на ADC1 ;VUBOR ISTOCHNIKA ZAPUSKA PROCTSA PREOBRAZOVANIJA: ldi temp,0b00000000 out ADCSRB,temp ; AVTONOMNUJ REGIM RABOTU=00000000 ;******************************************8 PEREVIRJAEMO_NAPRUGU: RCALL pausa1s ldi temp,0b00000000 ; OBNULJAEMO out ADCSRA,TEMP OUT ADCH,TEMP OUT TCNT0,TEMP ldi temp,0b11000010 out ADCSRA,temp ; 150 Khz : частота ;ck= 0.6 KHz/4=150 khz ; ZAPUCK VRYCHNY CHEKAEMO_KINTSJA_VUMIRU: WDR IN TEMP,ADCSRA SBRS TEMP,ADIF RJMP CHEKAEMO_KINTSJA_VUMIRU IN TEMP,ADCH CPI temp,204; BRSH VUMUKAEMO_SIGNAL; ESLI ROVNO ILI BOLSHE ;BRLO VMUKAEMO_SIGNAL VMUKAEMO_SIGNAL: SBI PORTB,SVITLO RJMP PEREVIRJAEMO_NAPRUGU VUMUKAEMO_SIGNAL: CBI PORTB,SVITLO RJMP PEREVIRJAEMO_NAPRUGU |
| Автор: Romikgy 22.11.2013, 22:22 |
| это не полный код, и почему не писать си? |
| Автор: pettimm 23.11.2013, 12:41 |
| Спасибо за ответ, вот полный код на асме, асм- люблю, си- не знаю : .nolist .include "tn13def.inc" .list ;* ********************************** ; Описание собственных переменных .equ ;Port B .equ KLUCH_vuh =0 ;noga5 vuhid 1 ;.equ *** =1 ;noga6 vhod 0 ;.equ **** =2 ;noga7 vhid 0 ;.equ ** =3 ;noga2 vhod 0 ;.equ ** ;noga3 vhod 0 .equ SVITLO_14_4v_vukl =5 ;noga1 vhod 0 ;.equ ***=6 ; ;* ********************************** ;prusvoennja registram imeni .def TEMP = r16; v pauzah .def TEMP_INTERUPT =R17 ; ;************************************ ;* ************************************** .def TEMP2 = r21 ; v pauzah .def TEMP3 = r24 .def TEMP4 = r25 .def TEMP_zvuk = r22 ;* ********************************** ;Obrabotka prerivanij .cseg .org 0x0000 rjmp start .org 0x0001 rjmp zovni_int0; .org 0x0002 rjmp NEZADIJANI .org 0x0003 rjmp NEZADIJANI .org 0x0004 rjmp NEZADIJANI .org 0x0005 rjmp NEZADIJANI .org 0x0006 rjmp NEZADIJANI .org 0x0007 rjmp NEZADIJANI .org 0x0008 rjmp NEZADIJANI .org 0x0009 rjmp preruv_ADC ;/ /////////////////////////////////// preruv_ADC: reti;0x0009 ;/ //////////////////////////////////// NEZADIJANI: reti ;/ //////////////////////////////////// zovni_int0: reti ;0x0001 ;* ************************* ;* ************************* start: ; ;NASTROJKA_PORTIV: ;конфигурация порта B Ldi temp , 0b00111011 Out DDRB , temp Ldi temp , 0b00011011 Out PORTB , temp ; ************************* ;STEK_NASTROJKA: ;инициализация стека ldi temp,low (RAMEND) out SPL,temp ;* ************************* ;Vkluchenie storogevogo tajmera WATCHDOG_ON: ldi temp,0b00011111 ; 0- 1- 2- 3- 4- out WDTCR,temp;Storogevoj tajmer vkl ;* ********************************************* cli Priznak_reset: ldi TEMP3,3 pr_res1: sbi PORTB,5 Rcall pausa1s cbi PORTB,5 rcall pausa1s dec TEMP3 cpi TEMP3,0 brne pr_res1 ;********************************************** ldi temp,0b01100001 out ADMUX,temp ldi temp,0b00000100 out DIDR0,temp ; Отключение функции цифрового входа на ADC1 ;VUBOR ISTOCHNIKA ZAPUSKA PROCTSA PREOBRAZOVANIJA: ldi temp,0b00000000 out ADCSRB,temp ; AVTONOMNUJ REGIM RABOTU=00000000 ;******************************************8 PEREVIRJAEMO_NAPRUGU: RCALL pausa250Ms;pausa1s ldi temp,0b00000000 ; OBNULJAEMO out ADCSRA,TEMP OUT ADCH,TEMP OUT TCNT0,TEMP ldi temp,0b11000010 out ADCSRA,temp ; 150 Khz : частота ck= 0.6 KHz/4=150 khz ; ZAPUCK VRYCHNY CHEKAEMO_KINTSJA_VUMIRU: WDR IN TEMP,ADCSRA SBRS TEMP,ADIF RJMP CHEKAEMO_KINTSJA_VUMIRU IN TEMP,ADCH CPI temp,204; BRSH VUMUKAEMO_SIGNAL; ESLI ROVNO ILI BOLSHE ; BRLO VMUKAEMO_SIGNAL ;******************************* VMUKAEMO_SIGNAL: SBI PORTB,SVITLO_14_4v_vukl RJMP PEREVIRJAEMO_NAPRUGU VUMUKAEMO_SIGNAL: CBI PORTB,SVITLO_14_4v_vukl RJMP PEREVIRJAEMO_NAPRUGU ;*************************** pausa1s: ldi TEMP,250 p1s: ldi TEMP2,250 p1_1s: WDR dec TEMP2 cpi TEMP2,0 brne p1_1s p2_1s: dec TEMP cpi TEMP,0 brne p1s ret ;********************** pausa250Ms: ldi TEMP,64 p250Ms: ldi TEMP2,130 p250_1s: WDR dec TEMP2 cpi TEMP2,0 brne p250_1s dec TEMP cpi TEMP,0 brne p250Ms ret |
| Автор: Romikgy 25.11.2013, 18:18 |
| есть кнопочка код, что бы понятно было читать ваш код (смотреть буду позже) |
| Автор: Romikgy 25.11.2013, 18:53 | ||
возможно вместо паузы надо прочитать ADCSRA |
| Автор: pettimm 27.11.2013, 14:09 |
| проверил вместо паузы поставил in temp, ADCSRA(ДУМАЮ ДОСТАТОЧНО ЧТО БЫ ПРОЧИТАТЬ?) -- НЕ ПОМОГЛО, А ЕЩЕ ТАКУЮ ПРОВЕРКУ ДЕЛАЛ: В ПАУЗЕ СТАВИЛ ЗНАЧЕНИЕ РЕГИСТРОВ=1 КАК БЫ СДЕЛАТЬ ПАУЗУ МИНИМАЛЬНОЙ ПО ВРЕМЕНИ И ТО ЖЕ ПРИ ЭТОМ НЕ РАБОТАЛО, ТО ЕСТЬ ОНО ХОЧЕТ ПАУЗУ И НЕ МЕНЬШЕ КАКОЙ ТО ДЛИНЫ, НО ЗАЧЕМ? |
| Автор: Romikgy 27.11.2013, 17:29 |
| накидать схему в протеусе можете? |
| Автор: pettimm 27.11.2013, 20:46 |
| к сожалению не работал в протеусе, схема есть в лайоут5 и прошивку заливаю в реальное устройство, а протеус интересно будет освоить, скачаю попробую с ним поиграться |
| Автор: kolobok0 4.12.2013, 23:40 | ||
логику работы с АЦП проговорите просто тупо словами. Пока я вижу такую схему: включение, ожидание, начало цикла работы с ацп, <пауза>, инициализация ацп, ожидание, работа с ацп, конец цикла. Вопрос, Вы наверное в курсе, что для оцифровки аналогового сигнала как и для обратного действия (ЦАП) необходимо время? И наверное Вы в курсе, что необходимо холостое преобразование, после инициализации? Отсюда и влияние вашей паузы в коде. Вообще-то научитесь сразу правильно писать. Загрузка регистров не ноликами единичками, а осмысленными преддефайнами из хедера на данный МК. Пишите в одном стиле. Меткам давайте локаничные но понятные имена. Сразу пишите оптимально(с прерываниями от переферии МК), а не в рукопашную. Старайтесь использовать опыт ранее до Вас накопленный(а то будете постоянно на уровне обезъяны) - в инете примеров куча по работе в том числе и с АЦП. удачи вам (круглый) |
| Автор: pettimm 27.12.2013, 12:32 |
| Спасибо за ответ... но выявил что если не обнулять ADCSRA по метке "ne_obnul", то работает и без паузы по метке "Esli_ne_obnul_to_pauso_no" PEREVIRJAEMO_NAPRUGU: Esli_ne_obnul_to_pauso_no: RCALL pausa250Ms;pausa1s ldi temp,0b00000000 ; OBNULJAEMO out ADCSRA,TEMP ne_obnul: OUT ADCH,TEMP OUT TCNT0,TEMP ldi temp,0b11000010 out ADCSRA,temp ; CHEKAEMO_KINTSJA_VUMIRU: WDR IN TEMP,ADCSRA SBRS TEMP,ADIF RJMP CHEKAEMO_KINTSJA_VUMIRU IN TEMP, ADCH CPI temp,204; BRSH VUMUKAEMO_SIGNAL; ; BRLO VMUKAEMO_SIGNAL А так же этот ефект проявляется при десятибитном режиме если прочитывать неправильно регистры ADCL , ADCH . в таком ком режиме их нужно читать обязательно в порядке, первым ADCL, вторым ADCH. Всем спасибо-все работает. |