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

Применение АЦП в ATtiny13

Добавлено: Ср дек 04, 2013 02:00:02
A_Kholodov
Доброго времени суток котовци! :) Помогите начинающему товарищу разобраться с АЦП. Прошивку кое-как написал, но видимо не то :(
Задача.
1. При включении контроллера необходимо произвести замер напряжения, результат записать в ячейку памяти.
2. На один из выходов порта подать 1.
3. Сделать задержку и произвести ещё один замер напряжения.
4. Сравнить первое значение со вторым и исходя из этого подать некие сигналы на выход.
5. Ждать пока напряжение пропадёт.
6. При появлении напряжения вернуться к пункту 1.

собственно код приведен ниже

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

.include "tn13def.inc"
.list


.def temp = R16     ;Определение рабочих регистров
.def temp1 = R17
.def temp2 = R18
.equ kdel = 255
.equ kdel2 = 1
;                    Начало програмы

.cseg 
.org 0
                  ; Настройка прерываний 
         


RESET:   ldi temp, RAMEND
         out SPL, temp
         

;Настрйка портов В\В
         ldi temp, 3       ; PB0 и PB1 out
         out DDRB, temp	   ;
		 ldi temp, 0	   ; Начальное состоЯние "0" 
         out PORTB,temp

;Инициализация Т/С0
	     ldi temp, 0b00000101      ;Запускаем Т0 
         out TCCR0B, temp          ;с максимальным делителем т.ч.

;Начало оснвной прграммы
         ldi temp, 0b10000101    ;Включение АЦП 
		 out ADCSRA,temp         ;и выбор делителя тактовой частоты
		 ldi temp, 0b00100011    ;Использовать 3й вивод АЦП
         out ADMUX,temp          ;и выравнивать результат по левому краю
         
		 rcall delay     ;Ждем установления напряжения
		 rcall delay
		 rcall delay
		 rcall delay

         sbi ADCSRA, 6
         
         rcall delay2	 ;ждем пока завершится измерение
		 
         in temp1, ADCH  ;сохраняем результат измерения
         sbi PORTB, 0    ;Сделали переполюсовку

		 rcall delay     ;Ждем установления напряжения
		 rcall delay
		 rcall delay
         rcall delay


         sbi ADCSRA, 6       ;теперь можно мерить
		 rcall delay2    ;ждем пока завершится пребр АЦП

         in temp2, ADCH     ;сохраняем результат измерения 2

         cp temp1, temp2     ;сравниваем результаты
         brsh var1        
		 brlo var2
var2:    cbi PORTB, 0  
var1:    sbi PORTB, 1

      ;длинный цикл
vse1: rcall vse
     vse: rcall vse1

	  
;Подпрограмма задержки 
delay:	push temp
		
		ldi	temp, 0
		out	TCNT0, temp

wt1:	in	temp, TCNT0
		cpi	temp, kdel
		brlo	wt1

	    pop	temp
		ret 

		;delay2
;Подпрограмма задержки2 
delay2:	push temp
		
		ldi	temp, 0
		out	TCNT0, temp

wt2:	in	temp, TCNT0
		cpi	temp, kdel2
		brlo	wt2

		pop	temp
		ret 

Re: Применение АЦП в ATtiny13

Добавлено: Ср дек 04, 2013 02:53:37
akl

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

vse1: rcall vse
vse: rcall vse1
Эти команды вызывают срыв стека. Тогда уж так

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

vse1: rcall vse
vse: ret

Или так

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

     ;длинный цикл
VSE:
	RJMP	RESET
;vse1: rcall vse
;vse: rcall vse1

Re: Применение АЦП в ATtiny13

Добавлено: Ср дек 04, 2013 07:56:44
zero648

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

         sbi ADCSRA, 6
         
         rcall delay2    ;ждем пока завершится измерение
       
         in temp1, ADCH  ;сохраняем результат измерения
Это лучше записать так:

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

            sbi     ADCSRA, ADSC      ; ADC Start Convertion
adc_conv_a:
            sbic    ADCSRA, ADSC
            rjmp    adc_conv_a
            in      temp1, ADCH    ; Read the converted value
А здесь получается var1 выполняется в любом случае:

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

         cp temp1, temp2     ;сравниваем результаты
         brsh var1        
       brlo var2
var2:    cbi PORTB, 0  
var1:    sbi PORTB, 1
Нужно сделать так:

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

         cp temp1, temp2     ;сравниваем результаты
         brsh var1        
       brlo var2
var2:    cbi PORTB, 0  
           rjmp  out_var
var1:    sbi PORTB, 1
out_var: